From 8b7035770309df741f0138665af9701bfe532a94 Mon Sep 17 00:00:00 2001 From: Quick <31828688+Quick104@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:18:35 -0400 Subject: [PATCH] feat(ebooks): first-class ebook libraries, scanner, and reader (#124) * docs: define ebook architecture matching audiobooks * docs: plan ebook audiobook-parity implementation * feat: add ebook scanner parser foundation * fix: harden ebook scanner foundation * fix: handle ebook isbn labels * fix: guard ebook subtree scans * feat: scan ebook libraries in core * fix: preserve ebook scan people credits * fix: refresh ebook scan metadata safely * feat: persist ebook series membership * test: cover ebook series persistence decisions * fix: address ebook scanner PR review * docs: clarify ebook foundation PR scope * feat: add ebook metadata enricher * fix: harden ebook poster cache * feat: wire ebook metadata sync task * feat: expose ebook library metadata setup * feat: add ebook catalog scope support * feat: add ebook detail view * feat: label ebook file versions by format * feat: use file-size copy for downloads * feat: use file language in download dialog * test: cover ebook detail authors and downloads * fix: drop narrator credits from ebook scanner merges * fix: align ebook collection filters with book media * fix: drop asin provider ids from ebook enrichment * fix: force ebook people refresh for stale narrators * chore: omit ebook planning docs from branch * feat: add ebook detail related content * feat: add ebook reader file entrypoint * feat: render ebooks with foliate reader * feat: persist ebook reader progress * feat: add ebook reader controls * feat: extract ebook pdf metadata * feat: favor scanner isbn during ebook enrichment * feat: extract fbz ebook metadata * feat: count cbz ebook pages * feat: show ebook file page counts * feat: show ebook download summaries * feat: switch ebook reader files * feat: prefer epub for ebook read action * feat: surface ebook reader progress * feat: sync ebook reader progress cache * feat: hide ebook read action for unsupported files * feat: filter ebook reader file selector * fix: serve fbz ebook archives with reader mime type * fix: detect fbz ebooks from compound filename * fix: authorize fbz ebooks from compound filename * fix: scope ebook catalog facets * fix: reject narrator queries for ebooks * fix: build ebook recommendation text from authors * fix: include ebooks in embedding eligibility * fix: include ebooks in recommendation media mix * fix: include ebooks in recently added recommendations * feat: include ebook progress in recommendation signals * feat: include ebooks in continue watching sections * feat: include ebooks in catalog progress metrics * fix: read ebook isbn from epub metadata * fix: filter ebook asin provider aliases * fix: fall back from unsupported ebook reader files * fix: sort ebook catalogs by reader progress * fix: filter ebook catalogs by reader progress * fix: include ebooks in last watched catalog filters * feat: reflect ebook reader progress in item user state * feat: share ebook progress state across item surfaces * feat: report ebook scan progress * fix: include ebook activity in recommendations * fix: expose ebook reader progress on item detail * fix: support ebook subtree scans * fix: honor profile header for ebook item progress * fix: add ebook library default sections * fix: route ebook continue cards to reader * fix: hide watched toggle for ebooks * fix: route ebook watch tonight cards to reader * fix: route ebook hero actions to reader * fix: detect archive ebook reader formats by filename * feat: cache embedded ebook covers during scan * fix: encode ebook hero reader links * fix: persist non-epub ebook reader progress * fix: scope narrator catalog badges to audiobooks * fix: merge ebook reader progress during item repair * fix: label ebook progress filters as read * fix: show ebook related rails as book covers * fix: remove txt ebook reader support * fix: reject txt ebook reader files * fix: label ebook advanced filters as read * fix: label ebook personalized sorts as read * fix: remove plain text reader loader path * test: cover ebook unread catalog rules * fix: preserve ebook reader library context * fix: link ebook genres with library scope * fix: encode related rail item links * fix: encode catalog card item links * fix: encode hero and continue item links * fix: encode watch tonight item links * fix: encode recommendation and search item links * test: cover ebook scan format set * fix: label ebook search results clearly * fix: make global search prompt media neutral * fix: encode catalog read API ids * fix: encode item API ids * fix: include ebook reader vendor in docker build * fix: make ebook reader build clean * fix: clean ebook embedded descriptions * docs: plan ebook reader shell parity * feat: add ebook reader shell controls * fix: widen ebook scrolled reader flow * fix: remove scrolled reader content width cap * docs: plan ebook reader full parity * feat: persist ebook reader config * feat: add ebook annotations and bookmarks * feat: add ebook reader tools and aids * feat: add ebook advanced reader settings * fix: keep ebook reader panel in viewport * fix: use foliate sizing units for ebook scroll flow * fix: keep ebook settings controls readable * fix: simplify ebook reader settings controls * feat(ebooks): extract local covers during scan (#98) * feat(ebooks): extract local covers during scan * fix(ebooks): read nullable poster paths during cover scan * fix(catalog): coalesce nullable media artwork fields * fix(ebooks): group sibling formats by book identity * fix(ebooks): tolerate legacy ebook metadata encodings * fix(ebooks): decode PDF hex metadata strings * fix(ebooks): harden local cover extraction and format grouping Address review findings on the local cover scan: - Restrict generic sidecar covers (cover.jpg, folder.png, ...) to single-book directories, always accept images named after the book file, and apply exactly one cover per reconcile with sidecar taking precedence over the embedded cover. - Replace the read-then-write poster update with an atomic conditional UPDATE (ItemRepository.SetLocalPoster) so provider/admin artwork is never clobbered by concurrent writers, and refresh locally owned posters when the extracted cover bytes change (thumbhash compare). - Preserve UTF-8 PDF Info strings (including a UTF-8 BOM) instead of forcing everything through Windows-1252; the cp1252 fallback now only applies to non-UTF-8 bytes. - Select EPUB covers by manifest media-type with properties="cover-image" outranking the EPUB2 meta name="cover" id, so XHTML cover pages no longer shadow the real image. - Order CBZ pages naturally (2.jpg before 10.jpg, ch2/ before ch10/) when picking the cover page, via a single O(n) min-scan. - Bump the ebook content group key scheme to version 2 and reprocess rows written under older versions so pre-existing libraries gain sibling-format grouping instead of accumulating duplicates. - Group different formats only (a same-format sibling with colliding sparse metadata stays a separate item) and stop a joining sibling's embedded metadata from overwriting a provider-matched item. - Decode any IANA-labelled OPF/FB2 XML charset (windows-1251, koi8-r, shift_jis, ...) via x/net/html/charset, and wire the charset reader into FB2 parsing which previously had none. - Strip the full .fb2.zip double extension from filename-derived titles and group keys. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: rxwatcher Co-authored-by: Quick <31828688+Quick104@users.noreply.github.com> Co-authored-by: Claude Fable 5 * feat(ebooks): add reader profiles and ruler (#99) * feat(ebooks): extract local covers during scan * fix(ebooks): read nullable poster paths during cover scan * fix(catalog): coalesce nullable media artwork fields * fix(ebooks): group sibling formats by book identity * fix(ebooks): tolerate legacy ebook metadata encodings * fix(ebooks): decode PDF hex metadata strings * feat(ebooks): add reader profiles and ruler * fix(ebooks): address reader ruler and profile review findings - skip renderer setStyles/render when computed styles and attributes are unchanged, so ruler position updates no longer re-style the book view - drag the ruler via a local draft that commits on release, with the surface rect cached at pointer-down - migrate font values persisted before the generic stacks (Inter, Georgia, Merriweather, legacy serif) so the font select never renders blank, with a Custom fallback option for unknown values - make the ruler band click-through and move dragging to a dedicated keyboard-accessible slider handle so links and text selection keep working under the band - share font stacks between options and profiles via READER_FONT_STACKS - surface the active reading profile, move presets to the top of the settings panel, and drop the redundant profile button aria-labels Co-Authored-By: Claude Fable 5 * fix(ebooks): resolve prefer-const lint error in readest document lib `pnpm run lint` failed on the branch because `direction` is never reassigned in getDirection; split the destructure so only the reassigned `writingMode` stays mutable. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: rxwatcher Co-authored-by: Quick <31828688+Quick104@users.noreply.github.com> Co-authored-by: Claude Fable 5 * Merge branch 'main' into work/ebooks-reader-base Brings the ebook integration branch up to date with main (audiobook library redesign, continue-watching rework and card affordances, quic-go bump, jellycompat fixes). Conflict resolutions favor main's generalized mechanisms and register ebooks with them: - media scope validation goes through IsValidMediaScope (now including "ebook" alongside main's "video" group scope), in Go and in the web filter/search types - continue-watching uses main's typed rails; reading-type sections pull resume points from ebook_reader_progress and the ebook library default section is wired to ContinueTypeConfig(ContinueTypeReading) - item_repo keeps main's derived select-list machinery (itemColumnExpr) and both poster accessors (GetPoster/SetLocalPoster for ebook covers, GetPosterPath for audiobook covers) - web cards/hero/watch-tonight adopt main's buildMediaPlayHref helpers, which now route ebooks to /reader/ebook and encode content ids; ebook affordances (BookOpen icon, Read verb, percent-read subtitle) carry over onto main's reworked components - LibraryForm ebook support ported into main's refactored useLibraryForm/libraryTypes modules Co-Authored-By: Claude Fable 5 * fix(docker): copy foliate-js vendor into Dockerfile.dev frontend stage foliate-js is a file:vendor/foliate-js dependency, so pnpm install needs the vendor directory before the lockfile install layer. The production Dockerfile already copies it; the dev image was missed, breaking make dev-deploy with ENOENT on /app/web/vendor/foliate-js. Co-Authored-By: Claude Fable 5 * feat(ebooks): render Continue Reading sections as upright poster cards All-ebook continue sections previously fell through to the horizontal 16:9 wide card; include ebooks in the poster-variant check so book covers render in their natural 2:3 framing. Co-Authored-By: Claude Fable 5 * fix(ui): stop related-rail highlight ring clipping on detail pages Move the current-item ring onto the cover artwork with a themed ring-offset color (matching the sidebar profile highlight) and give the scroll container top headroom so the ring is not cut off by overflow-x-auto. Applies to both ebook and audiobook detail rails. Co-Authored-By: Claude Fable 5 * fix(scanner): harden ebook scanning against data loss and bad metadata - Reconcile missing ebook files like video/audio, with real per-root walk failure tracking (failed/unmounted roots are excluded from deletion), symlinked-root support via the shared logical walker, and the empty-root cleanup allowance before any destructive reconciliation. - Create ebook items as 'pending' so enrichment can promote them to 'matched' (backfill migration included), and protect matched items from re-scan clobbering: title/year skipped, people/series fill-empty only. - PDF metadata: scan head + tail windows (non-linearized PDFs keep the Info dict at the end), require proper key delimiters, head values win. - Cap plain .fb2 reads like .fbz entries; drop .md as an ebook format. - gofmt internal/scanner/audiobook.go (pre-existing drift). Co-Authored-By: Claude Fable 5 * fix(ebooks): make enrichment failures non-terminal with dedicated backoff state - Provider errors now record a failure (capped retries) instead of stamping last_refreshed, which permanently excluded items after transient outages. - Unconfigured metadata chains and the scan-window membership race skip the item without stamping or burning a retry. - Failure tracking moves to a new ebook_enrichment_state table, decoupling it from media_items.refresh_failures (shared with metadata refresh debt). - Preserve non-author people credits when persisting enrichment results. Co-Authored-By: Claude Fable 5 * fix(catalog): gate ebook progress on hidden history and centralize threshold - Apply user_history_hidden_items gating (video semantics) to the ebook watched/in-progress filters, progress sort plan, and Continue Reading. - Continue Reading pages past dismissed items via the shared collector and dedupes items across pages (also fixes the video path's latent exposure). - Centralize the 0.9 finished threshold as models.EbookFinishedProgressThreshold with a single SQL-interpolated mirror in catalog. Co-Authored-By: Claude Fable 5 * fix(recommendations): correct watcher counting and wire ebook taste signals - itemWatchersQuery dedupes to distinct (watcher, item) rows so one binge-watcher can no longer satisfy minWatchers; the eligibility floor now counts distinct accounts rather than profiles. - Hidden-history gating on GetEbookReaderProgressForUser (signal reader). - Ebook reading produces canonical implicit taste signals (weighted like the equivalent movie progress ratio); ebooks join taste-seed candidates. - Stale GetRecentlyAddedItems doc comment corrected. Co-Authored-By: Claude Fable 5 * fix(api): harden ebook reader endpoints and serve a Content-Security-Policy - Serve a CSP on all SPA HTML responses: blob/srcdoc book iframes inherit it, so script-src 'self' 'wasm-unsafe-eval' blocks script execution from malicious book content (sandbox alone is defeated by the WebKit allow-scripts requirement). Threat model documented on the constant. - X-Content-Type-Options: nosniff on frontend, jellycompat, and ebook file responses; MIME resolution can no longer fall through to octet-stream for an admitted ebook file. - Annotation PATCH: presence-aware field semantics (absent keeps, present sets/clears), invariant re-validation on the merged row, and an atomic SELECT ... FOR UPDATE read-merge-write. - Request size caps (413) on progress/config/annotation writes; Content-Disposition via mime.FormatMediaType; hidden-history gating in the shared ebook progress lister; FK-cascade indexes for reader tables. Co-Authored-By: Claude Fable 5 * feat(api): native read-state endpoints for ebooks - POST/DELETE /watched/{id} accepts ebook content IDs: mark read upserts progress 1.0 preserving the reader's file/location (or picks the preferred reader file for never-opened books); mark unread mirrors video unwatch semantics and deletes the progress row. - /history/remove accepts ebooks: hides via user_history_hidden_items without touching the reading position (hidden != unread; next reading activity resurfaces the book, mirroring video re-watch). - Access-filter checks match the video branch; shared logic lives in ebook_read_state.go. Sort metrics/user-state thresholds use the shared constant; profile-header fallback deduplicated. Clients: response is {type: "ebook", affected_count: 1, played: bool}; the existing watched SSE event fires. Co-Authored-By: Claude Fable 5 * fix(web): harden the ebook reader UI - Open-flow race: cancellation checked after every await with full stale-run teardown (no wrong-file progress saves, no leaked views/blob URLs); book.destroy() on cleanup. - Progress: monotonic stale-response guard; visibilitychange flush uses the refresh-capable client, pagehide uses keepalive; per-book cross-format progress documented as deliberate. - Settings: side effects out of the setState updater; local edits no longer clobbered by late server config; pending saves flushed on unmount/pagehide. - TTS: generation token so Stop actually stops (Chromium/Firefox synthetic events); Media Session uninstalled on unmount. - External book links: http(s) only, opened with noopener,noreferrer. - apiBlob 512 MiB guard with a user-facing error; fraction bookmarks navigable; search-result key collisions fixed; dead e-ink code removed; getLibrarySortRelevanceScope deduplicated; md format dropped. Co-Authored-By: Claude Fable 5 * feat(web): mark read/unread affordances for ebooks - Item detail gets a Mark Read/Unread button; card menus drop the ebook gate and share type-aware labels/toasts (also dedupes audiobook wording). - Watched-state invalidation includes the reader progress query key so the Continue button and percent refresh after toggling. - Continue Reading dismiss copy for ebooks; dismissal path now URL-encodes item IDs (ebook content IDs can contain reserved characters). Co-Authored-By: Claude Fable 5 * docs: record the PR #124 review and hardening pass Co-Authored-By: Claude Fable 5 --------- Co-authored-by: rxwatcher Co-authored-by: Claude Fable 5 --- Dockerfile | 1 + Dockerfile.dev | 1 + cmd/silo/main.go | 16 + docs/pr124-ebooks-review-hardening.md | 82 + .../2026-06-08-ebook-reader-full-parity.md | 301 +++ .../2026-06-08-ebook-reader-shell-parity.md | 68 + go.mod | 2 +- internal/api/handlers/catalog.go | 2 + internal/api/handlers/catalog_resources.go | 4 +- internal/api/handlers/ebook_read_state.go | 150 ++ .../api/handlers/ebook_read_state_test.go | 230 ++ internal/api/handlers/ebook_reader.go | 1069 ++++++++ internal/api/handlers/ebook_reader_test.go | 901 +++++++ internal/api/handlers/favorites.go | 16 +- .../handlers/favorites_history_remove_test.go | 113 + internal/api/handlers/items.go | 137 +- .../api/handlers/items_sort_metrics_test.go | 131 +- internal/api/handlers/items_user_data_test.go | 47 + internal/api/handlers/libraries.go | 31 +- .../libraries_metadata_levels_test.go | 26 + internal/api/handlers/recommendations.go | 6 +- internal/api/handlers/sections.go | 6 +- internal/api/handlers/taste_seed.go | 5 +- internal/api/handlers/user_state.go | 34 + internal/api/handlers/user_state_test.go | 96 + internal/api/handlers/watch_tonight.go | 5 +- internal/api/router.go | 51 + internal/catalog/browse.go | 19 +- internal/catalog/catalog_parser_test.go | 9 + internal/catalog/catalog_resolver.go | 39 +- internal/catalog/catalog_resolver_test.go | 165 ++ internal/catalog/detail.go | 86 +- internal/catalog/detail_audiobook_test.go | 24 + internal/catalog/item_repo.go | 43 + internal/catalog/query_builder.go | 185 +- internal/catalog/query_builder_test.go | 202 ++ internal/catalog/query_definition.go | 10 +- internal/catalog/query_definition_test.go | 39 + internal/ebooks/enrichment.go | 765 ++++++ internal/ebooks/enrichment_test.go | 573 ++++ internal/imagecache/imagecache.go | 16 + internal/jellycompat/web.go | 4 + internal/metadata/provider_id_integrity.go | 13 + .../metadata/provider_id_integrity_test.go | 19 + internal/models/ebook_progress.go | 8 + internal/recommendations/accuracy_test.go | 26 + internal/recommendations/embeddings/text.go | 15 +- .../recommendations/embeddings/text_test.go | 36 + internal/recommendations/personal.go | 2 +- internal/recommendations/repo.go | 347 ++- internal/recommendations/repo_test.go | 122 + internal/recommendations/signals.go | 53 +- internal/recommendations/signals_test.go | 74 + internal/recommendations/taste_signals.go | 7 +- .../recommendations/taste_signals_test.go | 71 + internal/recommendations/worker.go | 24 +- internal/scanner/audiobook.go | 2 +- internal/scanner/audiobook_cover.go | 4 + internal/scanner/ebook.go | 1110 ++++++++ internal/scanner/ebook_scan.go | 1345 ++++++++++ internal/scanner/ebook_test.go | 1896 ++++++++++++++ internal/scanner/scanner.go | 68 +- internal/scanner/scanner_test.go | 73 + internal/sections/defaults.go | 8 + internal/sections/defaults_test.go | 63 + internal/sections/fetcher.go | 185 +- .../fetcher_continue_watching_test.go | 71 + internal/server/frontend.go | 45 +- internal/server/frontend_test.go | 80 + .../taskmanager/tasks/sync_ebook_metadata.go | 56 + .../tasks/sync_ebook_metadata_test.go | 92 + .../sql/20260608000100_ebook_series.sql | 17 + .../20260608000200_ebook_reader_progress.sql | 22 + .../sql/20260608000300_ebook_reader_state.sql | 41 + ...0610071424_add_ebook_reader_fk_indexes.sql | 26 + ...60610080326_backfill_ebook_item_status.sql | 18 + .../20260610080327_ebook_enrichment_state.sql | 13 + web/package.json | 4 + web/pnpm-lock.yaml | 167 ++ .../vendor/pdfjs/annotation_layer_builder.css | 407 +++ web/public/vendor/pdfjs/cmaps/78-EUC-H.bcmap | Bin 0 -> 2404 bytes web/public/vendor/pdfjs/cmaps/78-EUC-V.bcmap | Bin 0 -> 173 bytes web/public/vendor/pdfjs/cmaps/78-H.bcmap | Bin 0 -> 2379 bytes web/public/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap | Bin 0 -> 2398 bytes web/public/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap | Bin 0 -> 173 bytes web/public/vendor/pdfjs/cmaps/78-V.bcmap | Bin 0 -> 169 bytes .../vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap | Bin 0 -> 2651 bytes .../vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap | Bin 0 -> 905 bytes .../vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap | Bin 0 -> 721 bytes .../vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap | Bin 0 -> 715 bytes .../vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap | Bin 0 -> 291 bytes .../vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap | Bin 0 -> 982 bytes .../vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap | Bin 0 -> 260 bytes web/public/vendor/pdfjs/cmaps/Add-H.bcmap | Bin 0 -> 2419 bytes .../vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap | Bin 0 -> 2413 bytes .../vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap | Bin 0 -> 287 bytes web/public/vendor/pdfjs/cmaps/Add-V.bcmap | Bin 0 -> 282 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap | Bin 0 -> 317 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap | Bin 0 -> 371 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap | Bin 0 -> 376 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap | Bin 0 -> 401 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap | Bin 0 -> 405 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap | Bin 0 -> 406 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap | Bin 0 -> 406 bytes .../vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap | Bin 0 -> 41193 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap | Bin 0 -> 217 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap | Bin 0 -> 250 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap | Bin 0 -> 465 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap | Bin 0 -> 470 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap | Bin 0 -> 601 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap | Bin 0 -> 625 bytes .../vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap | Bin 0 -> 33974 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap | Bin 0 -> 225 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap | Bin 0 -> 226 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap | Bin 0 -> 233 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap | Bin 0 -> 242 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap | Bin 0 -> 337 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap | Bin 0 -> 430 bytes .../vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap | Bin 0 -> 485 bytes .../pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap | Bin 0 -> 40951 bytes .../vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap | Bin 0 -> 241 bytes .../vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap | Bin 0 -> 386 bytes .../vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap | Bin 0 -> 391 bytes .../pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap | Bin 0 -> 23293 bytes web/public/vendor/pdfjs/cmaps/B5-H.bcmap | Bin 0 -> 1086 bytes web/public/vendor/pdfjs/cmaps/B5-V.bcmap | Bin 0 -> 142 bytes web/public/vendor/pdfjs/cmaps/B5pc-H.bcmap | Bin 0 -> 1099 bytes web/public/vendor/pdfjs/cmaps/B5pc-V.bcmap | Bin 0 -> 144 bytes web/public/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap | Bin 0 -> 1780 bytes web/public/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap | Bin 0 -> 1920 bytes web/public/vendor/pdfjs/cmaps/CNS1-H.bcmap | Bin 0 -> 706 bytes web/public/vendor/pdfjs/cmaps/CNS1-V.bcmap | Bin 0 -> 143 bytes web/public/vendor/pdfjs/cmaps/CNS2-H.bcmap | Bin 0 -> 504 bytes web/public/vendor/pdfjs/cmaps/CNS2-V.bcmap | 3 + web/public/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap | Bin 0 -> 4426 bytes web/public/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap | Bin 0 -> 158 bytes web/public/vendor/pdfjs/cmaps/ETen-B5-H.bcmap | Bin 0 -> 1125 bytes web/public/vendor/pdfjs/cmaps/ETen-B5-V.bcmap | Bin 0 -> 158 bytes .../vendor/pdfjs/cmaps/ETenms-B5-H.bcmap | 3 + .../vendor/pdfjs/cmaps/ETenms-B5-V.bcmap | Bin 0 -> 172 bytes web/public/vendor/pdfjs/cmaps/EUC-H.bcmap | Bin 0 -> 578 bytes web/public/vendor/pdfjs/cmaps/EUC-V.bcmap | Bin 0 -> 170 bytes web/public/vendor/pdfjs/cmaps/Ext-H.bcmap | Bin 0 -> 2536 bytes .../vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap | Bin 0 -> 2542 bytes .../vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap | Bin 0 -> 218 bytes web/public/vendor/pdfjs/cmaps/Ext-V.bcmap | Bin 0 -> 215 bytes web/public/vendor/pdfjs/cmaps/GB-EUC-H.bcmap | Bin 0 -> 549 bytes web/public/vendor/pdfjs/cmaps/GB-EUC-V.bcmap | Bin 0 -> 179 bytes web/public/vendor/pdfjs/cmaps/GB-H.bcmap | 4 + web/public/vendor/pdfjs/cmaps/GB-V.bcmap | Bin 0 -> 175 bytes web/public/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap | Bin 0 -> 14692 bytes web/public/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap | Bin 0 -> 180 bytes web/public/vendor/pdfjs/cmaps/GBK2K-H.bcmap | Bin 0 -> 19662 bytes web/public/vendor/pdfjs/cmaps/GBK2K-V.bcmap | Bin 0 -> 219 bytes .../vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap | Bin 0 -> 14686 bytes .../vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap | Bin 0 -> 181 bytes web/public/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap | Bin 0 -> 7290 bytes web/public/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap | Bin 0 -> 180 bytes web/public/vendor/pdfjs/cmaps/GBT-H.bcmap | Bin 0 -> 7269 bytes web/public/vendor/pdfjs/cmaps/GBT-V.bcmap | Bin 0 -> 176 bytes .../vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap | Bin 0 -> 7298 bytes .../vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap | Bin 0 -> 182 bytes .../vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap | Bin 0 -> 557 bytes .../vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap | Bin 0 -> 181 bytes web/public/vendor/pdfjs/cmaps/H.bcmap | Bin 0 -> 553 bytes .../vendor/pdfjs/cmaps/HKdla-B5-H.bcmap | Bin 0 -> 2654 bytes .../vendor/pdfjs/cmaps/HKdla-B5-V.bcmap | Bin 0 -> 148 bytes .../vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap | Bin 0 -> 2414 bytes .../vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap | Bin 0 -> 148 bytes .../vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap | Bin 0 -> 2292 bytes .../vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap | Bin 0 -> 149 bytes .../vendor/pdfjs/cmaps/HKm314-B5-H.bcmap | Bin 0 -> 1772 bytes .../vendor/pdfjs/cmaps/HKm314-B5-V.bcmap | Bin 0 -> 149 bytes .../vendor/pdfjs/cmaps/HKm471-B5-H.bcmap | Bin 0 -> 2171 bytes .../vendor/pdfjs/cmaps/HKm471-B5-V.bcmap | Bin 0 -> 149 bytes .../vendor/pdfjs/cmaps/HKscs-B5-H.bcmap | Bin 0 -> 4437 bytes .../vendor/pdfjs/cmaps/HKscs-B5-V.bcmap | Bin 0 -> 159 bytes web/public/vendor/pdfjs/cmaps/Hankaku.bcmap | Bin 0 -> 132 bytes web/public/vendor/pdfjs/cmaps/Hiragana.bcmap | Bin 0 -> 124 bytes web/public/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap | Bin 0 -> 1848 bytes web/public/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap | Bin 0 -> 164 bytes web/public/vendor/pdfjs/cmaps/KSC-H.bcmap | Bin 0 -> 1831 bytes .../vendor/pdfjs/cmaps/KSC-Johab-H.bcmap | Bin 0 -> 16791 bytes .../vendor/pdfjs/cmaps/KSC-Johab-V.bcmap | Bin 0 -> 166 bytes web/public/vendor/pdfjs/cmaps/KSC-V.bcmap | Bin 0 -> 160 bytes .../vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap | Bin 0 -> 2787 bytes .../vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap | Bin 0 -> 2789 bytes .../vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap | Bin 0 -> 169 bytes .../vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap | Bin 0 -> 166 bytes .../vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap | Bin 0 -> 2024 bytes .../vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap | Bin 0 -> 166 bytes web/public/vendor/pdfjs/cmaps/Katakana.bcmap | Bin 0 -> 100 bytes web/public/vendor/pdfjs/cmaps/LICENSE | 36 + web/public/vendor/pdfjs/cmaps/NWP-H.bcmap | Bin 0 -> 2765 bytes web/public/vendor/pdfjs/cmaps/NWP-V.bcmap | Bin 0 -> 252 bytes web/public/vendor/pdfjs/cmaps/RKSJ-H.bcmap | Bin 0 -> 534 bytes web/public/vendor/pdfjs/cmaps/RKSJ-V.bcmap | Bin 0 -> 170 bytes web/public/vendor/pdfjs/cmaps/Roman.bcmap | Bin 0 -> 96 bytes .../vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap | Bin 0 -> 48280 bytes .../vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap | Bin 0 -> 156 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap | Bin 0 -> 50419 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap | Bin 0 -> 156 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap | Bin 0 -> 52679 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap | Bin 0 -> 160 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap | Bin 0 -> 53629 bytes .../vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap | Bin 0 -> 157 bytes .../vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap | Bin 0 -> 43366 bytes .../vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap | Bin 0 -> 193 bytes .../vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap | Bin 0 -> 44086 bytes .../vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap | Bin 0 -> 178 bytes .../vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap | Bin 0 -> 45738 bytes .../vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap | Bin 0 -> 182 bytes .../vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap | Bin 0 -> 46837 bytes .../vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap | Bin 0 -> 181 bytes .../vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap | Bin 0 -> 25439 bytes .../vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin 0 -> 119 bytes .../vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin 0 -> 680 bytes .../vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap | Bin 0 -> 664 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap | Bin 0 -> 39443 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap | Bin 0 -> 643 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap | Bin 0 -> 40539 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap | Bin 0 -> 677 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap | Bin 0 -> 41695 bytes .../vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap | Bin 0 -> 678 bytes .../pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap | Bin 0 -> 39534 bytes .../pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap | Bin 0 -> 647 bytes .../pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap | Bin 0 -> 40630 bytes .../pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap | Bin 0 -> 681 bytes .../pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap | Bin 0 -> 41779 bytes .../pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap | Bin 0 -> 682 bytes .../pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 0 -> 705 bytes .../vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap | Bin 0 -> 689 bytes .../vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap | Bin 0 -> 726 bytes .../pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap | Bin 0 -> 40517 bytes .../pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap | Bin 0 -> 684 bytes .../pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap | Bin 0 -> 40608 bytes .../pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap | Bin 0 -> 688 bytes .../vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap | Bin 0 -> 25783 bytes .../vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap | Bin 0 -> 178 bytes .../vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap | Bin 0 -> 26327 bytes .../vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap | Bin 0 -> 164 bytes .../vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap | Bin 0 -> 26451 bytes .../vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap | Bin 0 -> 168 bytes .../vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap | Bin 0 -> 27790 bytes .../vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap | Bin 0 -> 169 bytes web/public/vendor/pdfjs/cmaps/V.bcmap | Bin 0 -> 166 bytes web/public/vendor/pdfjs/cmaps/WP-Symbol.bcmap | Bin 0 -> 179 bytes web/public/vendor/pdfjs/pdf.min.mjs | 28 + web/public/vendor/pdfjs/pdf.worker.min.mjs | 31 + .../pdfjs/standard_fonts/FoxitDingbats.pfb | Bin 0 -> 29513 bytes .../pdfjs/standard_fonts/FoxitFixed.pfb | Bin 0 -> 17597 bytes .../pdfjs/standard_fonts/FoxitFixedBold.pfb | Bin 0 -> 18055 bytes .../standard_fonts/FoxitFixedBoldItalic.pfb | Bin 0 -> 19151 bytes .../pdfjs/standard_fonts/FoxitFixedItalic.pfb | Bin 0 -> 18746 bytes .../pdfjs/standard_fonts/FoxitSerif.pfb | Bin 0 -> 19469 bytes .../pdfjs/standard_fonts/FoxitSerifBold.pfb | Bin 0 -> 19395 bytes .../standard_fonts/FoxitSerifBoldItalic.pfb | Bin 0 -> 20733 bytes .../pdfjs/standard_fonts/FoxitSerifItalic.pfb | Bin 0 -> 21227 bytes .../pdfjs/standard_fonts/FoxitSymbol.pfb | Bin 0 -> 16729 bytes .../vendor/pdfjs/standard_fonts/LICENSE_FOXIT | 27 + .../pdfjs/standard_fonts/LICENSE_LIBERATION | 102 + .../standard_fonts/LiberationSans-Bold.ttf | Bin 0 -> 137052 bytes .../LiberationSans-BoldItalic.ttf | Bin 0 -> 135124 bytes .../standard_fonts/LiberationSans-Italic.ttf | Bin 0 -> 162036 bytes .../standard_fonts/LiberationSans-Regular.ttf | Bin 0 -> 139512 bytes .../vendor/pdfjs/text_layer_builder.css | 144 + web/public/vendor/pdfjs/wasm/LICENSE_JBIG2 | 196 ++ web/public/vendor/pdfjs/wasm/LICENSE_OPENJPEG | 39 + .../vendor/pdfjs/wasm/LICENSE_PDFJS_JBIG2 | 13 + .../vendor/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG | 22 + .../vendor/pdfjs/wasm/LICENSE_PDFJS_QCMS | 22 + web/public/vendor/pdfjs/wasm/LICENSE_QCMS | 21 + web/public/vendor/pdfjs/wasm/jbig2.wasm | Bin 0 -> 104852 bytes .../pdfjs/wasm/jbig2_nowasm_fallback.js | 15 + web/public/vendor/pdfjs/wasm/openjpeg.wasm | Bin 0 -> 252032 bytes .../pdfjs/wasm/openjpeg_nowasm_fallback.js | 17 + web/public/vendor/pdfjs/wasm/qcms_bg.wasm | Bin 0 -> 88837 bytes web/public/vendor/pdfjs/wasm/quickjs-eval.js | 16 + .../vendor/pdfjs/wasm/quickjs-eval.wasm | Bin 0 -> 432499 bytes web/src/App.tsx | 9 + web/src/api/client.test.ts | 46 + web/src/api/client.ts | 59 + web/src/api/types.ts | 24 +- .../components/ContinueWatchingCard.test.tsx | 38 + web/src/components/ContinueWatchingCard.tsx | 22 +- .../components/DownloadVersionPicker.test.tsx | 83 + web/src/components/DownloadVersionPicker.tsx | 12 +- web/src/components/FilterRuleEditor.test.tsx | 12 + web/src/components/FilterRuleEditor.tsx | 34 +- web/src/components/GlobalSearch.test.tsx | 65 + web/src/components/GlobalSearch.tsx | 6 +- web/src/components/HeroBanner.test.tsx | 32 + web/src/components/HeroBanner.tsx | 9 +- web/src/components/ItemCard.test.tsx | 14 + web/src/components/ItemCard.tsx | 4 +- web/src/components/MediaItemMenu.test.tsx | 37 + web/src/components/MediaItemMenu.tsx | 15 +- web/src/components/MediaLocations.tsx | 14 +- .../components/RecommendationGrid.test.tsx | 33 + web/src/components/RecommendationGrid.tsx | 2 +- web/src/components/SectionItemCard.test.tsx | 27 +- web/src/components/SectionItemCard.tsx | 4 +- web/src/components/SectionRow.test.tsx | 44 + web/src/components/SectionRow.tsx | 13 +- web/src/components/WatchTonightCard.test.tsx | 36 + web/src/components/WatchTonightCard.tsx | 18 +- .../admin/libraries/LibraryForm.test.tsx | 21 + .../admin/libraries/libraryTypes.ts | 3 +- .../admin/libraries/useLibraryForm.ts | 5 +- .../catalog/CatalogFilterBar.test.tsx | 9 + .../components/catalog/CatalogFilterBar.tsx | 21 +- .../catalog/catalogFilterBadges.test.ts | 61 +- .../components/catalog/catalogFilterBadges.ts | 9 +- .../CollectionGuidedRulesEditor.test.tsx | 78 + .../CollectionGuidedRulesEditor.tsx | 106 +- .../CollectionRulesEditor.test.tsx | 29 + .../collections/CollectionRulesEditor.tsx | 4 +- .../sections/EditableSectionRows.tsx | 1 + .../sections/SectionEditorDrawer.tsx | 3 +- web/src/hooks/queries/catalogRead.test.ts | 23 + web/src/hooks/queries/catalogRead.ts | 19 +- web/src/hooks/queries/ebookReaderProgress.ts | 11 + web/src/hooks/queries/homeDismissals.test.ts | 44 + web/src/hooks/queries/homeDismissals.ts | 8 +- web/src/hooks/queries/items.test.ts | 130 + web/src/hooks/queries/items.ts | 38 +- web/src/hooks/queries/keys.ts | 4 + web/src/hooks/useScreenWakeLock.ts | 51 + web/src/hooks/useTTS.test.ts | 243 ++ web/src/hooks/useTTS.ts | 149 ++ web/src/lib/mediaNavigation.ts | 22 +- web/src/lib/querySortOptions.test.ts | 37 + web/src/lib/querySortOptions.ts | 39 +- web/src/pages/EbookReader.test.tsx | 1198 +++++++++ web/src/pages/EbookReader.tsx | 1211 +++++++++ .../pages/ItemDetail/EbookContent.test.tsx | 485 ++++ web/src/pages/ItemDetail/EbookContent.tsx | 246 ++ .../components/VersionFlyout.test.ts | 13 + .../ItemDetail/components/VersionFlyout.tsx | 3 + .../components/versionFormatUtils.test.ts | 13 + .../components/versionFormatUtils.tsx | 5 + web/src/pages/ItemDetail/index.test.tsx | 20 + web/src/pages/ItemDetail/index.tsx | 3 + web/src/pages/ItemDetail/watchedState.test.ts | 58 +- web/src/pages/ItemDetail/watchedState.ts | 23 +- web/src/pages/LibraryBrowse.test.tsx | 47 + web/src/pages/LibraryBrowse.tsx | 35 +- .../components/RelatedRail.test.tsx | 45 + .../audiobooks/components/RelatedRail.tsx | 23 +- web/src/pages/catalogSearchParams.test.ts | 7 + web/src/pages/catalogSearchParams.ts | 1 + web/src/pages/libraryPageSearchParams.test.ts | 34 + web/src/pages/libraryPageSearchParams.ts | 23 +- .../FoliateBookReader.component.test.tsx | 426 +++ web/src/reader/FoliateBookReader.test.ts | 300 +++ web/src/reader/FoliateBookReader.tsx | 941 +++++++ web/src/reader/ebookReaderApi.ts | 114 + web/src/reader/foliate-overlayer.d.ts | 7 + web/src/reader/readest/libs/document.ts | 455 ++++ web/src/vite-env.d.ts | 9 + web/vendor/foliate-js/LICENSE | 21 + web/vendor/foliate-js/README.md | 374 +++ web/vendor/foliate-js/comic-book.js | 114 + web/vendor/foliate-js/dict.js | 241 ++ web/vendor/foliate-js/epub.js | 1223 +++++++++ web/vendor/foliate-js/epubcfi.js | 354 +++ web/vendor/foliate-js/fb2.js | 348 +++ web/vendor/foliate-js/fixed-layout.js | 1295 +++++++++ web/vendor/foliate-js/footnotes.js | 152 ++ web/vendor/foliate-js/mobi.js | 1242 +++++++++ web/vendor/foliate-js/opds.js | 400 +++ web/vendor/foliate-js/overlayer.js | 422 +++ web/vendor/foliate-js/package.json | 50 + web/vendor/foliate-js/paginator.js | 2332 +++++++++++++++++ web/vendor/foliate-js/pdf.js | 513 ++++ web/vendor/foliate-js/progress.js | 224 ++ web/vendor/foliate-js/quote-image.js | 86 + web/vendor/foliate-js/reader.js | 239 ++ web/vendor/foliate-js/search.js | 130 + web/vendor/foliate-js/text-walker.js | 43 + web/vendor/foliate-js/tts.js | 450 ++++ web/vendor/foliate-js/uri-template.js | 52 + web/vendor/foliate-js/vendor/fflate.js | 1 + web/vendor/foliate-js/vendor/zip.js | 1 + web/vendor/foliate-js/view.js | 680 +++++ web/vite.config.ts | 1 + 388 files changed, 31194 insertions(+), 498 deletions(-) create mode 100644 docs/pr124-ebooks-review-hardening.md create mode 100644 docs/superpowers/plans/2026-06-08-ebook-reader-full-parity.md create mode 100644 docs/superpowers/plans/2026-06-08-ebook-reader-shell-parity.md create mode 100644 internal/api/handlers/ebook_read_state.go create mode 100644 internal/api/handlers/ebook_read_state_test.go create mode 100644 internal/api/handlers/ebook_reader.go create mode 100644 internal/api/handlers/ebook_reader_test.go create mode 100644 internal/api/handlers/favorites_history_remove_test.go create mode 100644 internal/api/handlers/items_user_data_test.go create mode 100644 internal/api/handlers/libraries_metadata_levels_test.go create mode 100644 internal/api/handlers/user_state_test.go create mode 100644 internal/catalog/catalog_parser_test.go create mode 100644 internal/ebooks/enrichment.go create mode 100644 internal/ebooks/enrichment_test.go create mode 100644 internal/models/ebook_progress.go create mode 100644 internal/recommendations/taste_signals_test.go create mode 100644 internal/scanner/ebook.go create mode 100644 internal/scanner/ebook_scan.go create mode 100644 internal/scanner/ebook_test.go create mode 100644 internal/server/frontend_test.go create mode 100644 internal/taskmanager/tasks/sync_ebook_metadata.go create mode 100644 internal/taskmanager/tasks/sync_ebook_metadata_test.go create mode 100644 migrations/sql/20260608000100_ebook_series.sql create mode 100644 migrations/sql/20260608000200_ebook_reader_progress.sql create mode 100644 migrations/sql/20260608000300_ebook_reader_state.sql create mode 100644 migrations/sql/20260610071424_add_ebook_reader_fk_indexes.sql create mode 100644 migrations/sql/20260610080326_backfill_ebook_item_status.sql create mode 100644 migrations/sql/20260610080327_ebook_enrichment_state.sql create mode 100644 web/public/vendor/pdfjs/annotation_layer_builder.css create mode 100644 web/public/vendor/pdfjs/cmaps/78-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Add-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Add-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/B5pc-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/B5pc-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS1-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS1-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS2-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/CNS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETen-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETen-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Ext-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Ext-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GB-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GB-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GB-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GB-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBK2K-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBK2K-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBT-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBT-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Hankaku.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Hiragana.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Katakana.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/LICENSE create mode 100644 web/public/vendor/pdfjs/cmaps/NWP-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/NWP-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/RKSJ-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/RKSJ-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/Roman.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/V.bcmap create mode 100644 web/public/vendor/pdfjs/cmaps/WP-Symbol.bcmap create mode 100644 web/public/vendor/pdfjs/pdf.min.mjs create mode 100644 web/public/vendor/pdfjs/pdf.worker.min.mjs create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitFixed.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitSerif.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb create mode 100644 web/public/vendor/pdfjs/standard_fonts/LICENSE_FOXIT create mode 100644 web/public/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION create mode 100644 web/public/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf create mode 100644 web/public/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf create mode 100644 web/public/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf create mode 100644 web/public/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf create mode 100644 web/public/vendor/pdfjs/text_layer_builder.css create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_JBIG2 create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_OPENJPEG create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_JBIG2 create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_QCMS create mode 100644 web/public/vendor/pdfjs/wasm/LICENSE_QCMS create mode 100644 web/public/vendor/pdfjs/wasm/jbig2.wasm create mode 100644 web/public/vendor/pdfjs/wasm/jbig2_nowasm_fallback.js create mode 100644 web/public/vendor/pdfjs/wasm/openjpeg.wasm create mode 100644 web/public/vendor/pdfjs/wasm/openjpeg_nowasm_fallback.js create mode 100644 web/public/vendor/pdfjs/wasm/qcms_bg.wasm create mode 100644 web/public/vendor/pdfjs/wasm/quickjs-eval.js create mode 100644 web/public/vendor/pdfjs/wasm/quickjs-eval.wasm create mode 100644 web/src/components/DownloadVersionPicker.test.tsx create mode 100644 web/src/components/RecommendationGrid.test.tsx create mode 100644 web/src/components/admin/libraries/LibraryForm.test.tsx create mode 100644 web/src/components/catalog/CatalogFilterBar.test.tsx create mode 100644 web/src/components/collections/CollectionRulesEditor.test.tsx create mode 100644 web/src/hooks/queries/ebookReaderProgress.ts create mode 100644 web/src/hooks/queries/items.test.ts create mode 100644 web/src/hooks/useScreenWakeLock.ts create mode 100644 web/src/hooks/useTTS.test.ts create mode 100644 web/src/hooks/useTTS.ts create mode 100644 web/src/lib/querySortOptions.test.ts create mode 100644 web/src/pages/EbookReader.test.tsx create mode 100644 web/src/pages/EbookReader.tsx create mode 100644 web/src/pages/ItemDetail/EbookContent.test.tsx create mode 100644 web/src/pages/ItemDetail/EbookContent.tsx create mode 100644 web/src/pages/audiobooks/components/RelatedRail.test.tsx create mode 100644 web/src/reader/FoliateBookReader.component.test.tsx create mode 100644 web/src/reader/FoliateBookReader.test.ts create mode 100644 web/src/reader/FoliateBookReader.tsx create mode 100644 web/src/reader/ebookReaderApi.ts create mode 100644 web/src/reader/foliate-overlayer.d.ts create mode 100644 web/src/reader/readest/libs/document.ts create mode 100644 web/vendor/foliate-js/LICENSE create mode 100644 web/vendor/foliate-js/README.md create mode 100644 web/vendor/foliate-js/comic-book.js create mode 100644 web/vendor/foliate-js/dict.js create mode 100644 web/vendor/foliate-js/epub.js create mode 100644 web/vendor/foliate-js/epubcfi.js create mode 100644 web/vendor/foliate-js/fb2.js create mode 100644 web/vendor/foliate-js/fixed-layout.js create mode 100644 web/vendor/foliate-js/footnotes.js create mode 100644 web/vendor/foliate-js/mobi.js create mode 100644 web/vendor/foliate-js/opds.js create mode 100644 web/vendor/foliate-js/overlayer.js create mode 100644 web/vendor/foliate-js/package.json create mode 100644 web/vendor/foliate-js/paginator.js create mode 100644 web/vendor/foliate-js/pdf.js create mode 100644 web/vendor/foliate-js/progress.js create mode 100644 web/vendor/foliate-js/quote-image.js create mode 100644 web/vendor/foliate-js/reader.js create mode 100644 web/vendor/foliate-js/search.js create mode 100644 web/vendor/foliate-js/text-walker.js create mode 100644 web/vendor/foliate-js/tts.js create mode 100644 web/vendor/foliate-js/uri-template.js create mode 100644 web/vendor/foliate-js/vendor/fflate.js create mode 100644 web/vendor/foliate-js/vendor/zip.js create mode 100644 web/vendor/foliate-js/view.js diff --git a/Dockerfile b/Dockerfile index 74590a92..cca69042 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ FROM node:22-slim AS frontend RUN corepack enable && corepack prepare pnpm@10.32.1 --activate WORKDIR /app/web COPY web/package.json web/pnpm-lock.yaml ./ +COPY web/vendor/foliate-js ./vendor/foliate-js RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile COPY web/ . diff --git a/Dockerfile.dev b/Dockerfile.dev index 2b2faf86..d70cf7cf 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -5,6 +5,7 @@ FROM node:22-slim AS frontend RUN corepack enable && corepack prepare pnpm@10.32.1 --activate WORKDIR /app/web COPY web/package.json web/pnpm-lock.yaml ./ +COPY web/vendor/foliate-js ./vendor/foliate-js RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile COPY web/ . diff --git a/cmd/silo/main.go b/cmd/silo/main.go index 0f0334fe..172c7fa2 100644 --- a/cmd/silo/main.go +++ b/cmd/silo/main.go @@ -47,6 +47,7 @@ import ( "github.com/Silo-Server/silo-server/internal/clientip" "github.com/Silo-Server/silo-server/internal/config" "github.com/Silo-Server/silo-server/internal/database" + "github.com/Silo-Server/silo-server/internal/ebooks" evt "github.com/Silo-Server/silo-server/internal/events" "github.com/Silo-Server/silo-server/internal/historyimport" "github.com/Silo-Server/silo-server/internal/imagecache" @@ -941,6 +942,7 @@ func main() { var seasonRepo *catalog.SeasonRepository var episodeRepo *catalog.EpisodeRepository var audiobookEnricher *audiobooks.Enricher + var ebookEnricher *ebooks.Enricher if needsWorkers && deps.DB != nil && deps.FileRepo != nil { chainRepo := metadata.NewChainRepository(deps.DB) skippedRootRepo = metadata.NewSkippedRootRepository(deps.DB) @@ -1022,6 +1024,14 @@ func main() { personRepo, providerIDRepo, ) + ebookEnricher = ebooks.NewEnricher( + deps.DB, + chainRepo, + pluginResolver, + itemRepo, + personRepo, + providerIDRepo, + ) // Always wire the image resolver so plugin-prefixed URLs (e.g. // metadb://) can be resolved to presigned HTTP URLs in API responses. @@ -1044,6 +1054,9 @@ func main() { audiobookEnricher.SetImageCacher(imageCacher) audiobookEnricher.SetFFmpegPath(scanner.FFmpegPathFromFFprobe(scanner.FFprobePathFromFFmpeg(cfg.Playback.FFmpegPath))) } + if ebookEnricher != nil { + ebookEnricher.SetImageCacher(imageCacher) + } } matchWorker = metadata.NewMatchWorker(metadataService, deps.FileRepo, cfg.Matcher.Workers, cfg.Matcher.BatchSize, 30*time.Second) @@ -1586,6 +1599,9 @@ func main() { if audiobookEnricher != nil { taskMgr.Register(tasks.NewSyncAudiobookMetadataTask(audiobookEnricher)) } + if ebookEnricher != nil { + taskMgr.Register(tasks.NewSyncEbookMetadataTask(ebookEnricher)) + } if pluginInstallationStore != nil && pluginRuntimeConfigStore != nil && pluginService != nil { pluginTasks, err := plugins.NewTaskRegistryWithTypedResolver(pluginInstallationStore, pluginRuntimeConfigStore, pluginService).Tasks(appCtx) if err != nil { diff --git a/docs/pr124-ebooks-review-hardening.md b/docs/pr124-ebooks-review-hardening.md new file mode 100644 index 00000000..f727fd60 --- /dev/null +++ b/docs/pr124-ebooks-review-hardening.md @@ -0,0 +1,82 @@ +# PR #124 (ebooks) — Review & Hardening Pass + +Date: 2026-06-10 +Scope: full review of the ebook feature branch (`work/ebooks-reader-base`) followed by +fixes for every finding. Two review rounds were performed (a full-PR review, then an +adversarial edge-case/security pass over both the original code and the first round of +fixes), with all changes verified against the full Go test suite, the full web test +suite, production frontend build, ESLint/Prettier, and `make verify-local-paths`. +Commands assume the repository root is the cwd. + +## Security fixes + +- **Stored XSS via book content (high):** book sections render in same-origin blob + iframes with `allow-scripts` (WebKit requirement). A Content-Security-Policy is now + served with all SPA HTML responses (`internal/server/frontend.go`) — blob/srcdoc + documents inherit it, so `script-src 'self' 'wasm-unsafe-eval'` blocks script + execution from book content on all browsers. Threat model documented on the policy + constant. `X-Content-Type-Options: nosniff` added to frontend, jellycompat, and + ebook file responses. +- Ebook file serving can no longer fall through to `application/octet-stream` for an + admitted file (extension/container whitelist and MIME resolution share one resolver), + closing a browser-sniff escape combined with the `?token=` query-auth fallback. +- External links in books are intercepted app-side: http(s) only, opened with + `noopener,noreferrer` (blocks reverse tabnabbing and `javascript:` URLs). +- Request size caps (`http.MaxBytesReader`, 413) on progress/config/annotation writes; + `Content-Disposition` built with `mime.FormatMediaType` (RFC 5987, no header + injection); annotation PATCH is atomic (`SELECT ... FOR UPDATE`) with + presence-aware field semantics and invariant re-validation. +- Verified safe under adversarial review: no IDOR (all reader-state SQL scoped to + user+profile+content), no path traversal, range serving via stdlib, progress input + validation. Accepted residual: CSS-only loads inside book iframes can leak the + book's own content but cannot reach tokens, DOM, or navigation. + +## Reliability fixes + +- **Scanner missing-file reconciliation (critical class):** ebook scans now mark + missing files like video/audio, with real walk-failure tracking (failed roots are + excluded from deletion), symlinked-root support via the shared logical walker, and + the empty-root cleanup allowance — an unmounted share can no longer wipe a library. +- **Enrichment:** provider errors record failures (dedicated `ebook_enrichment_state` + backoff table, capped retries) instead of permanently stamping items done; + unconfigured chains and scan-window races skip without stamping. No longer shares + `media_items.refresh_failures` with the metadata refresh-debt system. +- Ebook items are created `pending` and promoted to `matched` on enrichment (backfill + migration included), making curated-metadata protection real: matched items keep + provider titles/people/series on re-scan (fill-empty only). +- PDF metadata: head+tail window scan (non-linearized PDFs keep the Info dict at the + end), delimiter-aware key matching, head-wins merge. `.md` dropped as an ebook + format; plain `.fb2` reads capped like `.fbz`. +- FK-cascade indexes added for the reader-state tables. + +## Consistency & correctness fixes + +- Hidden-history (`user_history_hidden_items`) gating applied to every ebook progress + surface (watched/in-progress filters, all sort plans, Continue Reading, sort + metrics, `Played` state, recommendation signals) with the exact video semantics. +- `GetItemWatchers` counts distinct watchers (no binge inflation) and the + `minWatchers` floor counts distinct accounts, not profiles; ebook reading now feeds + implicit taste signals and taste-seed candidates; Continue Reading pages past + dismissals and dedupes across pages. +- The 0.9 finished threshold is centralized (`models.EbookFinishedProgressThreshold`). +- Reader frontend: open-flow race teardown (no wrong-file progress saves), ordered + progress writes with `pagehide`/`visibilitychange` flush, settings no longer + clobbered by late server config, TTS stop actually stops, Media Session cleanup, + 512 MiB download guard, fraction bookmarks navigable. + +## Feature completion + +- Native read-state endpoints: `POST/DELETE /watched/{id}` and `/history/remove` + accept ebook content IDs (mark read = progress 1.0 preserving location; mark unread + mirrors video unwatch and clears position; history removal hides without losing + position). Web UI exposes Mark Read/Unread on the item page and card menus, with + Continue Reading dismiss copy and dismissal-path ID encoding fixed. + +## Client follow-ups (Android / Apple) + +- Ebook leaf user data encodes the reading ratio as `position_seconds` (0..1) with + `duration_seconds = 1`; do not render absolute times for ebooks. +- `/watched/{id}` returns `{type: "ebook", affected_count: 1, played: bool}` and the + existing watched SSE event fires. +- Reading progress is deliberately per-book (cross-format): one position per content + ID. diff --git a/docs/superpowers/plans/2026-06-08-ebook-reader-full-parity.md b/docs/superpowers/plans/2026-06-08-ebook-reader-full-parity.md new file mode 100644 index 00000000..729f6992 --- /dev/null +++ b/docs/superpowers/plans/2026-06-08-ebook-reader-full-parity.md @@ -0,0 +1,301 @@ +# Ebook Reader Full Parity Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Bring the core ebook reader up to the personal reader feature set with server-persisted config, annotations/bookmarks, selection tools, reading aids, and advanced settings. + +**Architecture:** Keep ebook reading in core, matching audiobooks: core owns the ebook media type and reader behavior; metadata remains plugin-provided. Extend the existing `/ebooks/{content_id}` reader API and `EbookReaderHandler` rather than creating a separate plugin-style reader subsystem. Persist per-user/per-profile/per-book state in Postgres so settings, annotations, and bookmarks roam across devices. + +**Tech Stack:** Go/Chi handlers, pgx/Postgres migrations, React 19, TanStack Query, Foliate/readest reader wrapper, Vitest, Go unit tests. + +--- + +## File Structure + +- `migrations/sql/20260608000300_ebook_reader_state.sql` + - Creates `ebook_reader_config` and `ebook_reader_annotations`. +- `internal/api/handlers/ebook_reader.go` + - Adds reader config and annotation types, store interfaces, handlers, validation, and Postgres store methods. +- `internal/api/handlers/ebook_reader_test.go` + - Adds handler tests for config, annotation CRUD, access scoping, and validation. +- `internal/api/router.go` + - Wires config/annotation stores and routes under `/ebooks/{content_id}`. +- `web/src/reader/FoliateBookReader.tsx` + - Adds selection/annotation/readable-text/content-popup reader handles and applies saved config. +- `web/src/pages/EbookReader.tsx` + - Adds server-backed settings, annotation/bookmark UI, selection tools, TTS controls, wake-lock/e-ink controls, and advanced reader controls. +- `web/src/hooks/useTTS.ts`, `web/src/hooks/useScreenWakeLock.ts`, `web/src/hooks/useEinkMode.ts` + - Port focused personal-reader hooks into core web. +- `web/src/reader/ebookReaderApi.ts` + - Centralizes reader config and annotation API calls for tests and page usage. +- `web/src/pages/EbookReader.test.tsx`, `web/src/reader/FoliateBookReader.test.ts` + - Adds UI and wrapper tests. + +## Task 1: Server-Persisted Reader Config + +**Files:** +- Create: `migrations/sql/20260608000300_ebook_reader_state.sql` +- Modify: `internal/api/handlers/ebook_reader.go` +- Modify: `internal/api/handlers/ebook_reader_test.go` +- Modify: `internal/api/router.go` +- Create: `web/src/reader/ebookReaderApi.ts` +- Modify: `web/src/pages/EbookReader.tsx` +- Modify: `web/src/pages/EbookReader.test.tsx` + +- [ ] **Step 1: Write failing Go handler tests** + +Add tests that: +- `GET /ebooks/{content_id}/reader-config` returns `{ "config": {} }` when no row exists. +- `PUT /ebooks/{content_id}/reader-config` saves JSON config for the authenticated user/profile/content. +- inaccessible content returns 404 through the existing `ItemAccess` path. +- invalid non-object config returns 400. + +Run: + +```bash +go test ./internal/api/handlers -run 'TestEbookReader.*Config' -count=1 +``` + +Expected: fail because config store/handlers do not exist. + +- [ ] **Step 2: Add migration** + +Create `ebook_reader_config`: + +```sql +CREATE TABLE ebook_reader_config ( + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + profile_id TEXT NOT NULL, + content_id TEXT NOT NULL REFERENCES media_items(content_id) ON DELETE CASCADE, + config JSONB NOT NULL DEFAULT '{}'::jsonb, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, profile_id, content_id) +); + +CREATE INDEX ebook_reader_config_profile_updated + ON ebook_reader_config (user_id, profile_id, updated_at DESC); +``` + +- [ ] **Step 3: Implement config store and handlers** + +Add `EbookReaderConfig`, `EbookReaderConfigStore`, `HandleGetConfig`, `HandleSaveConfig`, and `PGEbookReaderConfigStore` methods in `ebook_reader.go`. + +Validation: +- authenticated user required +- `content_id` required +- `config` must decode to a JSON object +- content access checked with `FileAuthorizer.ItemAccess.EnsureAccessible` + +- [ ] **Step 4: Wire routes and store** + +In `internal/api/router.go`, create the store when `deps.DB != nil`, assign it to `ebookReaderHandler`, and add: + +```go +r.Get("/{content_id}/reader-config", ebookReaderHandler.HandleGetConfig) +r.Put("/{content_id}/reader-config", ebookReaderHandler.HandleSaveConfig) +``` + +- [ ] **Step 5: Add web API wrapper** + +Create `web/src/reader/ebookReaderApi.ts` with: + +```ts +export function ebookReaderConfigPath(contentID: string): string +export async function fetchEbookReaderConfig(contentID: string): Promise> +export async function saveEbookReaderConfig(contentID: string, config: Record): Promise> +``` + +- [ ] **Step 6: Move settings persistence from localStorage to server** + +Update `EbookReader.tsx` to fetch reader config on load and save settings through the config endpoint. Keep a local fallback only until the server value arrives. + +- [ ] **Step 7: Verify and commit** + +Run: + +```bash +go test ./internal/api/handlers -run 'TestEbookReader.*Config' -count=1 +cd web && pnpm test src/pages/EbookReader.test.tsx src/reader/FoliateBookReader.test.ts --run +cd web && pnpm build +``` + +Commit: + +```bash +git add migrations/sql/20260608000300_ebook_reader_state.sql internal/api/handlers/ebook_reader.go internal/api/handlers/ebook_reader_test.go internal/api/router.go web/src/reader/ebookReaderApi.ts web/src/pages/EbookReader.tsx web/src/pages/EbookReader.test.tsx +git commit -m "feat: persist ebook reader config" +``` + +## Task 2: Server-Persisted Annotations And Bookmarks + +**Files:** +- Modify: `migrations/sql/20260608000300_ebook_reader_state.sql` +- Modify: `internal/api/handlers/ebook_reader.go` +- Modify: `internal/api/handlers/ebook_reader_test.go` +- Modify: `internal/api/router.go` +- Modify: `web/src/reader/ebookReaderApi.ts` +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Modify: `web/src/pages/EbookReader.tsx` + +- [ ] **Step 1: Write failing annotation handler tests** + +Cover list, create, update, delete. Test annotation fields: + +```json +{ + "kind": "highlight", + "cfi_range": "epubcfi(/6/4,/1:0,/1:12)", + "selected_text": "sample text", + "note": "note text", + "style": "highlight", + "color": "#facc15" +} +``` + +Run: + +```bash +go test ./internal/api/handlers -run 'TestEbookReader.*Annotation|TestEbookReader.*Bookmark' -count=1 +``` + +Expected: fail because annotation APIs do not exist. + +- [ ] **Step 2: Add annotation table** + +Extend migration with: + +```sql +CREATE TABLE ebook_reader_annotations ( + id TEXT PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + profile_id TEXT NOT NULL, + content_id TEXT NOT NULL REFERENCES media_items(content_id) ON DELETE CASCADE, + kind TEXT NOT NULL CHECK (kind IN ('highlight', 'note', 'bookmark')), + cfi_range TEXT, + location TEXT, + selected_text TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + style TEXT NOT NULL DEFAULT 'highlight', + color TEXT NOT NULL DEFAULT '#facc15', + metadata JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CHECK ((kind = 'bookmark' AND location IS NOT NULL) OR (kind <> 'bookmark' AND cfi_range IS NOT NULL)) +); + +CREATE INDEX ebook_reader_annotations_book + ON ebook_reader_annotations (user_id, profile_id, content_id, updated_at DESC); +``` + +- [ ] **Step 3: Implement annotation store and handlers** + +Add handlers: +- `GET /ebooks/{content_id}/annotations` +- `POST /ebooks/{content_id}/annotations` +- `PATCH /ebooks/{content_id}/annotations/{annotation_id}` +- `DELETE /ebooks/{content_id}/annotations/{annotation_id}` + +- [ ] **Step 4: Wire Foliate annotation drawing and selection** + +Extend `FoliateBookReaderHandle` with: +- `createSelectionAnnotation()` +- `clearSelection()` + +Draw stored annotations using Foliate `addAnnotation`. + +- [ ] **Step 5: Add reader UI** + +Add: +- selection popover +- highlight button +- note button +- bookmark button +- annotation list in the side panel +- delete/update note controls + +- [ ] **Step 6: Verify and commit** + +Run handler tests, web tests, and build. Commit: + +```bash +git commit -m "feat: add ebook annotations and bookmarks" +``` + +## Task 3: Reader Tools, TTS, And Reading Aids + +**Files:** +- Create: `web/src/hooks/useTTS.ts` +- Create: `web/src/hooks/useScreenWakeLock.ts` +- Create: `web/src/hooks/useEinkMode.ts` +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Modify: `web/src/pages/EbookReader.tsx` +- Modify: `web/src/pages/EbookReader.test.tsx` + +- [ ] **Step 1: Port focused hooks from personal reader** + +Bring over: +- Web Speech TTS controller +- screen wake lock hook +- e-ink body-class hook + +- [ ] **Step 2: Add readable text handle** + +Expose `getReadableText()` from `FoliateBookReader` for TTS. + +- [ ] **Step 3: Add UI controls** + +Add side-panel controls for: +- Speak current text +- Pause/resume/stop +- voice/rate/pitch +- wake lock +- e-ink mode + +- [ ] **Step 4: Add content popups and helpers** + +Add selection popover actions: +- define +- translate + +Add reader content popup handling for footnotes/images/tables when Foliate emits them. + +- [ ] **Step 5: Verify and commit** + +Run focused web tests and build. Commit: + +```bash +git commit -m "feat: add ebook reader tools and aids" +``` + +## Task 4: Advanced Reader Settings + +**Files:** +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Modify: `web/src/pages/EbookReader.tsx` +- Modify: `web/src/pages/EbookReader.test.tsx` + +- [ ] **Step 1: Add advanced reader settings** + +Add server-persisted settings for: +- RTL +- writing mode +- zoom/scale +- brightness +- hyphenation toggle +- custom font selection/upload if API support is added in a later task + +- [ ] **Step 2: Verify and commit** + +Run focused tests and build. Commit: + +```bash +git commit -m "feat: add ebook advanced reader settings" +``` + +## Self-Review + +- The plan covers server persistence first, matching the user's explicit preference. +- The plan keeps ebook features in core and metadata in plugins, matching the audiobook pattern. +- The plan avoids extra ebook catalog tables; added tables are reader-user-state only. +- The biggest implementation risk is annotation rendering against Foliate selection APIs; Task 2 isolates it after backend persistence exists. +- The migration filename is intentionally after existing ebook migrations and can be adjusted if another migration is added before implementation. diff --git a/docs/superpowers/plans/2026-06-08-ebook-reader-shell-parity.md b/docs/superpowers/plans/2026-06-08-ebook-reader-shell-parity.md new file mode 100644 index 00000000..73ed0a0d --- /dev/null +++ b/docs/superpowers/plans/2026-06-08-ebook-reader-shell-parity.md @@ -0,0 +1,68 @@ +# Ebook Reader Shell Parity Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Bring the core ebook reader up to the first useful parity slice from `personal/silo-plugin-ebooks`: TOC, search, progress scrub, reader settings, and keyboard navigation. + +**Architecture:** Keep the current core reader API and persistence model. Extend `FoliateBookReader` with imperative methods for TOC, search, href/fraction navigation, and runtime style updates; keep `EbookReader` responsible for the chrome/panels/settings state. Store reader preferences in localStorage for this first local slice so no backend schema is added. + +**Tech Stack:** React 19, React Router, TanStack Query, foliate-js custom element, existing Silo UI components, Vitest. + +--- + +### Task 1: Reader Handle Capabilities + +**Files:** +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Test: `web/src/reader/FoliateBookReader.test.ts` + +- [ ] Add exported types `ReaderSettings`, `ReaderSearchOptions`, `ReaderSearchResult`, and `ReaderReadyState`. +- [ ] Extend `FoliateBookReaderHandle` with `goToFraction`, `goTo`, `search`, `clearSearch`, and `applySettings`. +- [ ] Add a `settings?: ReaderSettings` prop and convert `readerStyles()` to accept settings. +- [ ] Preserve existing progress save/restore behavior. +- [ ] Verify with `pnpm vitest run src/reader/FoliateBookReader.test.ts`. + +### Task 2: TOC and Search Panel + +**Files:** +- Modify: `web/src/pages/EbookReader.tsx` +- Test: `web/src/pages/EbookReader.test.tsx` + +- [ ] Add panel state for `toc`, `searchResults`, `searchTerm`, and current tab. +- [ ] Render side panel tabs for Contents, Search, and Settings. +- [ ] Wire TOC items to `readerRef.current.goTo(href)`. +- [ ] Wire search form to `readerRef.current.search(term)` and result clicks to `goTo(cfi)`. +- [ ] Verify with `pnpm vitest run src/pages/EbookReader.test.tsx`. + +### Task 3: Reader Settings + +**Files:** +- Modify: `web/src/pages/EbookReader.tsx` +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Test: `web/src/pages/EbookReader.test.tsx` + +- [ ] Add localStorage-backed settings for theme, font size, font family, line height, margin, max width, spread, and flow. +- [ ] Render compact controls in the Settings tab. +- [ ] Apply settings live through `FoliateBookReader`. +- [ ] Verify settings persist across remount in tests. + +### Task 4: Progress Scrub and Keyboard Navigation + +**Files:** +- Modify: `web/src/pages/EbookReader.tsx` +- Modify: `web/src/reader/FoliateBookReader.tsx` +- Test: `web/src/pages/EbookReader.test.tsx` + +- [ ] Add a progress range input in the header. +- [ ] Call `goToFraction` on commit/change and update display from relocate events. +- [ ] Add ArrowLeft/ArrowRight keyboard navigation on the reader page. +- [ ] Verify with page-level tests. + +### Task 5: Local Verification + +**Files:** +- No source changes. + +- [ ] Run `cd web && pnpm run build`. +- [ ] Run `GOWORK=off go test ./internal/api/handlers ./internal/scanner`. +- [ ] Keep changes local; do not push. diff --git a/go.mod b/go.mod index f3013dc9..bb9ec600 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( github.com/zishang520/socket.io/v2 v2.5.0 go.n16f.net/thumbhash v1.1.0 golang.org/x/image v0.41.0 + golang.org/x/net v0.55.0 google.golang.org/genproto/googleapis/rpc v0.0.0-20260420184626-e10c466a9529 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) @@ -70,7 +71,6 @@ require ( github.com/zishang520/webtransport-go v0.9.1 // indirect go.opentelemetry.io/otel/sdk/metric v1.41.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.55.0 // indirect ) require ( diff --git a/internal/api/handlers/catalog.go b/internal/api/handlers/catalog.go index 04b33405..38eb6efe 100644 --- a/internal/api/handlers/catalog.go +++ b/internal/api/handlers/catalog.go @@ -10,6 +10,7 @@ import ( "strings" "time" + apimw "github.com/Silo-Server/silo-server/internal/api/middleware" "github.com/Silo-Server/silo-server/internal/catalog" "github.com/Silo-Server/silo-server/internal/models" "github.com/Silo-Server/silo-server/internal/sections" @@ -89,6 +90,7 @@ func (h *CatalogHandler) HandleGetCatalog(w http.ResponseWriter, r *http.Request h.itemsH.accessFilter(r), overlaySummaries, store, + apimw.GetUserID(r.Context()), profileID, ) items := make([]itemListResponse, 0, len(result.Items)) diff --git a/internal/api/handlers/catalog_resources.go b/internal/api/handlers/catalog_resources.go index efce0399..efb38368 100644 --- a/internal/api/handlers/catalog_resources.go +++ b/internal/api/handlers/catalog_resources.go @@ -497,8 +497,8 @@ func (h *CatalogResourceHandler) enrichItemDetail(r *http.Request, detail *catal detail.SeasonUserData = h.items.getAggregateUserData(r, episodes) } } - case "movie", "episode", "audiobook": - detail.SeasonUserData = h.items.getLeafUserData(r, detail.ContentID) + case "movie", "episode", "audiobook", "ebook": + detail.SeasonUserData = h.items.getLeafUserData(r, detail.ContentID, detail.Type) applyEffectiveEditionPreference(detail.SeasonUserData, &detail.EffectiveVersionEditionKey) } diff --git a/internal/api/handlers/ebook_read_state.go b/internal/api/handlers/ebook_read_state.go new file mode 100644 index 00000000..e6ad71c4 --- /dev/null +++ b/internal/api/handlers/ebook_read_state.go @@ -0,0 +1,150 @@ +package handlers + +import ( + "context" + "fmt" + "time" + + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/models" +) + +// Ebook read state lives exclusively in ebook_reader_progress: every consumer +// (user-state Played, catalog watched/in_progress filters, Continue Reading, +// sort metrics, recommendations) keys off progress crossing +// models.EbookFinishedProgressThreshold. The native watched endpoints therefore +// write that table instead of user_watch_progress/user_watch_history. The +// helpers live in this package — next to the ebook progress store and types — +// because the handler layer is the only producer today: the webhook-import +// matcher (internal/historyimport) only matches movie/series/episode kinds, so +// imported mark-played events can never resolve to an ebook content ID. + +// EbookReadStateStore is the ebook_reader_progress surface needed to set or +// clear an ebook's read state from the watched endpoints. +// *PGEbookReaderProgressStore implements it. +type EbookReadStateStore interface { + Get(ctx context.Context, userID int, profileID string, contentID string) (*EbookReaderProgress, error) + Upsert(ctx context.Context, progress EbookReaderProgress) error + Delete(ctx context.Context, userID int, profileID string, contentID string) error +} + +// EbookReaderProgressReadWriter is the full progress-store surface the items +// handler needs: batch reads for list/user-state responses plus read-state +// writes for the watched endpoints. +type EbookReaderProgressReadWriter interface { + EbookReaderProgressLister + EbookReadStateStore +} + +// markEbookRead marks an ebook as finished by upserting its reader-progress +// row with progress = 1.0 (>= models.EbookFinishedProgressThreshold). An +// existing row keeps its file_id and location so the reader still reopens at +// the user's last position even though the book is marked read; a missing row +// references the item's preferred reader file (resolved lazily via +// defaultFileID, since ebook_reader_progress.file_id is NOT NULL) with an +// empty location meaning "start at the beginning". A fresh updated_at also +// resurfaces a previously hidden book, mirroring how re-watching resurfaces +// hidden video history. +func markEbookRead( + ctx context.Context, + store EbookReadStateStore, + userID int, + profileID, contentID string, + now time.Time, + defaultFileID func(ctx context.Context) (int, error), +) error { + existing, err := store.Get(ctx, userID, profileID, contentID) + if err != nil { + return err + } + progress := EbookReaderProgress{ + UserID: userID, + ProfileID: profileID, + ContentID: contentID, + Progress: 1.0, + UpdatedAt: now, + } + if existing != nil { + progress.FileID = existing.FileID + progress.Location = existing.Location + } else { + fileID, err := defaultFileID(ctx) + if err != nil { + return err + } + progress.FileID = fileID + } + return store.Upsert(ctx, progress) +} + +// markEbookUnread clears an ebook's read state by deleting its reader-progress +// row — the direct analog of the video unwatch path, where +// userstore.ClearProgress DELETEs the user_watch_progress row (dropping the +// resume position along with the watched flag). +func markEbookUnread( + ctx context.Context, + store EbookReadStateStore, + userID int, + profileID, contentID string, +) error { + return store.Delete(ctx, userID, profileID, contentID) +} + +// setEbookReadState applies the watched toggle for an ebook target resolved by +// resolveWatchedTargets, which has already enforced the access filter on the +// item. Scoping matches the rest of the ebook progress code: user_id + +// profile_id. +func (h *ItemsHandler) setEbookReadState( + ctx context.Context, + userID int, + profileID, contentID string, + read bool, + filter catalog.AccessFilter, +) error { + if h.ebookReadStateStore == nil { + return fmt.Errorf("ebook reader progress store is not configured") + } + if !read { + return markEbookUnread(ctx, h.ebookReadStateStore, userID, profileID, contentID) + } + return markEbookRead(ctx, h.ebookReadStateStore, userID, profileID, contentID, time.Now().UTC(), func(ctx context.Context) (int, error) { + return h.defaultEbookFileID(ctx, contentID, filter) + }) +} + +// defaultEbookFileID resolves the file a fresh mark-read progress row should +// reference, respecting the caller's access filter. +func (h *ItemsHandler) defaultEbookFileID(ctx context.Context, contentID string, filter catalog.AccessFilter) (int, error) { + if h.fileRepo == nil { + return 0, catalog.ErrItemNotFound + } + files, err := h.fileRepo.GetByContentID(ctx, contentID) + if err != nil { + return 0, err + } + file := preferredEbookReadFile(catalog.FilterMediaFilesByAccess(files, filter)) + if file == nil { + return 0, catalog.ErrItemNotFound + } + return file.ID, nil +} + +// preferredEbookReadFile mirrors the web reader's default file choice +// (web/src/pages/ItemDetail/EbookContent.tsx preferredReadVersion): prefer an +// EPUB version, otherwise the first reader-supported ebook file. Callers must +// pass access-filtered files. +func preferredEbookReadFile(files []*models.MediaFile) *models.MediaFile { + var first *models.MediaFile + for _, file := range files { + if !isEbookFile(file) { + continue + } + if ebookReaderFormat(file.FilePath, file.Container) == "epub" { + return file + } + if first == nil { + first = file + } + } + return first +} diff --git a/internal/api/handlers/ebook_read_state_test.go b/internal/api/handlers/ebook_read_state_test.go new file mode 100644 index 00000000..94464695 --- /dev/null +++ b/internal/api/handlers/ebook_read_state_test.go @@ -0,0 +1,230 @@ +package handlers + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/models" +) + +// fakeEbookReadStateStore is an in-memory EbookReaderProgressReadWriter keyed +// by content ID for a single (user, profile) scope. +type fakeEbookReadStateStore struct { + rows map[string]EbookReaderProgress +} + +func newFakeEbookReadStateStore() *fakeEbookReadStateStore { + return &fakeEbookReadStateStore{rows: map[string]EbookReaderProgress{}} +} + +func (f *fakeEbookReadStateStore) Get(_ context.Context, _ int, _ string, contentID string) (*EbookReaderProgress, error) { + row, ok := f.rows[contentID] + if !ok { + return nil, nil + } + return &row, nil +} + +func (f *fakeEbookReadStateStore) Upsert(_ context.Context, progress EbookReaderProgress) error { + f.rows[progress.ContentID] = progress + return nil +} + +func (f *fakeEbookReadStateStore) Delete(_ context.Context, _ int, _ string, contentID string) error { + delete(f.rows, contentID) + return nil +} + +func (f *fakeEbookReadStateStore) ListByContentIDs(_ context.Context, _ int, _ string, contentIDs []string) (map[string]EbookReaderProgress, error) { + result := make(map[string]EbookReaderProgress, len(contentIDs)) + for _, contentID := range contentIDs { + if row, ok := f.rows[contentID]; ok { + result[contentID] = row + } + } + return result, nil +} + +// fakeEbookFileProvider implements EpisodeFileProvider for ebook file lookups. +type fakeEbookFileProvider struct { + files map[string][]*models.MediaFile + err error +} + +func (f *fakeEbookFileProvider) GetByContentID(_ context.Context, contentID string) ([]*models.MediaFile, error) { + if f.err != nil { + return nil, f.err + } + return f.files[contentID], nil +} + +func (f *fakeEbookFileProvider) GetByEpisodeID(context.Context, string) ([]*models.MediaFile, error) { + return nil, nil +} + +func (f *fakeEbookFileProvider) ListByContentIDs(context.Context, []string) (map[string][]*models.MediaFile, error) { + return nil, nil +} + +func TestMarkEbookReadPreservesExistingFileAndLocation(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + store.rows["ebook-1"] = EbookReaderProgress{ + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-1", + FileID: 7, + Location: "epubcfi(/6/14!/4/2/14)", + Progress: 0.42, + UpdatedAt: time.Date(2026, 6, 1, 8, 0, 0, 0, time.UTC), + } + now := time.Date(2026, 6, 9, 12, 0, 0, 0, time.UTC) + + err := markEbookRead(ctx, store, 42, "profile-1", "ebook-1", now, func(context.Context) (int, error) { + t.Fatal("defaultFileID must not be called when a progress row exists") + return 0, nil + }) + if err != nil { + t.Fatalf("markEbookRead: %v", err) + } + + row := store.rows["ebook-1"] + if row.Progress != 1.0 { + t.Fatalf("progress = %v, want 1.0", row.Progress) + } + if row.FileID != 7 || row.Location != "epubcfi(/6/14!/4/2/14)" { + t.Fatalf("file/location not preserved: %+v", row) + } + if !row.UpdatedAt.Equal(now) { + t.Fatalf("updated_at = %v, want %v", row.UpdatedAt, now) + } +} + +func TestMarkEbookReadUsesDefaultFileWhenNoProgressExists(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + now := time.Date(2026, 6, 9, 12, 0, 0, 0, time.UTC) + + err := markEbookRead(ctx, store, 42, "profile-1", "ebook-1", now, func(context.Context) (int, error) { + return 12, nil + }) + if err != nil { + t.Fatalf("markEbookRead: %v", err) + } + + row, ok := store.rows["ebook-1"] + if !ok { + t.Fatal("expected a progress row to be created") + } + if row.Progress != 1.0 || row.FileID != 12 || row.Location != "" { + t.Fatalf("row = %+v, want progress 1.0 with file 12 and empty location", row) + } + if row.UserID != 42 || row.ProfileID != "profile-1" { + t.Fatalf("row scope = user %d profile %q, want user 42 profile-1", row.UserID, row.ProfileID) + } +} + +func TestMarkEbookReadPropagatesDefaultFileError(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + + err := markEbookRead(ctx, store, 42, "profile-1", "ebook-1", time.Now().UTC(), func(context.Context) (int, error) { + return 0, catalog.ErrItemNotFound + }) + if !errors.Is(err, catalog.ErrItemNotFound) { + t.Fatalf("err = %v, want catalog.ErrItemNotFound", err) + } + if len(store.rows) != 0 { + t.Fatalf("no row must be written on error, got %+v", store.rows) + } +} + +func TestMarkEbookUnreadDeletesProgressRow(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + store.rows["ebook-1"] = EbookReaderProgress{ContentID: "ebook-1", FileID: 7, Progress: 1.0} + + if err := markEbookUnread(ctx, store, 42, "profile-1", "ebook-1"); err != nil { + t.Fatalf("markEbookUnread: %v", err) + } + if _, ok := store.rows["ebook-1"]; ok { + t.Fatal("progress row must be deleted on mark unread") + } +} + +func TestPreferredEbookReadFilePrefersEpub(t *testing.T) { + pdf := &models.MediaFile{ID: 1, BaseType: "ebook", FilePath: "/books/a.pdf", Container: "pdf"} + epub := &models.MediaFile{ID: 2, BaseType: "ebook", FilePath: "/books/a.epub", Container: "epub"} + video := &models.MediaFile{ID: 3, BaseType: "movie", FilePath: "/movies/a.mkv", Container: "mkv"} + + if got := preferredEbookReadFile([]*models.MediaFile{video, pdf, epub}); got == nil || got.ID != 2 { + t.Fatalf("preferredEbookReadFile = %+v, want epub file 2", got) + } + if got := preferredEbookReadFile([]*models.MediaFile{video, pdf}); got == nil || got.ID != 1 { + t.Fatalf("preferredEbookReadFile = %+v, want first reader-supported file 1", got) + } + if got := preferredEbookReadFile([]*models.MediaFile{video}); got != nil { + t.Fatalf("preferredEbookReadFile = %+v, want nil without ebook files", got) + } +} + +func TestSetEbookReadStateMarkReadShowsPlayedUserState(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + handler := &ItemsHandler{ + ebookProgressStore: store, + ebookReadStateStore: store, + fileRepo: &fakeEbookFileProvider{files: map[string][]*models.MediaFile{ + "ebook-1": {{ID: 5, BaseType: "ebook", FilePath: "/books/b.epub", Container: "epub"}}, + }}, + } + + if err := handler.setEbookReadState(ctx, 42, "profile-1", "ebook-1", true, catalog.AccessFilter{}); err != nil { + t.Fatalf("setEbookReadState(read): %v", err) + } + + userStore := newProfileTestStore(t) + items := []*models.MediaItem{{ContentID: "ebook-1", Type: "ebook", Title: "Book"}} + states, err := resolveItemUserStatesWithOptions(ctx, userStore, "profile-1", nil, items, itemUserStateOptions{ + UserID: 42, + EbookProgressStore: store, + }) + if err != nil { + t.Fatalf("resolveItemUserStatesWithOptions: %v", err) + } + if states["ebook-1"] == nil || !states["ebook-1"].Played { + t.Fatalf("user state = %+v, want played after mark read", states["ebook-1"]) + } + + // A marked-read book is finished, not in progress: the reader-progress + // response derived from the row must exclude it from Continue Reading. + row := store.rows["ebook-1"] + if row.Progress < models.EbookFinishedProgressThreshold { + t.Fatalf("progress %v must cross the finished threshold", row.Progress) + } + + if err := handler.setEbookReadState(ctx, 42, "profile-1", "ebook-1", false, catalog.AccessFilter{}); err != nil { + t.Fatalf("setEbookReadState(unread): %v", err) + } + if _, ok := store.rows["ebook-1"]; ok { + t.Fatal("mark unread must delete the reader progress row") + } +} + +func TestSetEbookReadStateFailsWithoutAccessibleFile(t *testing.T) { + ctx := context.Background() + store := newFakeEbookReadStateStore() + handler := &ItemsHandler{ + ebookProgressStore: store, + ebookReadStateStore: store, + fileRepo: &fakeEbookFileProvider{}, + } + + err := handler.setEbookReadState(ctx, 42, "profile-1", "ebook-1", true, catalog.AccessFilter{}) + if !errors.Is(err, catalog.ErrItemNotFound) { + t.Fatalf("err = %v, want catalog.ErrItemNotFound", err) + } +} diff --git a/internal/api/handlers/ebook_reader.go b/internal/api/handlers/ebook_reader.go new file mode 100644 index 00000000..40d4865e --- /dev/null +++ b/internal/api/handlers/ebook_reader.go @@ -0,0 +1,1069 @@ +package handlers + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "mime" + "net/http" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/go-chi/chi/v5" + "github.com/google/uuid" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" + + apimw "github.com/Silo-Server/silo-server/internal/api/middleware" + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/models" +) + +// EbookReaderProgress is the persisted reader position for one profile and ebook. +type EbookReaderProgress struct { + UserID int `json:"-"` + ProfileID string `json:"-"` + ContentID string `json:"content_id"` + FileID int `json:"file_id"` + Location string `json:"location"` + Progress float64 `json:"progress"` + UpdatedAt time.Time `json:"updated_at"` +} + +type EbookReaderProgressStore interface { + Get(ctx context.Context, userID int, profileID string, contentID string) (*EbookReaderProgress, error) + Upsert(ctx context.Context, progress EbookReaderProgress) error +} + +// EbookReaderConfig is persisted reader configuration for one profile and ebook. +type EbookReaderConfig struct { + UserID int `json:"-"` + ProfileID string `json:"-"` + ContentID string `json:"content_id"` + Config json.RawMessage `json:"config"` + UpdatedAt time.Time `json:"updated_at"` +} + +type EbookReaderConfigStore interface { + Get(ctx context.Context, userID int, profileID string, contentID string) (*EbookReaderConfig, error) + Upsert(ctx context.Context, config EbookReaderConfig) error +} + +// EbookReaderAnnotation is a persisted reader annotation or bookmark. +type EbookReaderAnnotation struct { + ID string `json:"id"` + UserID int `json:"-"` + ProfileID string `json:"-"` + ContentID string `json:"content_id"` + Kind string `json:"kind"` + CFIRange string `json:"cfi_range,omitempty"` + Location string `json:"location,omitempty"` + SelectedText string `json:"selected_text"` + Note string `json:"note"` + Style string `json:"style"` + Color string `json:"color"` + Metadata json.RawMessage `json:"metadata"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +type EbookReaderAnnotationStore interface { + List(ctx context.Context, userID int, profileID string, contentID string) ([]EbookReaderAnnotation, error) + Create(ctx context.Context, annotation EbookReaderAnnotation) error + // Update atomically rewrites the scoped annotation: the stored row is + // read under a write lock, merge is invoked with the current value, and + // the merged result is written back in the same transaction so concurrent + // PATCHes cannot lose updates. It returns (nil, nil) when no annotation + // matches the scope and propagates merge errors unchanged. + Update( + ctx context.Context, + userID int, + profileID string, + contentID string, + annotationID string, + merge func(existing EbookReaderAnnotation) (EbookReaderAnnotation, error), + ) (*EbookReaderAnnotation, error) + Delete(ctx context.Context, userID int, profileID string, contentID string, annotationID string) error +} + +// EbookReaderHandler serves ebook files for the in-app reader. +type EbookReaderHandler struct { + FileAuthorizer *MediaFileAuthorizer + ProgressStore EbookReaderProgressStore + ConfigStore EbookReaderConfigStore + AnnotationStore EbookReaderAnnotationStore +} + +func NewEbookReaderHandler(authorizer *MediaFileAuthorizer) *EbookReaderHandler { + return &EbookReaderHandler{FileAuthorizer: authorizer} +} + +// HandleReadFile serves an ebook file inline with byte-range support. +func (h *EbookReaderHandler) HandleReadFile(w http.ResponseWriter, r *http.Request) { + if apimw.GetUserID(r.Context()) == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return + } + if h == nil || h.FileAuthorizer == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook reader is not configured") + return + } + + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + fileID, err := strconv.Atoi(chi.URLParam(r, "file_id")) + if contentID == "" || err != nil || fileID <= 0 { + writeError(w, http.StatusBadRequest, "bad_request", "content_id and file_id are required") + return + } + + file, err := h.FileAuthorizer.Authorize(r, fileID) + if err != nil { + h.writeReadError(w, err) + return + } + if file == nil || file.ContentID != contentID || !isEbookFile(file) { + writeError(w, http.StatusNotFound, "not_found", "Ebook file not found") + return + } + + if err := serveEbookInline(w, r, file); err != nil { + if errors.Is(err, catalog.ErrItemNotFound) { + writeError(w, http.StatusNotFound, "not_found", "Ebook file not found") + return + } + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to serve ebook file") + } +} + +// Request body caps for the ebook reader write endpoints. Progress payloads +// are tiny; reader config and annotations can carry user text and metadata +// but should never approach these limits. +const ( + ebookReaderProgressMaxBodySize = 16 << 10 // 16 KiB + ebookReaderConfigMaxBodySize = 256 << 10 // 256 KiB + ebookReaderAnnotationMaxBodySize = 256 << 10 // 256 KiB +) + +// decodeEbookReaderBody decodes a JSON request body with a hard size cap. +// It writes the error response and returns false when decoding fails. +func decodeEbookReaderBody(w http.ResponseWriter, r *http.Request, maxBodySize int64, dst any) bool { + r.Body = http.MaxBytesReader(w, r.Body, maxBodySize) + if err := json.NewDecoder(r.Body).Decode(dst); err != nil { + var maxBytesErr *http.MaxBytesError + if errors.As(err, &maxBytesErr) { + writeError(w, http.StatusRequestEntityTooLarge, "too_large", "Request body is too large") + return false + } + writeError(w, http.StatusBadRequest, "bad_request", "Invalid request body") + return false + } + return true +} + +type ebookReaderProgressRequest struct { + FileID int `json:"file_id"` + Location string `json:"location"` + Progress float64 `json:"progress"` +} + +type ebookReaderConfigRequest struct { + Config json.RawMessage `json:"config"` +} + +type ebookReaderAnnotationRequest struct { + Kind string `json:"kind"` + CFIRange string `json:"cfi_range"` + Location string `json:"location"` + SelectedText string `json:"selected_text"` + Note string `json:"note"` + Style string `json:"style"` + Color string `json:"color"` + Metadata json.RawMessage `json:"metadata"` +} + +// ebookReaderAnnotationPatchRequest distinguishes absent fields (nil: keep the +// stored value) from present fields (set, including empty values to clear). +type ebookReaderAnnotationPatchRequest struct { + Kind *string `json:"kind"` + CFIRange *string `json:"cfi_range"` + Location *string `json:"location"` + SelectedText *string `json:"selected_text"` + Note *string `json:"note"` + Style *string `json:"style"` + Color *string `json:"color"` + Metadata json.RawMessage `json:"metadata"` +} + +func (h *EbookReaderHandler) HandleGetProgress(w http.ResponseWriter, r *http.Request) { + userID := apimw.GetUserID(r.Context()) + profileID := apimw.GetProfileID(r.Context()) + if userID == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return + } + if h == nil || h.ProgressStore == nil || h.FileAuthorizer == nil || h.FileAuthorizer.ItemAccess == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook reader progress is not configured") + return + } + + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + if contentID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "content_id is required") + return + } + if err := h.FileAuthorizer.ItemAccess.EnsureAccessible(r.Context(), contentID, requestAccessFilter(r)); err != nil { + h.writeReadError(w, err) + return + } + + progress, err := h.ProgressStore.Get(r.Context(), userID, profileID, contentID) + if err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to load ebook progress") + return + } + if progress == nil { + writeJSON(w, http.StatusOK, map[string]any{}) + return + } + writeJSON(w, http.StatusOK, progress) +} + +func (h *EbookReaderHandler) HandleSaveProgress(w http.ResponseWriter, r *http.Request) { + userID := apimw.GetUserID(r.Context()) + profileID := apimw.GetProfileID(r.Context()) + if userID == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return + } + if h == nil || h.ProgressStore == nil || h.FileAuthorizer == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook reader progress is not configured") + return + } + + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + if contentID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "content_id is required") + return + } + + var req ebookReaderProgressRequest + if !decodeEbookReaderBody(w, r, ebookReaderProgressMaxBodySize, &req) { + return + } + req.Location = strings.TrimSpace(req.Location) + if req.FileID <= 0 || req.Location == "" || req.Progress < 0 || req.Progress > 1 { + writeError(w, http.StatusBadRequest, "bad_request", "file_id, location, and progress are required") + return + } + + file, err := h.FileAuthorizer.Authorize(r, req.FileID) + if err != nil { + h.writeReadError(w, err) + return + } + if file == nil || file.ContentID != contentID || !isEbookFile(file) { + writeError(w, http.StatusNotFound, "not_found", "Ebook file not found") + return + } + + progress := EbookReaderProgress{ + UserID: userID, + ProfileID: profileID, + ContentID: contentID, + FileID: req.FileID, + Location: req.Location, + Progress: req.Progress, + UpdatedAt: time.Now().UTC(), + } + if err := h.ProgressStore.Upsert(r.Context(), progress); err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to save ebook progress") + return + } + writeJSON(w, http.StatusOK, progress) +} + +func (h *EbookReaderHandler) HandleGetConfig(w http.ResponseWriter, r *http.Request) { + userID := apimw.GetUserID(r.Context()) + profileID := apimw.GetProfileID(r.Context()) + if userID == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return + } + if h == nil || h.ConfigStore == nil || h.FileAuthorizer == nil || h.FileAuthorizer.ItemAccess == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook reader config is not configured") + return + } + + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + if contentID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "content_id is required") + return + } + if err := h.FileAuthorizer.ItemAccess.EnsureAccessible(r.Context(), contentID, requestAccessFilter(r)); err != nil { + h.writeReadError(w, err) + return + } + + config, err := h.ConfigStore.Get(r.Context(), userID, profileID, contentID) + if err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to load ebook reader config") + return + } + if config == nil { + writeJSON(w, http.StatusOK, map[string]any{"config": map[string]any{}}) + return + } + writeJSON(w, http.StatusOK, config) +} + +func (h *EbookReaderHandler) HandleSaveConfig(w http.ResponseWriter, r *http.Request) { + userID := apimw.GetUserID(r.Context()) + profileID := apimw.GetProfileID(r.Context()) + if userID == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return + } + if h == nil || h.ConfigStore == nil || h.FileAuthorizer == nil || h.FileAuthorizer.ItemAccess == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook reader config is not configured") + return + } + + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + if contentID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "content_id is required") + return + } + + var req ebookReaderConfigRequest + if !decodeEbookReaderBody(w, r, ebookReaderConfigMaxBodySize, &req) { + return + } + if !jsonObject(req.Config) { + writeError(w, http.StatusBadRequest, "bad_request", "config must be a JSON object") + return + } + if err := h.FileAuthorizer.ItemAccess.EnsureAccessible(r.Context(), contentID, requestAccessFilter(r)); err != nil { + h.writeReadError(w, err) + return + } + + config := EbookReaderConfig{ + UserID: userID, + ProfileID: profileID, + ContentID: contentID, + Config: req.Config, + UpdatedAt: time.Now().UTC(), + } + if err := h.ConfigStore.Upsert(r.Context(), config); err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to save ebook reader config") + return + } + writeJSON(w, http.StatusOK, config) +} + +func jsonObject(raw json.RawMessage) bool { + if len(raw) == 0 { + return false + } + var value map[string]any + return json.Unmarshal(raw, &value) == nil && value != nil +} + +func (h *EbookReaderHandler) HandleListAnnotations(w http.ResponseWriter, r *http.Request) { + userID, profileID, contentID, ok := h.annotationRequestScope(w, r) + if !ok { + return + } + items, err := h.AnnotationStore.List(r.Context(), userID, profileID, contentID) + if err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to load ebook annotations") + return + } + writeJSON(w, http.StatusOK, map[string]any{"items": items}) +} + +func (h *EbookReaderHandler) HandleCreateAnnotation(w http.ResponseWriter, r *http.Request) { + userID, profileID, contentID, ok := h.annotationRequestScope(w, r) + if !ok { + return + } + var req ebookReaderAnnotationRequest + if !decodeEbookReaderBody(w, r, ebookReaderAnnotationMaxBodySize, &req) { + return + } + annotation, err := buildEbookReaderAnnotation(req) + if err != nil { + writeError(w, http.StatusBadRequest, "bad_request", err.Error()) + return + } + now := time.Now().UTC() + annotation.ID = uuid.NewString() + annotation.UserID = userID + annotation.ProfileID = profileID + annotation.ContentID = contentID + annotation.CreatedAt = now + annotation.UpdatedAt = now + if err := h.AnnotationStore.Create(r.Context(), annotation); err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to create ebook annotation") + return + } + writeJSON(w, http.StatusCreated, annotation) +} + +func (h *EbookReaderHandler) HandleUpdateAnnotation(w http.ResponseWriter, r *http.Request) { + userID, profileID, contentID, ok := h.annotationRequestScope(w, r) + if !ok { + return + } + annotationID := strings.TrimSpace(chi.URLParam(r, "annotation_id")) + if annotationID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "annotation_id is required") + return + } + var req ebookReaderAnnotationPatchRequest + if !decodeEbookReaderBody(w, r, ebookReaderAnnotationMaxBodySize, &req) { + return + } + // The merge runs inside the store transaction between the locked read and + // the write, so concurrent PATCHes serialize instead of losing updates. + var validationErr error + updated, err := h.AnnotationStore.Update( + r.Context(), userID, profileID, contentID, annotationID, + func(existing EbookReaderAnnotation) (EbookReaderAnnotation, error) { + merged, mergeErr := mergeEbookReaderAnnotationPatch(existing, req) + if mergeErr != nil { + validationErr = mergeErr + return EbookReaderAnnotation{}, mergeErr + } + merged.UpdatedAt = time.Now().UTC() + return merged, nil + }, + ) + if validationErr != nil { + writeError(w, http.StatusBadRequest, "bad_request", validationErr.Error()) + return + } + if err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to update ebook annotation") + return + } + if updated == nil { + writeError(w, http.StatusNotFound, "not_found", "Ebook annotation not found") + return + } + writeJSON(w, http.StatusOK, updated) +} + +func (h *EbookReaderHandler) HandleDeleteAnnotation(w http.ResponseWriter, r *http.Request) { + userID, profileID, contentID, ok := h.annotationRequestScope(w, r) + if !ok { + return + } + annotationID := strings.TrimSpace(chi.URLParam(r, "annotation_id")) + if annotationID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "annotation_id is required") + return + } + if err := h.AnnotationStore.Delete(r.Context(), userID, profileID, contentID, annotationID); err != nil { + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to delete ebook annotation") + return + } + w.WriteHeader(http.StatusNoContent) +} + +func (h *EbookReaderHandler) annotationRequestScope(w http.ResponseWriter, r *http.Request) (int, string, string, bool) { + userID := apimw.GetUserID(r.Context()) + profileID := apimw.GetProfileID(r.Context()) + if userID == 0 { + writeError(w, http.StatusUnauthorized, "unauthorized", "Authentication required") + return 0, "", "", false + } + if h == nil || h.AnnotationStore == nil || h.FileAuthorizer == nil || h.FileAuthorizer.ItemAccess == nil { + writeError(w, http.StatusServiceUnavailable, "unavailable", "Ebook annotations are not configured") + return 0, "", "", false + } + contentID := strings.TrimSpace(chi.URLParam(r, "content_id")) + if contentID == "" { + writeError(w, http.StatusBadRequest, "bad_request", "content_id is required") + return 0, "", "", false + } + if err := h.FileAuthorizer.ItemAccess.EnsureAccessible(r.Context(), contentID, requestAccessFilter(r)); err != nil { + h.writeReadError(w, err) + return 0, "", "", false + } + return userID, profileID, contentID, true +} + +// validateEbookReaderAnnotation enforces the annotation invariants shared by +// create and patch: a known kind, a location for bookmarks, a CFI range for +// highlights/notes, and object-shaped metadata. +func validateEbookReaderAnnotation(annotation EbookReaderAnnotation) error { + if annotation.Kind != "highlight" && annotation.Kind != "note" && annotation.Kind != "bookmark" { + return fmt.Errorf("kind must be highlight, note, or bookmark") + } + if annotation.Kind == "bookmark" { + if annotation.Location == "" { + return fmt.Errorf("location is required for bookmarks") + } + } else if annotation.CFIRange == "" { + return fmt.Errorf("cfi_range is required for annotations") + } + if !jsonObject(annotation.Metadata) { + return fmt.Errorf("metadata must be a JSON object") + } + return nil +} + +func buildEbookReaderAnnotation(req ebookReaderAnnotationRequest) (EbookReaderAnnotation, error) { + kind := strings.ToLower(strings.TrimSpace(req.Kind)) + if kind == "" { + kind = "highlight" + } + metadata := req.Metadata + if len(metadata) == 0 { + metadata = json.RawMessage(`{}`) + } + style := strings.TrimSpace(req.Style) + if style == "" { + style = "highlight" + } + color := strings.TrimSpace(req.Color) + if color == "" { + color = "#facc15" + } + annotation := EbookReaderAnnotation{ + Kind: kind, + CFIRange: strings.TrimSpace(req.CFIRange), + Location: strings.TrimSpace(req.Location), + SelectedText: strings.TrimSpace(req.SelectedText), + Note: strings.TrimSpace(req.Note), + Style: style, + Color: color, + Metadata: metadata, + } + if err := validateEbookReaderAnnotation(annotation); err != nil { + return EbookReaderAnnotation{}, err + } + return annotation, nil +} + +// mergeEbookReaderAnnotationPatch applies a PATCH request onto the stored +// annotation. Absent fields keep their stored values; present fields are set +// to the provided value (empty values clear). The merged result is validated +// against the same invariants as annotation creation. +func mergeEbookReaderAnnotationPatch( + existing EbookReaderAnnotation, + req ebookReaderAnnotationPatchRequest, +) (EbookReaderAnnotation, error) { + merged := existing + if req.Kind != nil { + merged.Kind = strings.ToLower(strings.TrimSpace(*req.Kind)) + } + if req.CFIRange != nil { + merged.CFIRange = strings.TrimSpace(*req.CFIRange) + } + if req.Location != nil { + merged.Location = strings.TrimSpace(*req.Location) + } + if req.SelectedText != nil { + merged.SelectedText = strings.TrimSpace(*req.SelectedText) + } + if req.Note != nil { + merged.Note = strings.TrimSpace(*req.Note) + } + if req.Style != nil { + merged.Style = strings.TrimSpace(*req.Style) + } + if req.Color != nil { + merged.Color = strings.TrimSpace(*req.Color) + } + if req.Metadata != nil { + merged.Metadata = req.Metadata + } + if err := validateEbookReaderAnnotation(merged); err != nil { + return EbookReaderAnnotation{}, err + } + return merged, nil +} + +func (h *EbookReaderHandler) writeReadError(w http.ResponseWriter, err error) { + switch { + case errors.Is(err, catalog.ErrItemNotFound), errors.Is(err, catalog.ErrEpisodeNotFound): + writeError(w, http.StatusNotFound, "not_found", "Ebook file not found") + default: + writeError(w, http.StatusInternalServerError, "internal_error", "Failed to authorize ebook file") + } +} + +func serveEbookInline(w http.ResponseWriter, r *http.Request, file *models.MediaFile) error { + f, err := os.Open(file.FilePath) + if err != nil { + if os.IsNotExist(err) { + return catalog.ErrItemNotFound + } + return fmt.Errorf("opening ebook file: %w", err) + } + defer f.Close() + + stat, err := f.Stat() + if err != nil { + return fmt.Errorf("stat ebook file: %w", err) + } + + w.Header().Set("Content-Type", ebookMimeType(file.FilePath, file.Container)) + w.Header().Set("Content-Disposition", inlineContentDisposition(filepath.Base(file.FilePath))) + // Ebook files are served inline on the API origin (and reachable via the + // ?token= query fallback), so browsers must never content-sniff them. + w.Header().Set("X-Content-Type-Options", "nosniff") + http.ServeContent(w, r, stat.Name(), stat.ModTime(), f) + return nil +} + +// inlineContentDisposition builds an inline Content-Disposition header value. +// mime.FormatMediaType handles quoting, backslash escaping, and RFC 5987 +// (filename*) encoding for non-ASCII names. +func inlineContentDisposition(name string) string { + name = strings.TrimSpace(name) + if name == "" || name == "." || name == string(filepath.Separator) { + name = "ebook" + } + if disposition := mime.FormatMediaType("inline", map[string]string{"filename": name}); disposition != "" { + return disposition + } + return `inline; filename="ebook"` +} + +func isEbookFile(file *models.MediaFile) bool { + if file == nil { + return false + } + if !strings.EqualFold(file.BaseType, "ebook") { + return false + } + return ebookReaderFormat(file.FilePath, file.Container) != "" +} + +// ebookReaderFormat resolves the whitelisted reader format for a file from +// its filename extension, falling back to the catalog container when the +// extension is not a known ebook format. It returns "" when neither identity +// is whitelisted. isEbookFile admission and ebookMimeType both key off this +// resolution, so an admitted file always maps to a concrete ebook MIME type +// and never falls through to application/octet-stream. +func ebookReaderFormat(path, container string) string { + if strings.HasSuffix(strings.ToLower(path), ".fb2.zip") { + return "fbz" + } + if format := normalizeEbookReaderFormat(filepath.Ext(path)); format != "" { + return format + } + return normalizeEbookReaderFormat(container) +} + +// normalizeEbookReaderFormat maps an extension or container value onto the +// ebook reader format whitelist, returning "" for unknown values. +func normalizeEbookReaderFormat(value string) string { + format := strings.TrimPrefix(strings.ToLower(strings.TrimSpace(value)), ".") + switch format { + case "epub", "pdf", "mobi", "azw", "azw3", "cbz", "cbr", "fb2", "fbz": + return format + default: + return "" + } +} + +func ebookMimeType(path, container string) string { + switch ebookReaderFormat(path, container) { + case "epub": + return "application/epub+zip" + case "pdf": + return "application/pdf" + case "mobi": + return "application/x-mobipocket-ebook" + case "azw": + return "application/vnd.amazon.ebook" + case "azw3": + return "application/vnd.amazon.mobi8-ebook" + case "cbz": + return "application/vnd.comicbook+zip" + case "cbr": + return "application/vnd.comicbook-rar" + case "fb2": + return "application/x-fictionbook+xml" + case "fbz": + return "application/x-zip-compressed-fb2" + default: + return "application/octet-stream" + } +} + +type PGEbookReaderProgressStore struct { + pool *pgxpool.Pool +} + +func NewPGEbookReaderProgressStore(pool *pgxpool.Pool) *PGEbookReaderProgressStore { + return &PGEbookReaderProgressStore{pool: pool} +} + +type PGEbookReaderConfigStore struct { + pool *pgxpool.Pool +} + +func NewPGEbookReaderConfigStore(pool *pgxpool.Pool) *PGEbookReaderConfigStore { + return &PGEbookReaderConfigStore{pool: pool} +} + +func (s *PGEbookReaderConfigStore) Get(ctx context.Context, userID int, profileID string, contentID string) (*EbookReaderConfig, error) { + if s == nil || s.pool == nil { + return nil, fmt.Errorf("ebook reader config store is not configured") + } + var config EbookReaderConfig + err := s.pool.QueryRow(ctx, ` + SELECT user_id, profile_id, content_id, config, updated_at + FROM ebook_reader_config + WHERE user_id = $1 AND profile_id = $2 AND content_id = $3`, + userID, profileID, contentID, + ).Scan( + &config.UserID, + &config.ProfileID, + &config.ContentID, + &config.Config, + &config.UpdatedAt, + ) + if errors.Is(err, pgx.ErrNoRows) { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("get ebook reader config: %w", err) + } + return &config, nil +} + +func (s *PGEbookReaderConfigStore) Upsert(ctx context.Context, config EbookReaderConfig) error { + if s == nil || s.pool == nil { + return fmt.Errorf("ebook reader config store is not configured") + } + if _, err := s.pool.Exec(ctx, ` + INSERT INTO ebook_reader_config + (user_id, profile_id, content_id, config, updated_at) + VALUES ($1, $2, $3, $4::jsonb, $5) + ON CONFLICT (user_id, profile_id, content_id) DO UPDATE SET + config = EXCLUDED.config, + updated_at = EXCLUDED.updated_at`, + config.UserID, + config.ProfileID, + config.ContentID, + config.Config, + config.UpdatedAt, + ); err != nil { + return fmt.Errorf("upsert ebook reader config: %w", err) + } + return nil +} + +type PGEbookReaderAnnotationStore struct { + pool *pgxpool.Pool +} + +func NewPGEbookReaderAnnotationStore(pool *pgxpool.Pool) *PGEbookReaderAnnotationStore { + return &PGEbookReaderAnnotationStore{pool: pool} +} + +func (s *PGEbookReaderAnnotationStore) List(ctx context.Context, userID int, profileID string, contentID string) ([]EbookReaderAnnotation, error) { + if s == nil || s.pool == nil { + return nil, fmt.Errorf("ebook reader annotation store is not configured") + } + rows, err := s.pool.Query(ctx, ` + SELECT id, user_id, profile_id, content_id, kind, + COALESCE(cfi_range, ''), COALESCE(location, ''), + selected_text, note, style, color, metadata, created_at, updated_at + FROM ebook_reader_annotations + WHERE user_id = $1 AND profile_id = $2 AND content_id = $3 + ORDER BY updated_at DESC`, + userID, profileID, contentID, + ) + if err != nil { + return nil, fmt.Errorf("list ebook reader annotations: %w", err) + } + defer rows.Close() + var items []EbookReaderAnnotation + for rows.Next() { + annotation, err := scanEbookReaderAnnotation(rows) + if err != nil { + return nil, err + } + items = append(items, annotation) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterate ebook reader annotations: %w", err) + } + return items, nil +} + +func (s *PGEbookReaderAnnotationStore) Create(ctx context.Context, annotation EbookReaderAnnotation) error { + if s == nil || s.pool == nil { + return fmt.Errorf("ebook reader annotation store is not configured") + } + _, err := s.pool.Exec(ctx, ` + INSERT INTO ebook_reader_annotations + (id, user_id, profile_id, content_id, kind, cfi_range, location, + selected_text, note, style, color, metadata, created_at, updated_at) + VALUES ($1, $2, $3, $4, $5, NULLIF($6, ''), NULLIF($7, ''), + $8, $9, $10, $11, $12::jsonb, $13, $14)`, + annotation.ID, + annotation.UserID, + annotation.ProfileID, + annotation.ContentID, + annotation.Kind, + annotation.CFIRange, + annotation.Location, + annotation.SelectedText, + annotation.Note, + annotation.Style, + annotation.Color, + annotation.Metadata, + annotation.CreatedAt, + annotation.UpdatedAt, + ) + if err != nil { + return fmt.Errorf("create ebook reader annotation: %w", err) + } + return nil +} + +func (s *PGEbookReaderAnnotationStore) Update( + ctx context.Context, + userID int, + profileID string, + contentID string, + annotationID string, + merge func(existing EbookReaderAnnotation) (EbookReaderAnnotation, error), +) (*EbookReaderAnnotation, error) { + if s == nil || s.pool == nil { + return nil, fmt.Errorf("ebook reader annotation store is not configured") + } + tx, err := s.pool.Begin(ctx) + if err != nil { + return nil, fmt.Errorf("begin ebook reader annotation update: %w", err) + } + defer func() { _ = tx.Rollback(ctx) }() + + existing, err := scanEbookReaderAnnotation(tx.QueryRow(ctx, ` + SELECT id, user_id, profile_id, content_id, kind, + COALESCE(cfi_range, ''), COALESCE(location, ''), + selected_text, note, style, color, metadata, created_at, updated_at + FROM ebook_reader_annotations + WHERE id = $1 AND user_id = $2 AND profile_id = $3 AND content_id = $4 + FOR UPDATE`, + annotationID, userID, profileID, contentID, + )) + if errors.Is(err, pgx.ErrNoRows) { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("get ebook reader annotation for update: %w", err) + } + + merged, err := merge(existing) + if err != nil { + return nil, err + } + + updated, err := scanEbookReaderAnnotation(tx.QueryRow(ctx, ` + UPDATE ebook_reader_annotations + SET kind = $5, + cfi_range = NULLIF($6, ''), + location = NULLIF($7, ''), + selected_text = $8, + note = $9, + style = $10, + color = $11, + metadata = $12::jsonb, + updated_at = $13 + WHERE id = $1 AND user_id = $2 AND profile_id = $3 AND content_id = $4 + RETURNING id, user_id, profile_id, content_id, kind, + COALESCE(cfi_range, ''), COALESCE(location, ''), + selected_text, note, style, color, metadata, created_at, updated_at`, + annotationID, + userID, + profileID, + contentID, + merged.Kind, + merged.CFIRange, + merged.Location, + merged.SelectedText, + merged.Note, + merged.Style, + merged.Color, + merged.Metadata, + merged.UpdatedAt, + )) + if err != nil { + return nil, fmt.Errorf("update ebook reader annotation: %w", err) + } + if err := tx.Commit(ctx); err != nil { + return nil, fmt.Errorf("commit ebook reader annotation update: %w", err) + } + return &updated, nil +} + +func (s *PGEbookReaderAnnotationStore) Delete(ctx context.Context, userID int, profileID string, contentID string, annotationID string) error { + if s == nil || s.pool == nil { + return fmt.Errorf("ebook reader annotation store is not configured") + } + if _, err := s.pool.Exec(ctx, ` + DELETE FROM ebook_reader_annotations + WHERE id = $1 AND user_id = $2 AND profile_id = $3 AND content_id = $4`, + annotationID, userID, profileID, contentID, + ); err != nil { + return fmt.Errorf("delete ebook reader annotation: %w", err) + } + return nil +} + +func scanEbookReaderAnnotation(scanner interface{ Scan(dest ...any) error }) (EbookReaderAnnotation, error) { + var annotation EbookReaderAnnotation + if err := scanner.Scan( + &annotation.ID, + &annotation.UserID, + &annotation.ProfileID, + &annotation.ContentID, + &annotation.Kind, + &annotation.CFIRange, + &annotation.Location, + &annotation.SelectedText, + &annotation.Note, + &annotation.Style, + &annotation.Color, + &annotation.Metadata, + &annotation.CreatedAt, + &annotation.UpdatedAt, + ); err != nil { + return EbookReaderAnnotation{}, fmt.Errorf("scan ebook reader annotation: %w", err) + } + return annotation, nil +} + +func (s *PGEbookReaderProgressStore) Get(ctx context.Context, userID int, profileID string, contentID string) (*EbookReaderProgress, error) { + if s == nil || s.pool == nil { + return nil, fmt.Errorf("ebook reader progress store is not configured") + } + var progress EbookReaderProgress + err := s.pool.QueryRow(ctx, ` + SELECT user_id, profile_id, content_id, file_id, location, progress, updated_at + FROM ebook_reader_progress + WHERE user_id = $1 AND profile_id = $2 AND content_id = $3`, + userID, profileID, contentID, + ).Scan( + &progress.UserID, + &progress.ProfileID, + &progress.ContentID, + &progress.FileID, + &progress.Location, + &progress.Progress, + &progress.UpdatedAt, + ) + if errors.Is(err, pgx.ErrNoRows) { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("get ebook reader progress: %w", err) + } + return &progress, nil +} + +// ListByContentIDs lists reading progress for a set of items, excluding rows +// hidden from history. The hidden gating mirrors the video path +// (internal/userstore/pgstore/progress.go): a row is hidden while its +// updated_at <= hidden_before, and counts again once progress is updated +// after the hide. +func (s *PGEbookReaderProgressStore) ListByContentIDs(ctx context.Context, userID int, profileID string, contentIDs []string) (map[string]EbookReaderProgress, error) { + if s == nil || s.pool == nil { + return nil, fmt.Errorf("ebook reader progress store is not configured") + } + if userID <= 0 || profileID == "" || len(contentIDs) == 0 { + return nil, nil + } + rows, err := s.pool.Query(ctx, ` + SELECT user_id, profile_id, content_id, file_id, location, progress, updated_at + FROM ebook_reader_progress + WHERE user_id = $1 AND profile_id = $2 AND content_id = ANY($3::text[]) + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = ebook_reader_progress.user_id + AND hhi.profile_id = ebook_reader_progress.profile_id + AND hhi.media_item_id = ebook_reader_progress.content_id + AND ebook_reader_progress.updated_at <= hhi.hidden_before + )`, + userID, profileID, contentIDs, + ) + if err != nil { + return nil, fmt.Errorf("list ebook reader progress: %w", err) + } + defer rows.Close() + + progressByContentID := make(map[string]EbookReaderProgress, len(contentIDs)) + for rows.Next() { + var progress EbookReaderProgress + if err := rows.Scan( + &progress.UserID, + &progress.ProfileID, + &progress.ContentID, + &progress.FileID, + &progress.Location, + &progress.Progress, + &progress.UpdatedAt, + ); err != nil { + return nil, fmt.Errorf("scan ebook reader progress: %w", err) + } + progressByContentID[progress.ContentID] = progress + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterate ebook reader progress: %w", err) + } + return progressByContentID, nil +} + +func (s *PGEbookReaderProgressStore) Delete(ctx context.Context, userID int, profileID string, contentID string) error { + if s == nil || s.pool == nil { + return fmt.Errorf("ebook reader progress store is not configured") + } + if _, err := s.pool.Exec(ctx, ` + DELETE FROM ebook_reader_progress + WHERE user_id = $1 AND profile_id = $2 AND content_id = $3`, + userID, profileID, contentID, + ); err != nil { + return fmt.Errorf("delete ebook reader progress: %w", err) + } + return nil +} + +func (s *PGEbookReaderProgressStore) Upsert(ctx context.Context, progress EbookReaderProgress) error { + if s == nil || s.pool == nil { + return fmt.Errorf("ebook reader progress store is not configured") + } + if _, err := s.pool.Exec(ctx, ` + INSERT INTO ebook_reader_progress + (user_id, profile_id, content_id, file_id, location, progress, updated_at) + VALUES ($1, $2, $3, $4, $5, $6, $7) + ON CONFLICT (user_id, profile_id, content_id) DO UPDATE SET + file_id = EXCLUDED.file_id, + location = EXCLUDED.location, + progress = EXCLUDED.progress, + updated_at = EXCLUDED.updated_at`, + progress.UserID, + progress.ProfileID, + progress.ContentID, + progress.FileID, + progress.Location, + progress.Progress, + progress.UpdatedAt, + ); err != nil { + return fmt.Errorf("upsert ebook reader progress: %w", err) + } + return nil +} diff --git a/internal/api/handlers/ebook_reader_test.go b/internal/api/handlers/ebook_reader_test.go new file mode 100644 index 00000000..063f0bf8 --- /dev/null +++ b/internal/api/handlers/ebook_reader_test.go @@ -0,0 +1,901 @@ +package handlers + +import ( + "context" + "encoding/json" + "errors" + "mime" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + "time" + + "github.com/go-chi/chi/v5" + + apimw "github.com/Silo-Server/silo-server/internal/api/middleware" + "github.com/Silo-Server/silo-server/internal/auth" + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/models" +) + +func newEbookReaderAuthRequest(method, path string) *http.Request { + req := httptest.NewRequest(method, path, nil) + ctx := apimw.SetClaims(context.Background(), &auth.Claims{ + UserID: 1, + Role: "user", + TokenType: auth.TokenTypeAccess, + }) + ctx = apimw.SetProfileID(ctx, "profile-1") + return req.WithContext(ctx) +} + +func withEbookReaderRouteParams(req *http.Request, contentID, fileID string) *http.Request { + routeCtx := chi.NewRouteContext() + routeCtx.URLParams.Add("content_id", contentID) + routeCtx.URLParams.Add("file_id", fileID) + return req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, routeCtx)) +} + +func withEbookReaderContentRouteParam(req *http.Request, contentID string) *http.Request { + routeCtx := chi.NewRouteContext() + routeCtx.URLParams.Add("content_id", contentID) + return req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, routeCtx)) +} + +func withEbookReaderAnnotationRouteParams(req *http.Request, contentID, annotationID string) *http.Request { + routeCtx := chi.NewRouteContext() + routeCtx.URLParams.Add("content_id", contentID) + routeCtx.URLParams.Add("annotation_id", annotationID) + return req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, routeCtx)) +} + +type fakeEbookProgressStore struct { + progress *EbookReaderProgress + upserted *EbookReaderProgress + err error +} + +func (s *fakeEbookProgressStore) Get( + context.Context, + int, + string, + string, +) (*EbookReaderProgress, error) { + return s.progress, s.err +} + +func (s *fakeEbookProgressStore) Upsert(_ context.Context, progress EbookReaderProgress) error { + if s.err != nil { + return s.err + } + s.upserted = &progress + return nil +} + +type fakeEbookReaderConfigStore struct { + config *EbookReaderConfig + saved *EbookReaderConfig + getErr error + saveErr error +} + +func (s *fakeEbookReaderConfigStore) Get( + context.Context, + int, + string, + string, +) (*EbookReaderConfig, error) { + return s.config, s.getErr +} + +func (s *fakeEbookReaderConfigStore) Upsert(_ context.Context, config EbookReaderConfig) error { + if s.saveErr != nil { + return s.saveErr + } + s.saved = &config + return nil +} + +type fakeEbookReaderAnnotationStore struct { + items []EbookReaderAnnotation + existing *EbookReaderAnnotation + created *EbookReaderAnnotation + updated *EbookReaderAnnotation + mergedFrom *EbookReaderAnnotation + mergeCalls int + deleted string + err error +} + +func (s *fakeEbookReaderAnnotationStore) List(context.Context, int, string, string) ([]EbookReaderAnnotation, error) { + return s.items, s.err +} + +func (s *fakeEbookReaderAnnotationStore) Create(_ context.Context, annotation EbookReaderAnnotation) error { + if s.err != nil { + return s.err + } + s.created = &annotation + s.items = append(s.items, annotation) + return nil +} + +// Update models the PG store contract: read the stored row, invoke merge with +// it, and persist the merged result, all as one atomic operation. +func (s *fakeEbookReaderAnnotationStore) Update( + _ context.Context, + _ int, + _ string, + _ string, + annotationID string, + merge func(existing EbookReaderAnnotation) (EbookReaderAnnotation, error), +) (*EbookReaderAnnotation, error) { + if s.err != nil { + return nil, s.err + } + if s.existing == nil || s.existing.ID != annotationID { + return nil, nil + } + existing := *s.existing + s.mergedFrom = &existing + s.mergeCalls++ + merged, err := merge(existing) + if err != nil { + return nil, err + } + s.updated = &merged + stored := merged + s.existing = &stored + return &merged, nil +} + +func (s *fakeEbookReaderAnnotationStore) Delete(_ context.Context, userID int, profileID, contentID, annotationID string) error { + if s.err != nil { + return s.err + } + s.deleted = annotationID + return nil +} + +func TestEbookReaderServesEbookInlineWithRangeSupport(t *testing.T) { + filePath := writePlaybackTestMediaFile(t, "book.epub") + if err := os.WriteFile(filePath, []byte("0123456789"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{ + file: &models.MediaFile{ + ID: 42, + ContentID: "ebook-1", + FilePath: filePath, + Container: "epub", + BaseType: "ebook", + }, + }, + ItemAccess: stubItemAccessChecker{}, + }) + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/files/42/read") + req.Header.Set("Range", "bytes=2-5") + req = withEbookReaderRouteParams(req, "ebook-1", "42") + + rr := httptest.NewRecorder() + handler.HandleReadFile(rr, req) + + if rr.Code != http.StatusPartialContent { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if got := rr.Header().Get("Content-Type"); got != "application/epub+zip" { + t.Fatalf("content-type = %q", got) + } + if got := rr.Header().Get("Content-Disposition"); got != "inline; filename=book.epub" { + t.Fatalf("content-disposition = %q", got) + } + if got := rr.Header().Get("X-Content-Type-Options"); got != "nosniff" { + t.Fatalf("x-content-type-options = %q, want nosniff", got) + } + if rr.Body.String() != "2345" { + t.Fatalf("body = %q", rr.Body.String()) + } +} + +func TestEbookReaderServesContainerMimeForMismatchedExtension(t *testing.T) { + filePath := writePlaybackTestMediaFile(t, "book.txt") + if err := os.WriteFile(filePath, []byte("not really"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{ + file: &models.MediaFile{ + ID: 42, + ContentID: "ebook-1", + FilePath: filePath, + Container: "epub", + BaseType: "ebook", + }, + }, + ItemAccess: stubItemAccessChecker{}, + }) + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/files/42/read") + req = withEbookReaderRouteParams(req, "ebook-1", "42") + + rr := httptest.NewRecorder() + handler.HandleReadFile(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + // The file is admitted via its validated container, so the response must + // carry that container's MIME type, never application/octet-stream. + if got := rr.Header().Get("Content-Type"); got != "application/epub+zip" { + t.Fatalf("content-type = %q, want application/epub+zip", got) + } + if got := rr.Header().Get("X-Content-Type-Options"); got != "nosniff" { + t.Fatalf("x-content-type-options = %q, want nosniff", got) + } +} + +func TestEbookMimeTypeNeverReturnsOctetStreamForAdmittedFiles(t *testing.T) { + cases := []struct { + path string + container string + wantMime string + }{ + {"/library/book.txt", "epub", "application/epub+zip"}, + {"/library/book", "pdf", "application/pdf"}, + {"/library/book.epub", "pdf", "application/epub+zip"}, // known extension wins + } + for _, tc := range cases { + file := &models.MediaFile{FilePath: tc.path, Container: tc.container, BaseType: "ebook"} + if !isEbookFile(file) { + t.Fatalf("isEbookFile(%q, %q) = false, want admitted", tc.path, tc.container) + } + if got := ebookMimeType(tc.path, tc.container); got != tc.wantMime { + t.Fatalf("ebookMimeType(%q, %q) = %q, want %q", tc.path, tc.container, got, tc.wantMime) + } + } +} + +func TestEbookReaderRejectsNonEbookFile(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{ + file: &models.MediaFile{ + ID: 42, + ContentID: "movie-1", + FilePath: "/tmp/movie.mkv", + Container: "mkv", + BaseType: "movie", + }, + }, + ItemAccess: stubItemAccessChecker{}, + }) + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/movie-1/files/42/read") + req = withEbookReaderRouteParams(req, "movie-1", "42") + + rr := httptest.NewRecorder() + handler.HandleReadFile(rr, req) + + if rr.Code != http.StatusNotFound { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderRecognizesReadestFormats(t *testing.T) { + cases := map[string]string{ + "book.epub": "application/epub+zip", + "book.pdf": "application/pdf", + "book.mobi": "application/x-mobipocket-ebook", + "book.azw": "application/vnd.amazon.ebook", + "book.azw3": "application/vnd.amazon.mobi8-ebook", + "book.cbz": "application/vnd.comicbook+zip", + "book.cbr": "application/vnd.comicbook-rar", + "book.fb2": "application/x-fictionbook+xml", + "book.fbz": "application/x-zip-compressed-fb2", + "book.fb2.zip": "application/x-zip-compressed-fb2", + "book.md": "application/octet-stream", + "book.unknown": "application/octet-stream", + } + rejected := map[string]bool{"book.md": true, "book.unknown": true} + + for name, wantMime := range cases { + t.Run(name, func(t *testing.T) { + container := name + if name == "book.fb2.zip" { + container = "fbz" + } + file := &models.MediaFile{FilePath: "/library/" + name, Container: container} + if rejected[name] { + file.BaseType = "ebook" + if isEbookFile(file) { + t.Fatalf("%s should not be treated as an ebook reader format", name) + } + if got := ebookMimeType(file.FilePath, file.Container); got != wantMime { + t.Fatalf("ebookMimeType() = %q, want %q", got, wantMime) + } + return + } + file.BaseType = "ebook" + if !isEbookFile(file) { + t.Fatal("expected ebook reader format") + } + if got := ebookMimeType(file.FilePath, file.Container); got != wantMime { + t.Fatalf("ebookMimeType() = %q, want %q", got, wantMime) + } + }) + } +} + +func TestEbookReaderRejectsPlainText(t *testing.T) { + file := &models.MediaFile{ + FilePath: "/library/book.txt", + BaseType: "ebook", + } + + if isEbookFile(file) { + t.Fatal("plain text should not be treated as an ebook reader format") + } + if got := ebookMimeType(file.FilePath, file.Container); got == "text/plain; charset=utf-8" { + t.Fatal("plain text should not have an ebook reader MIME type") + } +} + +func TestEbookReaderRecognizesFBZFromCompoundFilenameWithoutContainer(t *testing.T) { + file := &models.MediaFile{ + FilePath: "/library/book.fb2.zip", + BaseType: "ebook", + } + + if !isEbookFile(file) { + t.Fatal("expected .fb2.zip path to be treated as an ebook reader format") + } +} + +func TestEbookReaderMapsAccessFailureToNotFound(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{ + file: &models.MediaFile{ + ID: 42, + ContentID: "ebook-1", + FilePath: "/tmp/book.epub", + Container: "epub", + BaseType: "ebook", + }, + }, + ItemAccess: stubItemAccessChecker{err: catalog.ErrItemNotFound}, + }) + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/files/42/read") + req = withEbookReaderRouteParams(req, "ebook-1", "42") + + rr := httptest.NewRecorder() + handler.HandleReadFile(rr, req) + + if rr.Code != http.StatusNotFound { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderReturnsInternalErrorForUnexpectedAuthorizeFailure(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{err: errors.New("db down")}, + ItemAccess: stubItemAccessChecker{}, + }) + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/files/42/read") + req = withEbookReaderRouteParams(req, "ebook-1", "42") + + rr := httptest.NewRecorder() + handler.HandleReadFile(rr, req) + + if rr.Code != http.StatusInternalServerError { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderSavesProgressForAuthorizedEbookFile(t *testing.T) { + store := &fakeEbookProgressStore{} + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{ + file: &models.MediaFile{ + ID: 42, + ContentID: "ebook-1", + FilePath: "/tmp/book.epub", + Container: "epub", + BaseType: "ebook", + }, + }, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ProgressStore = store + + req := httptest.NewRequest( + http.MethodPut, + "/ebooks/ebook-1/progress", + strings.NewReader(`{"file_id":42,"location":"epubcfi(/6/4)","progress":0.42}`), + ) + ctx := apimw.SetClaims(context.Background(), &auth.Claims{ + UserID: 1, + Role: "user", + TokenType: auth.TokenTypeAccess, + }) + req = req.WithContext(apimw.SetProfileID(ctx, "profile-9")) + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleSaveProgress(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.upserted == nil { + t.Fatal("expected progress to be saved") + } + if store.upserted.UserID != 1 || store.upserted.ProfileID != "profile-9" { + t.Fatalf("scope = user %d profile %q", store.upserted.UserID, store.upserted.ProfileID) + } + if store.upserted.ContentID != "ebook-1" || store.upserted.FileID != 42 { + t.Fatalf("target = content %q file %d", store.upserted.ContentID, store.upserted.FileID) + } + if store.upserted.Location != "epubcfi(/6/4)" || store.upserted.Progress != 0.42 { + t.Fatalf("progress = %+v", store.upserted) + } +} + +func TestEbookReaderReturnsSavedProgress(t *testing.T) { + updatedAt := time.Date(2026, 6, 8, 12, 0, 0, 0, time.UTC) + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ProgressStore = &fakeEbookProgressStore{ + progress: &EbookReaderProgress{ + UserID: 1, + ProfileID: "profile-1", + ContentID: "ebook-1", + FileID: 42, + Location: "epubcfi(/6/8)", + Progress: 0.75, + UpdatedAt: updatedAt, + }, + } + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/progress") + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleGetProgress(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + body := rr.Body.String() + for _, want := range []string{ + `"content_id":"ebook-1"`, + `"file_id":42`, + `"location":"epubcfi(/6/8)"`, + `"progress":0.75`, + `"updated_at":"2026-06-08T12:00:00Z"`, + } { + if !strings.Contains(body, want) { + t.Fatalf("response %s missing %s", body, want) + } + } +} + +func TestEbookReaderReturnsEmptyConfigWhenNoneSaved(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ConfigStore = &fakeEbookReaderConfigStore{} + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/reader-config") + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleGetConfig(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if got := strings.TrimSpace(rr.Body.String()); got != `{"config":{}}` { + t.Fatalf("body = %s", got) + } +} + +func TestEbookReaderSavesConfigForAccessibleEbook(t *testing.T) { + store := &fakeEbookReaderConfigStore{} + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ConfigStore = store + + req := httptest.NewRequest( + http.MethodPut, + "/ebooks/ebook-1/reader-config", + strings.NewReader(`{"config":{"theme":"dark","flow":"scrolled","fontSize":120}}`), + ) + ctx := apimw.SetClaims(context.Background(), &auth.Claims{ + UserID: 1, + Role: "user", + TokenType: auth.TokenTypeAccess, + }) + req = req.WithContext(apimw.SetProfileID(ctx, "profile-9")) + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleSaveConfig(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.saved == nil { + t.Fatal("expected config to be saved") + } + if store.saved.UserID != 1 || store.saved.ProfileID != "profile-9" || store.saved.ContentID != "ebook-1" { + t.Fatalf("scope = %+v", store.saved) + } + var config map[string]any + if err := json.Unmarshal(store.saved.Config, &config); err != nil { + t.Fatalf("config json: %v", err) + } + if config["theme"] != "dark" || config["flow"] != "scrolled" || config["fontSize"].(float64) != 120 { + t.Fatalf("config = %#v", config) + } +} + +func TestEbookReaderRejectsNonObjectConfig(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ConfigStore = &fakeEbookReaderConfigStore{} + + req := newEbookReaderAuthRequest(http.MethodPut, "/ebooks/ebook-1/reader-config") + req.Body = http.NoBody + req = httptest.NewRequest( + http.MethodPut, + "/ebooks/ebook-1/reader-config", + strings.NewReader(`{"config":["bad"]}`), + ).WithContext(req.Context()) + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleSaveConfig(rr, req) + + if rr.Code != http.StatusBadRequest { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderConfigRequiresAccessibleContent(t *testing.T) { + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{err: catalog.ErrItemNotFound}, + }) + handler.ConfigStore = &fakeEbookReaderConfigStore{} + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/reader-config") + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleGetConfig(rr, req) + + if rr.Code != http.StatusNotFound { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderCreatesAnnotationForAccessibleEbook(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{} + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.AnnotationStore = store + + req := httptest.NewRequest( + http.MethodPost, + "/ebooks/ebook-1/annotations", + strings.NewReader(`{"kind":"highlight","cfi_range":"epubcfi(/6/4,/1:0,/1:12)","selected_text":"sample text","note":"note text","style":"highlight","color":"#facc15"}`), + ) + ctx := apimw.SetClaims(context.Background(), &auth.Claims{ + UserID: 1, + Role: "user", + TokenType: auth.TokenTypeAccess, + }) + req = req.WithContext(apimw.SetProfileID(ctx, "profile-9")) + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleCreateAnnotation(rr, req) + + if rr.Code != http.StatusCreated { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.created == nil { + t.Fatal("expected annotation to be created") + } + if store.created.UserID != 1 || store.created.ProfileID != "profile-9" || store.created.ContentID != "ebook-1" { + t.Fatalf("scope = %+v", store.created) + } + if store.created.Kind != "highlight" || store.created.CFIRange != "epubcfi(/6/4,/1:0,/1:12)" { + t.Fatalf("annotation = %+v", store.created) + } + if store.created.SelectedText != "sample text" || store.created.Note != "note text" { + t.Fatalf("annotation text = %+v", store.created) + } + if store.created.ID == "" { + t.Fatal("expected generated annotation id") + } +} + +func TestEbookReaderReturnsAnnotations(t *testing.T) { + updatedAt := time.Date(2026, 6, 8, 12, 0, 0, 0, time.UTC) + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.AnnotationStore = &fakeEbookReaderAnnotationStore{ + items: []EbookReaderAnnotation{ + { + ID: "ann-1", + UserID: 1, + ProfileID: "profile-1", + ContentID: "ebook-1", + Kind: "bookmark", + Location: "epubcfi(/6/8)", + SelectedText: "", + Note: "Saved spot", + Style: "highlight", + Color: "#facc15", + Metadata: json.RawMessage(`{}`), + CreatedAt: updatedAt, + UpdatedAt: updatedAt, + }, + }, + } + + req := newEbookReaderAuthRequest(http.MethodGet, "/ebooks/ebook-1/annotations") + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleListAnnotations(rr, req) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + body := rr.Body.String() + for _, want := range []string{`"items":[`, `"id":"ann-1"`, `"kind":"bookmark"`, `"location":"epubcfi(/6/8)"`} { + if !strings.Contains(body, want) { + t.Fatalf("response %s missing %s", body, want) + } + } +} + +func existingEbookReaderAnnotation() *EbookReaderAnnotation { + createdAt := time.Date(2026, 6, 1, 9, 0, 0, 0, time.UTC) + return &EbookReaderAnnotation{ + ID: "ann-1", + UserID: 1, + ProfileID: "profile-1", + ContentID: "ebook-1", + Kind: "highlight", + CFIRange: "epubcfi(/6/4,/1:0,/1:12)", + SelectedText: "sample text", + Note: "original note", + Style: "highlight", + Color: "#facc15", + Metadata: json.RawMessage(`{"chapter":"one"}`), + CreatedAt: createdAt, + UpdatedAt: createdAt, + } +} + +func patchEbookReaderAnnotation(t *testing.T, store *fakeEbookReaderAnnotationStore, body string) *httptest.ResponseRecorder { + t.Helper() + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.AnnotationStore = store + + req := newEbookReaderAuthRequest(http.MethodPatch, "/ebooks/ebook-1/annotations/ann-1") + req.Body = ioNopCloser{strings.NewReader(body)} + req = withEbookReaderAnnotationRouteParams(req, "ebook-1", "ann-1") + + rr := httptest.NewRecorder() + handler.HandleUpdateAnnotation(rr, req) + return rr +} + +func TestEbookReaderPatchKeepsAbsentFields(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{existing: existingEbookReaderAnnotation()} + + rr := patchEbookReaderAnnotation(t, store, `{"note":"updated","color":"#bfdbfe"}`) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.updated == nil || store.updated.ID != "ann-1" || store.updated.Note != "updated" || store.updated.Color != "#bfdbfe" { + t.Fatalf("updated = %+v", store.updated) + } + if string(store.updated.Metadata) != `{"chapter":"one"}` { + t.Fatalf("metadata should be preserved when absent, got %s", store.updated.Metadata) + } + if store.updated.Kind != "highlight" || store.updated.CFIRange != "epubcfi(/6/4,/1:0,/1:12)" { + t.Fatalf("absent fields should keep stored values, got %+v", store.updated) + } +} + +func TestEbookReaderPatchClearsExplicitlyEmptyFields(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{existing: existingEbookReaderAnnotation()} + + rr := patchEbookReaderAnnotation(t, store, `{"note":"","metadata":{}}`) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.updated == nil || store.updated.Note != "" { + t.Fatalf("note should be cleared, got %+v", store.updated) + } + if string(store.updated.Metadata) != `{}` { + t.Fatalf("metadata should be cleared to {}, got %s", store.updated.Metadata) + } +} + +func TestEbookReaderPatchValidatesResultingState(t *testing.T) { + cases := map[string]string{ + "kind change without location": `{"kind":"bookmark"}`, + "clearing required cfi_range": `{"cfi_range":""}`, + "unknown kind": `{"kind":"doodle"}`, + "non-object metadata": `{"metadata":["bad"]}`, + } + for name, body := range cases { + t.Run(name, func(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{existing: existingEbookReaderAnnotation()} + rr := patchEbookReaderAnnotation(t, store, body) + if rr.Code != http.StatusBadRequest { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.updated != nil { + t.Fatalf("invalid patch must not reach the store, got %+v", store.updated) + } + }) + } +} + +func TestEbookReaderPatchAllowsKindChangeWithRequiredFields(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{existing: existingEbookReaderAnnotation()} + + rr := patchEbookReaderAnnotation(t, store, `{"kind":"bookmark","location":"epubcfi(/6/8)"}`) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.updated == nil || store.updated.Kind != "bookmark" || store.updated.Location != "epubcfi(/6/8)" { + t.Fatalf("updated = %+v", store.updated) + } +} + +func TestEbookReaderPatchMergesOntoRowReadInsideStoreUpdate(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{existing: existingEbookReaderAnnotation()} + + rr := patchEbookReaderAnnotation(t, store, `{"note":"merged note"}`) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + // The handler must not pre-read and merge outside the store: the merge + // runs exactly once, on the row handed over by the (locked) store read. + if store.mergeCalls != 1 { + t.Fatalf("merge calls = %d, want 1", store.mergeCalls) + } + if store.mergedFrom == nil || store.mergedFrom.Note != "original note" { + t.Fatalf("merge input = %+v, want the stored row", store.mergedFrom) + } + if store.updated == nil || store.updated.Note != "merged note" { + t.Fatalf("written row = %+v, want merged note", store.updated) + } + if store.updated.CFIRange != store.mergedFrom.CFIRange || store.updated.Kind != store.mergedFrom.Kind { + t.Fatalf("written row %+v must keep unpatched fields from merge input %+v", store.updated, store.mergedFrom) + } + if !store.updated.UpdatedAt.After(store.mergedFrom.UpdatedAt) { + t.Fatalf("updated_at %v must advance past %v", store.updated.UpdatedAt, store.mergedFrom.UpdatedAt) + } +} + +func TestEbookReaderPatchReturnsNotFoundForMissingAnnotation(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{} + + rr := patchEbookReaderAnnotation(t, store, `{"note":"updated"}`) + + if rr.Code != http.StatusNotFound { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} + +func TestEbookReaderRejectsOversizedProgressBody(t *testing.T) { + store := &fakeEbookProgressStore{} + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.ProgressStore = store + + body := `{"file_id":42,"location":"` + strings.Repeat("x", int(ebookReaderProgressMaxBodySize)) + `","progress":0.5}` + req := newEbookReaderAuthRequest(http.MethodPut, "/ebooks/ebook-1/progress") + req.Body = ioNopCloser{strings.NewReader(body)} + req = withEbookReaderContentRouteParam(req, "ebook-1") + + rr := httptest.NewRecorder() + handler.HandleSaveProgress(rr, req) + + if rr.Code != http.StatusRequestEntityTooLarge { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.upserted != nil { + t.Fatalf("oversized body must not be saved, got %+v", store.upserted) + } +} + +func TestInlineContentDispositionProducesParseableHeaders(t *testing.T) { + cases := map[string]string{ + "book.epub": "book.epub", + `bo"ok\.epub`: `bo"ok\.epub`, + `trailing-slash\`: `trailing-slash\`, + "börk \U0001F4DA.epub": "börk \U0001F4DA.epub", + "": "ebook", + ".": "ebook", + } + for name, want := range cases { + t.Run(name, func(t *testing.T) { + got := inlineContentDisposition(name) + mediaType, params, err := mime.ParseMediaType(got) + if err != nil { + t.Fatalf("header %q is malformed: %v", got, err) + } + if mediaType != "inline" { + t.Fatalf("media type = %q", mediaType) + } + if params["filename"] != want { + t.Fatalf("filename = %q, want %q", params["filename"], want) + } + }) + } +} + +func TestEbookReaderDeletesAnnotation(t *testing.T) { + store := &fakeEbookReaderAnnotationStore{} + handler := NewEbookReaderHandler(&MediaFileAuthorizer{ + FileResolver: stubMediaFileResolver{}, + ItemAccess: stubItemAccessChecker{}, + }) + handler.AnnotationStore = store + + req := newEbookReaderAuthRequest(http.MethodDelete, "/ebooks/ebook-1/annotations/ann-1") + req = withEbookReaderAnnotationRouteParams(req, "ebook-1", "ann-1") + + rr := httptest.NewRecorder() + handler.HandleDeleteAnnotation(rr, req) + + if rr.Code != http.StatusNoContent { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + if store.deleted != "ann-1" { + t.Fatalf("deleted = %q", store.deleted) + } +} + +type ioNopCloser struct { + *strings.Reader +} + +func (c ioNopCloser) Close() error { return nil } diff --git a/internal/api/handlers/favorites.go b/internal/api/handlers/favorites.go index ef562ee2..17bc0f33 100644 --- a/internal/api/handlers/favorites.go +++ b/internal/api/handlers/favorites.go @@ -40,6 +40,7 @@ type PersonalDataHandler struct { localFavoriteDispatcher LocalFavoriteEventDispatcher profileStaler ProfileStaler profileRefreshRequester ProfileRefreshRequester + ebookProgressStore EbookReaderProgressLister } // NewPersonalDataHandler creates a new PersonalDataHandler. @@ -55,6 +56,10 @@ func (h *PersonalDataHandler) SetDetailService(svc *catalog.DetailService) { h.detailSvc = svc } +func (h *PersonalDataHandler) SetEbookReaderProgressStore(store EbookReaderProgressLister) { + h.ebookProgressStore = store +} + // SetProfileStaler configures an optional staleness trigger for taste profiles. func (h *PersonalDataHandler) SetProfileStaler(ps ProfileStaler) { h.profileStaler = ps @@ -552,7 +557,10 @@ func resolveItemsByIDs(h *PersonalDataHandler, r *http.Request, ids []string) ([ userStates := map[string]*itemUserStateResponse{} if store, profileID, ok := h.userStoreForRequest(r); ok { - if resolvedStates, err := resolveItemUserStates(r.Context(), store, profileID, h.episodeRepo, accessibleItems); err == nil { + if resolvedStates, err := resolveItemUserStatesWithOptions(r.Context(), store, profileID, h.episodeRepo, accessibleItems, itemUserStateOptions{ + UserID: apimw.GetUserID(r.Context()), + EbookProgressStore: h.ebookProgressStore, + }); err == nil { userStates = resolvedStates } } @@ -669,7 +677,11 @@ func (h *PersonalDataHandler) resolveHistoryRemovalMediaItemIDs( return nil, err } switch item.Type { - case "movie": + case "movie", "ebook": + // Hiding an ebook gates ebook_reader_progress reads via + // user_history_hidden_items (updated_at <= hidden_before) + // without deleting the progress row, so the reader position + // survives: hidden is not the same as unread. return []string{item.ContentID}, nil case "series": return h.seriesEpisodeIDs(ctx, item.ContentID) diff --git a/internal/api/handlers/favorites_history_remove_test.go b/internal/api/handlers/favorites_history_remove_test.go new file mode 100644 index 00000000..9295d23a --- /dev/null +++ b/internal/api/handlers/favorites_history_remove_test.go @@ -0,0 +1,113 @@ +package handlers + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" + + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/models" + "github.com/Silo-Server/silo-server/internal/userstore" +) + +type fakeHistoryItemRepo struct { + items map[string]*models.MediaItem + inaccessible map[string]bool +} + +func (r *fakeHistoryItemRepo) GetByID(_ context.Context, contentID string) (*models.MediaItem, error) { + item, ok := r.items[contentID] + if !ok { + return nil, catalog.ErrItemNotFound + } + return item, nil +} + +func (r *fakeHistoryItemRepo) GetByIDs(_ context.Context, contentIDs []string) ([]*models.MediaItem, error) { + result := make([]*models.MediaItem, 0, len(contentIDs)) + for _, contentID := range contentIDs { + if item, ok := r.items[contentID]; ok { + result = append(result, item) + } + } + return result, nil +} + +func (r *fakeHistoryItemRepo) EnsureAccessible(_ context.Context, contentID string, _ catalog.AccessFilter) error { + if r.inaccessible[contentID] { + return catalog.ErrItemNotFound + } + return nil +} + +func TestHandleRemoveHistoryAcceptsEbookTargets(t *testing.T) { + ctx := context.Background() + store := newProfileTestStore(t) + handler := NewPersonalDataHandler(testUserStoreProvider{store: store}, &fakeHistoryItemRepo{ + items: map[string]*models.MediaItem{ + "ebook-1": {ContentID: "ebook-1", Type: "ebook", Title: "Book"}, + }, + }) + + // Seed a history entry keyed by the ebook content ID so the removal has + // something to hide. RemoveHistoryItems only touches watch history, + // watch progress, and the hidden-items gate — PersonalDataHandler has no + // write access to ebook_reader_progress (its store interface is read-only), + // so the reader position survives: hidden is not the same as unread. + if err := store.AddHistory(ctx, userstore.WatchHistoryEntry{ + ProfileID: "profile-1", + MediaItemID: "ebook-1", + WatchedAt: "2026-06-01T10:00:00Z", + Completed: true, + Source: userstore.WatchHistorySourceManual, + }); err != nil { + t.Fatalf("AddHistory: %v", err) + } + + req := newAuthorizedProfileRequestWithRole( + http.MethodPost, + "/history/remove", + `{"targets":[{"content_id":"ebook-1"}]}`, + "user", + "profile-1", + ) + rr := httptest.NewRecorder() + handler.HandleRemoveHistory(rr, req) + + if rr.Code != http.StatusNoContent { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } + + entries, err := store.ListHistory(ctx, "profile-1", 10, 0) + if err != nil { + t.Fatalf("ListHistory: %v", err) + } + if len(entries) != 0 { + t.Fatalf("history entries = %+v, want hidden after removal", entries) + } +} + +func TestHandleRemoveHistoryRejectsInaccessibleEbook(t *testing.T) { + store := newProfileTestStore(t) + handler := NewPersonalDataHandler(testUserStoreProvider{store: store}, &fakeHistoryItemRepo{ + items: map[string]*models.MediaItem{ + "ebook-1": {ContentID: "ebook-1", Type: "ebook", Title: "Book"}, + }, + inaccessible: map[string]bool{"ebook-1": true}, + }) + + req := newAuthorizedProfileRequestWithRole( + http.MethodPost, + "/history/remove", + `{"targets":[{"content_id":"ebook-1"}]}`, + "user", + "profile-1", + ) + rr := httptest.NewRecorder() + handler.HandleRemoveHistory(rr, req) + + if rr.Code != http.StatusNotFound { + t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String()) + } +} diff --git a/internal/api/handlers/items.go b/internal/api/handlers/items.go index 1198bbf0..7697073c 100644 --- a/internal/api/handlers/items.go +++ b/internal/api/handlers/items.go @@ -46,6 +46,10 @@ type LocalWatchEventDispatcher interface { HandleLocalWatchEvent(ctx context.Context, event watchsync.LocalWatchEvent) error } +type EbookReaderProgressLister interface { + ListByContentIDs(ctx context.Context, userID int, profileID string, contentIDs []string) (map[string]EbookReaderProgress, error) +} + // ItemsHandler handles browse, search, item detail, and series endpoints. type ItemsHandler struct { browseRepo *catalog.BrowseRepository @@ -62,6 +66,8 @@ type ItemsHandler struct { profileRefreshRequester ProfileRefreshRequester metadataRefreshRequester MetadataRefreshRequester localWatchDispatcher LocalWatchEventDispatcher + ebookProgressStore EbookReaderProgressLister + ebookReadStateStore EbookReadStateStore EventsHub *evt.Hub UserRepo *auth.UserRepository } @@ -114,6 +120,11 @@ func (h *ItemsHandler) SetLocalWatchEventDispatcher(dispatcher LocalWatchEventDi h.localWatchDispatcher = dispatcher } +func (h *ItemsHandler) SetEbookReaderProgressStore(store EbookReaderProgressReadWriter) { + h.ebookProgressStore = store + h.ebookReadStateStore = store +} + func (h *ItemsHandler) maybeRequestStaleDetailMetadataRefresh(ctx context.Context, detail *catalog.ItemDetail) { if h == nil || detail == nil || h.metadataRefreshRequester == nil { return @@ -376,8 +387,8 @@ func (h *ItemsHandler) HandleGetWatchDetail(w http.ResponseWriter, r *http.Reque } } - if detail.Type == "movie" || detail.Type == "episode" { - detail.UserData = h.getLeafUserData(r, detail.ContentID) + if detail.Type == "movie" || detail.Type == "episode" || detail.Type == "ebook" { + detail.UserData = h.getLeafUserData(r, detail.ContentID, detail.Type) applyEffectiveEditionPreference(detail.UserData, &detail.EffectiveVersionEditionKey) } @@ -432,7 +443,8 @@ func (h *ItemsHandler) handleSetWatchedState(w http.ResponseWriter, r *http.Requ return } - targetType, targets, err := h.resolveWatchedTargets(r.Context(), id, h.accessFilter(r)) + filter := h.accessFilter(r) + targetType, targets, err := h.resolveWatchedTargets(r.Context(), id, filter) if err != nil { switch { case isNotFound(err): @@ -443,12 +455,16 @@ func (h *ItemsHandler) handleSetWatchedState(w http.ResponseWriter, r *http.Requ return } - if h.watchState == nil { + switch { + case targetType == "ebook": + // Ebook read state lives in ebook_reader_progress, not in + // user_watch_progress/user_watch_history; watch providers do not sync + // books, so no local watch event is dispatched. + err = h.setEbookReadState(r.Context(), userID, profileID, id, played, filter) + case h.watchState == nil: writeError(w, http.StatusInternalServerError, "internal_error", "Failed to access user store") return - } - - if played { + case played: leafTargets := make([]watchstate.LeafWatchTarget, 0, len(targets)) for _, target := range targets { leafTargets = append(leafTargets, watchstate.LeafWatchTarget{ @@ -462,7 +478,7 @@ func (h *ItemsHandler) handleSetWatchedState(w http.ResponseWriter, r *http.Requ if err == nil { h.dispatchLocalWatchEvent(r.Context(), watchsync.LocalWatchEventMarkedWatched, userID, profileID, result) } - } else { + default: targetIDs := make([]string, 0, len(targets)) for _, target := range targets { targetIDs = append(targetIDs, target.ContentID) @@ -474,6 +490,10 @@ func (h *ItemsHandler) handleSetWatchedState(w http.ResponseWriter, r *http.Requ } } if err != nil { + if isNotFound(err) { + writeError(w, http.StatusNotFound, "not_found", "Item not found") + return + } writeError(w, http.StatusInternalServerError, "internal_error", "Failed to update watched state") return } @@ -742,7 +762,10 @@ func (h *ItemsHandler) listItemUserStates(r *http.Request, items []*models.Media if !ok { return map[string]*itemUserStateResponse{} } - states, err := resolveItemUserStates(r.Context(), store, profileID, h.episodeRepo, items) + states, err := resolveItemUserStatesWithOptions(r.Context(), store, profileID, h.episodeRepo, items, itemUserStateOptions{ + UserID: apimw.GetUserID(r.Context()), + EbookProgressStore: h.ebookProgressStore, + }) if err != nil { return map[string]*itemUserStateResponse{} } @@ -853,6 +876,7 @@ func (h *ItemsHandler) listSortMetrics( filter catalog.AccessFilter, overlaySummaries map[string]*models.OverlaySummary, store userstore.UserStore, + userID int, profileID string, ) map[string]*sortMetricsResponse { metrics := make(map[string]*sortMetricsResponse, len(items)) @@ -893,7 +917,7 @@ func (h *ItemsHandler) listSortMetrics( } } case "progress", "date_viewed", "plays": - h.listUserSortMetrics(ctx, items, sortField, store, profileID, metrics) + h.listUserSortMetrics(ctx, items, sortField, store, userID, profileID, metrics) case "author", "narrator", "series": h.listAudiobookSortMetrics(ctx, items, sortField, metrics) } @@ -983,6 +1007,7 @@ func (h *ItemsHandler) listUserSortMetrics( items []*models.MediaItem, sortField string, store userstore.UserStore, + userID int, profileID string, metrics map[string]*sortMetricsResponse, ) { @@ -998,6 +1023,10 @@ func (h *ItemsHandler) listUserSortMetrics( if err != nil { return } + ebookProgressMap, err := h.listEbookReaderProgressByContentIDs(ctx, userID, profileID, contentIDs) + if err != nil { + return + } switch sortField { case "progress": @@ -1006,10 +1035,16 @@ func (h *ItemsHandler) listUserSortMetrics( continue } progress, ok := progressMap[item.ContentID] - if !ok || progress.Completed || progress.PositionSeconds <= 0 || progress.DurationSeconds <= 0 { + if ok && !progress.Completed && progress.PositionSeconds > 0 && progress.DurationSeconds > 0 { + ratio := progress.PositionSeconds / progress.DurationSeconds + metrics[item.ContentID] = &sortMetricsResponse{ProgressRatio: &ratio} continue } - ratio := progress.PositionSeconds / progress.DurationSeconds + ebookProgress, ok := ebookProgressMap[item.ContentID] + if !ok || ebookProgress.Progress <= 0 || ebookProgress.Progress >= models.EbookFinishedProgressThreshold { + continue + } + ratio := ebookProgress.Progress metrics[item.ContentID] = &sortMetricsResponse{ProgressRatio: &ratio} } case "date_viewed", "plays": @@ -1038,6 +1073,12 @@ func (h *ItemsHandler) listUserSortMetrics( if progress, ok := progressMap[item.ContentID]; ok && progress.Completed && progress.UpdatedAt > viewedAt { viewedAt = progress.UpdatedAt } + if progress, ok := ebookProgressMap[item.ContentID]; ok && progress.Progress >= models.EbookFinishedProgressThreshold { + ebookViewedAt := progress.UpdatedAt.UTC().Format(time.RFC3339) + if ebookViewedAt > viewedAt { + viewedAt = ebookViewedAt + } + } if viewedAt == "" { continue } @@ -1047,6 +1088,9 @@ func (h *ItemsHandler) listUserSortMetrics( if progress, ok := progressMap[item.ContentID]; ok && progress.Completed && playCount < 1 { playCount = 1 } + if progress, ok := ebookProgressMap[item.ContentID]; ok && progress.Progress >= models.EbookFinishedProgressThreshold && playCount < 1 { + playCount = 1 + } if playCount <= 0 { continue } @@ -1057,6 +1101,18 @@ func (h *ItemsHandler) listUserSortMetrics( } } +func (h *ItemsHandler) listEbookReaderProgressByContentIDs( + ctx context.Context, + userID int, + profileID string, + contentIDs []string, +) (map[string]EbookReaderProgress, error) { + if h == nil || h.ebookProgressStore == nil || userID <= 0 || profileID == "" || len(contentIDs) == 0 { + return nil, nil + } + return h.ebookProgressStore.ListByContentIDs(ctx, userID, profileID, contentIDs) +} + func uniqueItemContentIDs(items []*models.MediaItem) []string { contentIDs := make([]string, 0, len(items)) seen := make(map[string]struct{}, len(items)) @@ -1193,7 +1249,11 @@ func (h *ItemsHandler) toSeasonResponse(r *http.Request, seriesID string, s *mod return resp } -func (h *ItemsHandler) getLeafUserData(r *http.Request, contentID string) *catalog.SeasonUserData { +func (h *ItemsHandler) getLeafUserData(r *http.Request, contentID string, itemType ...string) *catalog.SeasonUserData { + if len(itemType) > 0 && itemType[0] == "ebook" { + return h.getEbookLeafUserData(r, contentID) + } + store, profileID, ok := h.userStoreForRequest(r) if !ok { return nil @@ -1217,6 +1277,38 @@ func (h *ItemsHandler) getLeafUserData(r *http.Request, contentID string) *catal } } +func (h *ItemsHandler) getEbookLeafUserData(r *http.Request, contentID string) *catalog.SeasonUserData { + if h == nil || h.ebookProgressStore == nil { + return nil + } + userID := apimw.GetUserID(r.Context()) + profileID := requestProfileID(r) + if userID <= 0 || profileID == "" || contentID == "" { + return nil + } + + progress, err := h.ebookProgressStore.ListByContentIDs(r.Context(), userID, profileID, []string{contentID}) + if err != nil { + return nil + } + row, ok := progress[contentID] + if !ok || row.Progress <= 0 { + return nil + } + + // Ebooks have no playback duration, so PositionSeconds/DurationSeconds + // encode the 0..1 reading ratio (position=ratio, duration=1). Clients can + // derive percent-complete from the pair as usual, but rendering them as + // absolute times is meaningless for ebooks. Changing the wire shape needs + // coordinated Android/Apple client updates. + return &catalog.SeasonUserData{ + PositionSeconds: row.Progress, + DurationSeconds: 1, + IsInProgress: row.Progress < models.EbookFinishedProgressThreshold, + Played: row.Progress >= models.EbookFinishedProgressThreshold, + } +} + func applyEffectiveEditionPreference(userData *catalog.SeasonUserData, target **string) { if userData == nil || userData.LastEditionKey == nil || *userData.LastEditionKey == "" { return @@ -1261,6 +1353,16 @@ func (h *ItemsHandler) getAggregateUserData(r *http.Request, episodes []*models. } } +// requestProfileID resolves the active profile for a request, falling back to +// the X-Profile-Id header when the auth context does not carry one. +func requestProfileID(r *http.Request) string { + profileID := apimw.GetProfileID(r.Context()) + if profileID == "" { + profileID = r.Header.Get("X-Profile-Id") + } + return profileID +} + func (h *ItemsHandler) userStoreForRequest(r *http.Request) (userstore.UserStore, string, bool) { if h.storeProvider == nil { return nil, "", false @@ -1271,10 +1373,7 @@ func (h *ItemsHandler) userStoreForRequest(r *http.Request) (userstore.UserStore return nil, "", false } - profileID := apimw.GetProfileID(r.Context()) - if profileID == "" { - profileID = r.Header.Get("X-Profile-Id") - } + profileID := requestProfileID(r) if profileID == "" { return nil, "", false } @@ -1468,6 +1567,10 @@ func (h *ItemsHandler) resolveWatchedTargets(ctx context.Context, contentID stri ContentID: item.ContentID, DurationSeconds: h.contentDurationSeconds(ctx, item.ContentID, "", item.Runtime), }}, nil + case "ebook": + // Ebooks have no playback duration; read state is keyed off + // ebook_reader_progress, so the leaf target only carries the ID. + return "ebook", []watchedLeafTarget{{ContentID: item.ContentID}}, nil case "series": if h.episodeRepo == nil { return "", nil, catalog.ErrItemNotFound diff --git a/internal/api/handlers/items_sort_metrics_test.go b/internal/api/handlers/items_sort_metrics_test.go index b8b77ff0..e80e32cc 100644 --- a/internal/api/handlers/items_sort_metrics_test.go +++ b/internal/api/handlers/items_sort_metrics_test.go @@ -40,20 +40,145 @@ func TestListSortMetricsIncludesUserStateSorts(t *testing.T) { } } - progressMetrics := handler.listSortMetrics(ctx, items, "progress", catalog.AccessFilter{}, nil, store, "profile-1") + progressMetrics := handler.listSortMetrics(ctx, items, "progress", catalog.AccessFilter{}, nil, store, 0, "profile-1") progress := progressMetrics["movie-progress"] if progress == nil || progress.ProgressRatio == nil || *progress.ProgressRatio != 0.25 { t.Fatalf("progress metrics = %#v", progress) } - viewedMetrics := handler.listSortMetrics(ctx, items, "date_viewed", catalog.AccessFilter{}, nil, store, "profile-1") + viewedMetrics := handler.listSortMetrics(ctx, items, "date_viewed", catalog.AccessFilter{}, nil, store, 0, "profile-1") if got := viewedMetrics["movie-viewed"]; got == nil || got.ViewedAt != "2026-05-29T18:30:00Z" { t.Fatalf("viewed metrics = %#v", got) } - playsMetrics := handler.listSortMetrics(ctx, items, "plays", catalog.AccessFilter{}, nil, store, "profile-1") + playsMetrics := handler.listSortMetrics(ctx, items, "plays", catalog.AccessFilter{}, nil, store, 0, "profile-1") plays := playsMetrics["movie-plays"] if plays == nil || plays.PlayCount == nil || *plays.PlayCount != 2 { t.Fatalf("plays metrics = %#v", plays) } } + +func TestListSortMetricsIncludesEbookReaderProgress(t *testing.T) { + ctx := context.Background() + store := newProfileTestStore(t) + updatedAt := time.Date(2026, 6, 3, 9, 15, 0, 0, time.UTC) + handler := &ItemsHandler{ + ebookProgressStore: &fakeEbookReaderProgressLister{ + progress: map[string]EbookReaderProgress{ + "ebook-progress": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-progress", + Progress: 0.37, + UpdatedAt: updatedAt, + }, + "ebook-complete": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-complete", + Progress: 0.95, + UpdatedAt: updatedAt.Add(time.Hour), + }, + }, + }, + } + items := []*models.MediaItem{ + {ContentID: "ebook-progress", Type: "ebook", Title: "Progress"}, + {ContentID: "ebook-complete", Type: "ebook", Title: "Complete"}, + } + + progressMetrics := handler.listSortMetrics(ctx, items, "progress", catalog.AccessFilter{}, nil, store, 42, "profile-1") + progress := progressMetrics["ebook-progress"] + if progress == nil || progress.ProgressRatio == nil || *progress.ProgressRatio != 0.37 { + t.Fatalf("progress metrics = %#v", progress) + } + + viewedMetrics := handler.listSortMetrics(ctx, items, "date_viewed", catalog.AccessFilter{}, nil, store, 42, "profile-1") + if got := viewedMetrics["ebook-complete"]; got == nil || got.ViewedAt != "2026-06-03T10:15:00Z" { + t.Fatalf("viewed metrics = %#v", got) + } + + playsMetrics := handler.listSortMetrics(ctx, items, "plays", catalog.AccessFilter{}, nil, store, 42, "profile-1") + plays := playsMetrics["ebook-complete"] + if plays == nil || plays.PlayCount == nil || *plays.PlayCount != 1 { + t.Fatalf("plays metrics = %#v", plays) + } +} + +func TestListSortMetricsExcludesHiddenEbookReaderProgress(t *testing.T) { + ctx := context.Background() + store := newProfileTestStore(t) + updatedAt := time.Date(2026, 6, 3, 9, 15, 0, 0, time.UTC) + handler := &ItemsHandler{ + ebookProgressStore: &fakeEbookReaderProgressLister{ + progress: map[string]EbookReaderProgress{ + "ebook-hidden": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-hidden", + Progress: 0.95, + UpdatedAt: updatedAt, + }, + "ebook-reread": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-reread", + Progress: 0.95, + UpdatedAt: updatedAt.Add(2 * time.Hour), + }, + }, + hiddenBefore: map[string]time.Time{ + "ebook-hidden": updatedAt.Add(time.Hour), + "ebook-reread": updatedAt.Add(time.Hour), + }, + }, + } + items := []*models.MediaItem{ + {ContentID: "ebook-hidden", Type: "ebook", Title: "Hidden"}, + {ContentID: "ebook-reread", Type: "ebook", Title: "Reread"}, + } + + viewedMetrics := handler.listSortMetrics(ctx, items, "date_viewed", catalog.AccessFilter{}, nil, store, 42, "profile-1") + if got := viewedMetrics["ebook-hidden"]; got != nil { + t.Fatalf("hidden ebook must have no viewed metrics, got %#v", got) + } + if got := viewedMetrics["ebook-reread"]; got == nil || got.ViewedAt != "2026-06-03T11:15:00Z" { + t.Fatalf("progress updated after hidden_before must count again, got %#v", got) + } + + playsMetrics := handler.listSortMetrics(ctx, items, "plays", catalog.AccessFilter{}, nil, store, 42, "profile-1") + if got := playsMetrics["ebook-hidden"]; got != nil { + t.Fatalf("hidden ebook must have no play count, got %#v", got) + } + if got := playsMetrics["ebook-reread"]; got == nil || got.PlayCount == nil || *got.PlayCount != 1 { + t.Fatalf("progress updated after hidden_before must count again, got %#v", got) + } +} + +type fakeEbookReaderProgressLister struct { + progress map[string]EbookReaderProgress + // hiddenBefore models user_history_hidden_items: like the PG store, a + // row is excluded while progress.UpdatedAt <= hidden_before and counts + // again once the progress row is updated after the hide. + hiddenBefore map[string]time.Time +} + +func (f *fakeEbookReaderProgressLister) ListByContentIDs( + _ context.Context, + _ int, + _ string, + contentIDs []string, +) (map[string]EbookReaderProgress, error) { + result := make(map[string]EbookReaderProgress, len(contentIDs)) + for _, contentID := range contentIDs { + progress, ok := f.progress[contentID] + if !ok { + continue + } + if hiddenBefore, hidden := f.hiddenBefore[contentID]; hidden && !progress.UpdatedAt.After(hiddenBefore) { + continue + } + result[contentID] = progress + } + return result, nil +} diff --git a/internal/api/handlers/items_user_data_test.go b/internal/api/handlers/items_user_data_test.go new file mode 100644 index 00000000..81f111d6 --- /dev/null +++ b/internal/api/handlers/items_user_data_test.go @@ -0,0 +1,47 @@ +package handlers + +import ( + "net/http/httptest" + "testing" + "time" + + apimw "github.com/Silo-Server/silo-server/internal/api/middleware" + "github.com/Silo-Server/silo-server/internal/auth" +) + +func TestGetLeafUserDataUsesEbookReaderProgress(t *testing.T) { + handler := &ItemsHandler{ + ebookProgressStore: &fakeEbookReaderProgressLister{ + progress: map[string]EbookReaderProgress{ + "ebook-progress": { + UserID: 7, + ProfileID: "profile-1", + ContentID: "ebook-progress", + Progress: 0.42, + UpdatedAt: time.Date(2026, 6, 5, 10, 0, 0, 0, time.UTC), + }, + "ebook-complete": { + UserID: 7, + ProfileID: "profile-1", + ContentID: "ebook-complete", + Progress: 0.93, + UpdatedAt: time.Date(2026, 6, 5, 11, 0, 0, 0, time.UTC), + }, + }, + }, + } + req := httptest.NewRequest("GET", "/items/ebook-progress", nil) + ctx := apimw.SetClaims(req.Context(), &auth.Claims{UserID: 7}) + ctx = apimw.SetProfileID(ctx, "profile-1") + req = req.WithContext(ctx) + + progress := handler.getLeafUserData(req, "ebook-progress", "ebook") + if progress == nil || progress.Played || !progress.IsInProgress || progress.PositionSeconds != 0.42 || progress.DurationSeconds != 1 { + t.Fatalf("partial ebook user data = %#v", progress) + } + + complete := handler.getLeafUserData(req, "ebook-complete", "ebook") + if complete == nil || !complete.Played || complete.IsInProgress { + t.Fatalf("completed ebook user data = %#v", complete) + } +} diff --git a/internal/api/handlers/libraries.go b/internal/api/handlers/libraries.go index c632d024..fae7be03 100644 --- a/internal/api/handlers/libraries.go +++ b/internal/api/handlers/libraries.go @@ -2034,18 +2034,8 @@ func (h *LibraryHandler) seedDefaultChain(ctx context.Context, libraryType strin return nil } - // Determine which content levels apply. - var levels []string - switch libraryType { - case "series": - levels = []string{"series", "season", "episode"} - case "movies", "movie": - levels = []string{"movie"} - case "audiobooks", "audiobook": - levels = []string{"audiobook"} - case "mixed": - levels = []string{"movie", "series", "season", "episode", "audiobook"} - default: + levels := metadataContentLevelsForLibraryType(libraryType) + if len(levels) == 0 { return nil } @@ -2098,6 +2088,23 @@ func (h *LibraryHandler) seedDefaultChain(ctx context.Context, libraryType strin return entries } +func metadataContentLevelsForLibraryType(libraryType string) []string { + switch libraryType { + case "series": + return []string{"series", "season", "episode"} + case "movies", "movie": + return []string{"movie"} + case "audiobooks", "audiobook": + return []string{"audiobook"} + case "ebooks", "ebook": + return []string{"ebook"} + case "mixed": + return []string{"movie", "series", "season", "episode", "audiobook", "ebook"} + default: + return nil + } +} + // HandleListStaleIDs handles GET /libraries/stale-ids. func (h *LibraryHandler) HandleListStaleIDs(w http.ResponseWriter, r *http.Request) { if h.StaleIDRepo == nil { diff --git a/internal/api/handlers/libraries_metadata_levels_test.go b/internal/api/handlers/libraries_metadata_levels_test.go new file mode 100644 index 00000000..b6a542b2 --- /dev/null +++ b/internal/api/handlers/libraries_metadata_levels_test.go @@ -0,0 +1,26 @@ +package handlers + +import ( + "reflect" + "testing" +) + +func TestMetadataContentLevelsForLibraryTypeIncludesEbooks(t *testing.T) { + cases := []struct { + name string + libraryType string + want []string + }{ + {name: "plural ebooks", libraryType: "ebooks", want: []string{"ebook"}}, + {name: "singular ebook", libraryType: "ebook", want: []string{"ebook"}}, + {name: "mixed includes ebook", libraryType: "mixed", want: []string{"movie", "series", "season", "episode", "audiobook", "ebook"}}, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if got := metadataContentLevelsForLibraryType(tc.libraryType); !reflect.DeepEqual(got, tc.want) { + t.Fatalf("metadataContentLevelsForLibraryType(%q) = %#v, want %#v", tc.libraryType, got, tc.want) + } + }) + } +} diff --git a/internal/api/handlers/recommendations.go b/internal/api/handlers/recommendations.go index efa2b322..13cf808a 100644 --- a/internal/api/handlers/recommendations.go +++ b/internal/api/handlers/recommendations.go @@ -48,6 +48,7 @@ type RecommendationsHandler struct { EpisodeRepo *catalog.EpisodeRepository WatchTonightFetcher watchTonightSectionFetcher CastFetcher cardsCastFetcher + EbookProgress EbookReaderProgressLister // RecWorker enqueues asynchronous taste-profile refreshes after writes // (taste seeding). Optional — when nil, refresh is simply skipped. RecWorker ProfileRefreshRequester @@ -643,7 +644,10 @@ func (h *RecommendationsHandler) loadItemEnrichment( if h.storeProvider != nil { store, storeErr := h.storeProvider.ForUser(ctx, userID) if storeErr == nil && store != nil { - states, stateErr := resolveItemUserStates(ctx, store, profileID, h.EpisodeRepo, mediaItems) + states, stateErr := resolveItemUserStatesWithOptions(ctx, store, profileID, h.EpisodeRepo, mediaItems, itemUserStateOptions{ + UserID: userID, + EbookProgressStore: h.EbookProgress, + }) if stateErr == nil { out.states = states } diff --git a/internal/api/handlers/sections.go b/internal/api/handlers/sections.go index d9551383..ea680a07 100644 --- a/internal/api/handlers/sections.go +++ b/internal/api/handlers/sections.go @@ -34,6 +34,7 @@ type SectionHandler struct { DetailSvc *catalog.DetailService Settings catalog.SettingsStore CollectionRepo *catalog.LibraryCollectionRepository + EbookProgress EbookReaderProgressLister } // NewSectionHandler creates a new SectionHandler. @@ -1380,7 +1381,10 @@ func (h *SectionHandler) listSectionItemUserStates(r *http.Request, items []*mod if err != nil || store == nil { return map[string]*itemUserStateResponse{} } - states, err := resolveItemUserStates(r.Context(), store, profileID, h.EpisodeRepo, items) + states, err := resolveItemUserStatesWithOptions(r.Context(), store, profileID, h.EpisodeRepo, items, itemUserStateOptions{ + UserID: userID, + EbookProgressStore: h.EbookProgress, + }) if err != nil { return map[string]*itemUserStateResponse{} } diff --git a/internal/api/handlers/taste_seed.go b/internal/api/handlers/taste_seed.go index ef70b37b..21f863f9 100644 --- a/internal/api/handlers/taste_seed.go +++ b/internal/api/handlers/taste_seed.go @@ -181,7 +181,10 @@ func (h *RecommendationsHandler) resolveTasteSeedUserStates(ctx context.Context, if err != nil || store == nil { return nil } - states, err := resolveItemUserStates(ctx, store, profileID, h.EpisodeRepo, mediaItems) + states, err := resolveItemUserStatesWithOptions(ctx, store, profileID, h.EpisodeRepo, mediaItems, itemUserStateOptions{ + UserID: userID, + EbookProgressStore: h.EbookProgress, + }) if err != nil { return nil } diff --git a/internal/api/handlers/user_state.go b/internal/api/handlers/user_state.go index 6857a73f..c947b614 100644 --- a/internal/api/handlers/user_state.go +++ b/internal/api/handlers/user_state.go @@ -14,12 +14,28 @@ type itemUserStateResponse struct { InWatchlist bool `json:"in_watchlist"` } +type itemUserStateOptions struct { + UserID int + EbookProgressStore EbookReaderProgressLister +} + func resolveItemUserStates( ctx context.Context, store userstore.UserStore, profileID string, episodeRepo *catalog.EpisodeRepository, items []*models.MediaItem, +) (map[string]*itemUserStateResponse, error) { + return resolveItemUserStatesWithOptions(ctx, store, profileID, episodeRepo, items, itemUserStateOptions{}) +} + +func resolveItemUserStatesWithOptions( + ctx context.Context, + store userstore.UserStore, + profileID string, + episodeRepo *catalog.EpisodeRepository, + items []*models.MediaItem, + options itemUserStateOptions, ) (map[string]*itemUserStateResponse, error) { result := make(map[string]*itemUserStateResponse, len(items)) if store == nil || profileID == "" || len(items) == 0 { @@ -111,6 +127,10 @@ func resolveItemUserStates( if err != nil { return nil, err } + ebookProgressMap, err := resolveEbookProgressForUserStates(ctx, options, profileID, contentIDs) + if err != nil { + return nil, err + } for _, item := range items { if item == nil || item.ContentID == "" { @@ -125,6 +145,8 @@ func resolveItemUserStates( state.Played = allEpisodesCompleted(seriesEpisodes[item.ContentID], progressMap) case "season": state.Played = allEpisodesCompleted(seasonEpisodes[item.ContentID], progressMap) + case "ebook": + state.Played = ebookProgressMap[item.ContentID].Progress >= models.EbookFinishedProgressThreshold default: state.Played = progressMap[item.ContentID].Completed } @@ -134,6 +156,18 @@ func resolveItemUserStates( return result, nil } +func resolveEbookProgressForUserStates( + ctx context.Context, + options itemUserStateOptions, + profileID string, + contentIDs []string, +) (map[string]EbookReaderProgress, error) { + if options.EbookProgressStore == nil || options.UserID <= 0 || profileID == "" || len(contentIDs) == 0 { + return nil, nil + } + return options.EbookProgressStore.ListByContentIDs(ctx, options.UserID, profileID, contentIDs) +} + func allEpisodesCompleted(episodes []*models.Episode, progressMap map[string]userstore.WatchProgress) bool { if len(episodes) == 0 { return false diff --git a/internal/api/handlers/user_state_test.go b/internal/api/handlers/user_state_test.go new file mode 100644 index 00000000..9ff974b3 --- /dev/null +++ b/internal/api/handlers/user_state_test.go @@ -0,0 +1,96 @@ +package handlers + +import ( + "context" + "testing" + "time" + + "github.com/Silo-Server/silo-server/internal/models" +) + +func TestResolveItemUserStatesIncludesCompletedEbookReaderProgress(t *testing.T) { + ctx := context.Background() + store := newProfileTestStore(t) + items := []*models.MediaItem{ + {ContentID: "ebook-complete", Type: "ebook", Title: "Complete Ebook"}, + {ContentID: "ebook-progress", Type: "ebook", Title: "Partial Ebook"}, + } + + states, err := resolveItemUserStatesWithOptions(ctx, store, "profile-1", nil, items, itemUserStateOptions{ + UserID: 42, + EbookProgressStore: &fakeEbookReaderProgressLister{ + progress: map[string]EbookReaderProgress{ + "ebook-complete": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-complete", + Progress: 0.95, + UpdatedAt: time.Date(2026, 6, 4, 10, 0, 0, 0, time.UTC), + }, + "ebook-progress": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-progress", + Progress: 0.45, + UpdatedAt: time.Date(2026, 6, 4, 9, 0, 0, 0, time.UTC), + }, + }, + }, + }) + if err != nil { + t.Fatalf("resolveItemUserStatesWithOptions: %v", err) + } + + if states["ebook-complete"] == nil || !states["ebook-complete"].Played { + t.Fatalf("completed ebook state = %+v, want played", states["ebook-complete"]) + } + if states["ebook-progress"] == nil || states["ebook-progress"].Played { + t.Fatalf("partial ebook state = %+v, want not played", states["ebook-progress"]) + } +} + +func TestResolveItemUserStatesExcludesHiddenEbookReaderProgress(t *testing.T) { + ctx := context.Background() + store := newProfileTestStore(t) + updatedAt := time.Date(2026, 6, 4, 10, 0, 0, 0, time.UTC) + items := []*models.MediaItem{ + {ContentID: "ebook-hidden", Type: "ebook", Title: "Hidden Ebook"}, + {ContentID: "ebook-reread", Type: "ebook", Title: "Reread Ebook"}, + } + + states, err := resolveItemUserStatesWithOptions(ctx, store, "profile-1", nil, items, itemUserStateOptions{ + UserID: 42, + EbookProgressStore: &fakeEbookReaderProgressLister{ + progress: map[string]EbookReaderProgress{ + "ebook-hidden": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-hidden", + Progress: 0.95, + UpdatedAt: updatedAt, + }, + "ebook-reread": { + UserID: 42, + ProfileID: "profile-1", + ContentID: "ebook-reread", + Progress: 0.95, + UpdatedAt: updatedAt.Add(2 * time.Hour), + }, + }, + hiddenBefore: map[string]time.Time{ + "ebook-hidden": updatedAt.Add(time.Hour), + "ebook-reread": updatedAt.Add(time.Hour), + }, + }, + }) + if err != nil { + t.Fatalf("resolveItemUserStatesWithOptions: %v", err) + } + + if states["ebook-hidden"] == nil || states["ebook-hidden"].Played { + t.Fatalf("hidden ebook state = %+v, want not played", states["ebook-hidden"]) + } + if states["ebook-reread"] == nil || !states["ebook-reread"].Played { + t.Fatalf("ebook updated after hidden_before = %+v, want played again", states["ebook-reread"]) + } +} diff --git a/internal/api/handlers/watch_tonight.go b/internal/api/handlers/watch_tonight.go index 2cb52821..10c7e997 100644 --- a/internal/api/handlers/watch_tonight.go +++ b/internal/api/handlers/watch_tonight.go @@ -362,7 +362,10 @@ func (h *RecommendationsHandler) enrichItems(r *http.Request, userID int, profil if h.storeProvider != nil { store, storeErr := h.storeProvider.ForUser(ctx, userID) if storeErr == nil && store != nil { - states, stateErr := resolveItemUserStates(ctx, store, profileID, h.EpisodeRepo, mediaItems) + states, stateErr := resolveItemUserStatesWithOptions(ctx, store, profileID, h.EpisodeRepo, mediaItems, itemUserStateOptions{ + UserID: userID, + EbookProgressStore: h.EbookProgress, + }) if stateErr == nil { stateMap = states } diff --git a/internal/api/router.go b/internal/api/router.go index 2d0a4d4d..e14c0bea 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -370,7 +370,14 @@ func NewRouter(deps Dependencies) chi.Router { var webhookSyncHandler *handlers.WebhookSyncHandler var requestHandler *handlers.RequestsHandler var autoscanHandler *handlers.AutoscanHandler + var ebookReaderHandler *handlers.EbookReaderHandler + var ebookProgressStore *handlers.PGEbookReaderProgressStore + var ebookConfigStore *handlers.PGEbookReaderConfigStore + var ebookAnnotationStore *handlers.PGEbookReaderAnnotationStore if deps.DB != nil { + ebookProgressStore = handlers.NewPGEbookReaderProgressStore(deps.DB) + ebookConfigStore = handlers.NewPGEbookReaderConfigStore(deps.DB) + ebookAnnotationStore = handlers.NewPGEbookReaderAnnotationStore(deps.DB) browseRepo := catalog.NewBrowseRepository(deps.DB) itemRepo = catalog.NewItemRepository(deps.DB) episodeRepo = catalog.NewEpisodeRepository(deps.DB) @@ -421,6 +428,25 @@ func NewRouter(deps Dependencies) chi.Router { if dispatcher, ok := deps.WatchProviderService.(handlers.LocalWatchEventDispatcher); ok { itemsHandler.SetLocalWatchEventDispatcher(dispatcher) } + if ebookProgressStore != nil { + itemsHandler.SetEbookReaderProgressStore(ebookProgressStore) + } + if deps.FileRepo != nil { + ebookReaderHandler = handlers.NewEbookReaderHandler(&handlers.MediaFileAuthorizer{ + FileResolver: deps.FileRepo, + ItemAccess: itemRepo, + EpisodeLookup: episodeRepo, + }) + if ebookProgressStore != nil { + ebookReaderHandler.ProgressStore = ebookProgressStore + } + if ebookConfigStore != nil { + ebookReaderHandler.ConfigStore = ebookConfigStore + } + if ebookAnnotationStore != nil { + ebookReaderHandler.AnnotationStore = ebookAnnotationStore + } + } catalogResourceHandler = handlers.NewCatalogResourceHandler(itemsHandler) catalogHandler = handlers.NewCatalogHandler( catalog.NewCatalogResolver(browseRepo, itemRepo). @@ -499,6 +525,9 @@ func NewRouter(deps Dependencies) chi.Router { if detailSvc != nil { personalDataHandler.SetDetailService(detailSvc) } + if ebookProgressStore != nil { + personalDataHandler.SetEbookReaderProgressStore(ebookProgressStore) + } personalDataHandler.SetEpisodeRepo(episodeRepo) personalDataHandler.SetSeasonRepo(seasonRepo) personalDataHandler.EventsHub = deps.EventsHub @@ -939,6 +968,9 @@ func NewRouter(deps Dependencies) chi.Router { } sectionHandler.EpisodeRepo = episodeRepo sectionHandler.DetailSvc = detailSvc + if ebookProgressStore != nil { + sectionHandler.EbookProgress = ebookProgressStore + } if userRepo != nil { sectionHandler.UserRepo = userRepo } @@ -1121,6 +1153,9 @@ func NewRouter(deps Dependencies) chi.Router { } recsHandler.CalendarRepo = calendarRepo recsHandler.EpisodeRepo = episodeRepo + if ebookProgressStore != nil { + recsHandler.EbookProgress = ebookProgressStore + } if deps.PersonRepo != nil { recsHandler.CastFetcher = deps.PersonRepo } @@ -1708,6 +1743,22 @@ func NewRouter(deps Dependencies) chi.Router { }) } + if ebookReaderHandler != nil { + r.Route("/ebooks", func(r chi.Router) { + r.Use(apimw.RequireProfile) + r.Get("/{content_id}/files/{file_id}/read", ebookReaderHandler.HandleReadFile) + r.Head("/{content_id}/files/{file_id}/read", ebookReaderHandler.HandleReadFile) + r.Get("/{content_id}/progress", ebookReaderHandler.HandleGetProgress) + r.Put("/{content_id}/progress", ebookReaderHandler.HandleSaveProgress) + r.Get("/{content_id}/reader-config", ebookReaderHandler.HandleGetConfig) + r.Put("/{content_id}/reader-config", ebookReaderHandler.HandleSaveConfig) + r.Get("/{content_id}/annotations", ebookReaderHandler.HandleListAnnotations) + r.Post("/{content_id}/annotations", ebookReaderHandler.HandleCreateAnnotation) + r.Patch("/{content_id}/annotations/{annotation_id}", ebookReaderHandler.HandleUpdateAnnotation) + r.Delete("/{content_id}/annotations/{annotation_id}", ebookReaderHandler.HandleDeleteAnnotation) + }) + } + // Subtitle search + AI translation routes. if subtitleSearchHandler != nil { if deps.FileRepo != nil && itemRepo != nil { diff --git a/internal/catalog/browse.go b/internal/catalog/browse.go index f87bd908..41cc3b41 100644 --- a/internal/catalog/browse.go +++ b/internal/catalog/browse.go @@ -767,9 +767,9 @@ func listDistinctPeopleByKindWithSource( } // listDistinctAudiobookSeriesWithSource returns distinct series_name values -// from audiobook_series joined onto the scoped result set. Names are trimmed +// from the active book series table joined onto the scoped result set. Names are trimmed // and case-folded for sort so the picker doesn't show duplicates that differ -// only by whitespace or casing — the literal trimmed series_name is still +// only by whitespace or casing; the literal trimmed series_name is still // returned so existing rules continue to match. // // The DISTINCT happens in an inline subquery (rather than directly on the @@ -791,14 +791,14 @@ func listDistinctAudiobookSeriesWithSource( SELECT name FROM ( SELECT DISTINCT BTRIM(s.series_name) AS name FROM %s - JOIN audiobook_series s ON s.content_id = mi.content_id + JOIN %s s ON s.content_id = mi.content_id %s AND s.series_name IS NOT NULL AND BTRIM(s.series_name) <> '' ) names ORDER BY LOWER(name) ASC LIMIT %d - `, fromClause, browseFilterPrefix(whereClause), catalogFacetMaxValues) + `, fromClause, bookSeriesTableForMediaScope(mediaScope), browseFilterPrefix(whereClause), catalogFacetMaxValues) return queryDistinctStrings(ctx, pool, query, args) } @@ -954,7 +954,7 @@ func searchDistinctAudiobookSeriesWithSource( SELECT name FROM ( SELECT DISTINCT BTRIM(s.series_name) AS name FROM %s - JOIN audiobook_series s ON s.content_id = mi.content_id + JOIN %s s ON s.content_id = mi.content_id %s AND s.series_name IS NOT NULL AND BTRIM(s.series_name) <> '' @@ -962,10 +962,17 @@ func searchDistinctAudiobookSeriesWithSource( ) names ORDER BY LOWER(name) ASC LIMIT %d - `, fromClause, browseFilterPrefix(whereClause), prefixIdx, limit+1) + `, fromClause, bookSeriesTableForMediaScope(mediaScope), browseFilterPrefix(whereClause), prefixIdx, limit+1) return queryFacetSearchResults(ctx, pool, query, args, limit) } +func bookSeriesTableForMediaScope(mediaScope string) string { + if mediaScope == "ebook" { + return "ebook_series" + } + return "audiobook_series" +} + // queryFacetSearchResults executes a facet search query that was built // with LIMIT N+1 and returns the first N rows plus a hasMore flag // indicating whether an additional row was present (i.e. the result set diff --git a/internal/catalog/catalog_parser_test.go b/internal/catalog/catalog_parser_test.go new file mode 100644 index 00000000..8f865ea0 --- /dev/null +++ b/internal/catalog/catalog_parser_test.go @@ -0,0 +1,9 @@ +package catalog + +import "testing" + +func TestParseCatalogMediaScope_AllowsEbook(t *testing.T) { + if got := parseCatalogMediaScope(" ebook "); got != "ebook" { + t.Fatalf("expected ebook media scope, got %q", got) + } +} diff --git a/internal/catalog/catalog_resolver.go b/internal/catalog/catalog_resolver.go index 75bdbd1d..fa26f325 100644 --- a/internal/catalog/catalog_resolver.go +++ b/internal/catalog/catalog_resolver.go @@ -39,10 +39,9 @@ type CatalogFiltersResult struct { Resolutions []string AudioLanguages []string SubtitleLanguages []string - // Authors, Narrators and Series are audiobook-native facets. Populated - // whenever the scope contains audiobook items; empty for video-only - // scopes. They share the item_people / audiobook_series tables so - // callers don't need to switch on media type. + // Authors, Narrators and Series are book-native facets. Authors and + // Narrators use item_people; Series uses the active book series table. + // Video-only scopes return these empty. Authors []string Narrators []string Series []string @@ -64,8 +63,8 @@ type facetFetcher interface { // PeopleByKind returns distinct people names for the given PersonKind // across the scoped result set. Used for Authors / Narrators facets. PeopleByKind(ctx context.Context, kind models.PersonKind, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) - // AudiobookSeries returns distinct series_name values from - // audiobook_series joined onto the scoped result set. + // AudiobookSeries returns distinct series_name values from the active + // book series table joined onto the scoped result set. AudiobookSeries(ctx context.Context, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) // SearchDistinctArrayColumn prefix-searches an array-column facet // (genres, studios, networks, countries). Returns up to limit @@ -710,7 +709,7 @@ func (r *CatalogResolver) ListFiltersWithOptions(ctx context.Context, req Catalo return r.listFiltersForSource(ctx, filters, options, episodeCatalogBaseRelation, req.Query.MediaScope) } - return r.listFiltersForSource(ctx, filters, options, "media_items mi", "") + return r.listFiltersForSource(ctx, filters, options, "media_items mi", req.Query.MediaScope) } // CatalogFacetSearchResult is the typed return for SearchFacet. Matches @@ -798,10 +797,9 @@ func (r *CatalogResolver) SearchFacet(ctx context.Context, req CatalogRequest, a } baseRelation := "media_items mi" - mediaScope := "" + mediaScope := req.Query.MediaScope if isEpisodeCatalogScope(req.Query.MediaScope) { baseRelation = episodeCatalogBaseRelation - mediaScope = req.Query.MediaScope } facets := r.facets @@ -837,6 +835,9 @@ func dispatchFacetSearch(ctx context.Context, facets facetFetcher, facet string, case "author": return facets.SearchPeopleByKind(ctx, models.PersonKindAuthor, filters, baseRelation, mediaScope, prefix, limit) case "narrator": + if mediaScope == "ebook" { + return nil, false, fmt.Errorf("%w: narrator facet is not available for ebook scope", ErrInvalidCatalogRequest) + } return facets.SearchPeopleByKind(ctx, models.PersonKindNarrator, filters, baseRelation, mediaScope, prefix, limit) case "series": return facets.SearchAudiobookSeries(ctx, filters, baseRelation, mediaScope, prefix, limit) @@ -958,14 +959,16 @@ func (r *CatalogResolver) listFiltersForSource( authors = out return nil })) - eg.Go(withLimit(func() error { - out, err := facets.PeopleByKind(gctx, models.PersonKindNarrator, filters, baseRelation, mediaScope) - if err != nil { - return fmt.Errorf("listing catalog narrators: %w", err) - } - narrators = out - return nil - })) + if mediaScope != "ebook" { + eg.Go(withLimit(func() error { + out, err := facets.PeopleByKind(gctx, models.PersonKindNarrator, filters, baseRelation, mediaScope) + if err != nil { + return fmt.Errorf("listing catalog narrators: %w", err) + } + narrators = out + return nil + })) + } eg.Go(withLimit(func() error { out, err := facets.AudiobookSeries(gctx, filters, baseRelation, mediaScope) if err != nil { @@ -1087,7 +1090,7 @@ func validateCatalogExactCollectionRequest(req CatalogRequest) error { func validateCatalogOverlayQuery(searchQuery string, def QueryDefinition, ruleFields, sortFields map[string]bool, allowRelevance bool) error { if !IsValidMediaScope(def.MediaScope) { - return fmt.Errorf("%w: media_scope must be 'movie', 'series', 'episode', 'audiobook', or 'video'", ErrInvalidCatalogRequest) + return fmt.Errorf("%w: media_scope must be 'movie', 'series', 'episode', 'audiobook', 'ebook', or 'video'", ErrInvalidCatalogRequest) } if def.Match != "" && def.Match != "all" && def.Match != "any" { return fmt.Errorf("%w: match must be 'all' or 'any'", ErrInvalidCatalogRequest) diff --git a/internal/catalog/catalog_resolver_test.go b/internal/catalog/catalog_resolver_test.go index 6cd46054..ef4f89a2 100644 --- a/internal/catalog/catalog_resolver_test.go +++ b/internal/catalog/catalog_resolver_test.go @@ -39,6 +39,21 @@ func TestValidateCatalogQueryRequest_AllowsEpisodeMediaScope(t *testing.T) { } } +func TestValidateCatalogQueryRequest_AllowsEbookMediaScope(t *testing.T) { + req := CatalogRequest{ + Source: CatalogSourceQuery, + Query: QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Sort: QuerySort{Field: "title", Order: "asc"}, + }, + } + + if err := validateCatalogQueryRequest(req, true); err != nil { + t.Fatalf("expected ebook media scope to be accepted, got %v", err) + } +} + func TestValidateCatalogQueryRequest_AllowsAddedAtFilter(t *testing.T) { req := CatalogRequest{ Source: CatalogSourceQuery, @@ -244,6 +259,67 @@ func (s *stubFacetFetcher) SearchAudiobookSeries(ctx context.Context, filters Br return nil, false, nil } +type recordingFacetFetcher struct { + mu sync.Mutex + peopleKinds []models.PersonKind + searchPeopleKind models.PersonKind + searchMediaScope string +} + +func (s *recordingFacetFetcher) DistinctArrayColumn(ctx context.Context, column string, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) DistinctScalarColumn(ctx context.Context, column string, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) Resolutions(ctx context.Context, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) JSONBLanguages(ctx context.Context, column string, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) SubtitleLanguages(ctx context.Context, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) PeopleByKind(ctx context.Context, kind models.PersonKind, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + s.mu.Lock() + s.peopleKinds = append(s.peopleKinds, kind) + s.mu.Unlock() + if kind == models.PersonKindAuthor { + return []string{"Author"}, nil + } + return []string{"Narrator"}, nil +} + +func (s *recordingFacetFetcher) AudiobookSeries(ctx context.Context, filters BrowseFilters, baseRelation string, mediaScope string) ([]string, error) { + return nil, nil +} + +func (s *recordingFacetFetcher) SearchDistinctArrayColumn(ctx context.Context, column string, filters BrowseFilters, baseRelation string, mediaScope string, prefix string, limit int) ([]string, bool, error) { + return nil, false, nil +} + +func (s *recordingFacetFetcher) SearchDistinctScalarColumn(ctx context.Context, column string, filters BrowseFilters, baseRelation string, mediaScope string, prefix string, limit int) ([]string, bool, error) { + return nil, false, nil +} + +func (s *recordingFacetFetcher) SearchPeopleByKind(ctx context.Context, kind models.PersonKind, filters BrowseFilters, baseRelation string, mediaScope string, prefix string, limit int) ([]string, bool, error) { + s.mu.Lock() + s.searchPeopleKind = kind + s.searchMediaScope = mediaScope + s.mu.Unlock() + return []string{"Author"}, false, nil +} + +func (s *recordingFacetFetcher) SearchAudiobookSeries(ctx context.Context, filters BrowseFilters, baseRelation string, mediaScope string, prefix string, limit int) ([]string, bool, error) { + return nil, false, nil +} + // countingExecutor is a previewExecutor stub that records the number of // PreviewPage calls and the AccessFilter passed in (so tests can confirm // NamePrefix made it through). It returns an empty result set so the resolver @@ -327,3 +403,92 @@ func TestListFiltersWithOptions_RunsFacetQueriesConcurrently(t *testing.T) { barrier.assertConcurrent(t) } + +func TestListFiltersWithOptions_EbookScopeSkipsNarratorFacet(t *testing.T) { + facets := &recordingFacetFetcher{} + resolver := &CatalogResolver{ + browseRepo: &BrowseRepository{}, + facets: facets, + } + + result, err := resolver.ListFiltersWithOptions( + context.Background(), + CatalogRequest{ + Source: CatalogSourceQuery, + Query: QueryDefinition{MediaScope: "ebook"}, + }, + AccessFilter{}, + CatalogFilterOptions{}, + ) + if err != nil { + t.Fatalf("ListFiltersWithOptions returned error: %v", err) + } + + facets.mu.Lock() + defer facets.mu.Unlock() + for _, kind := range facets.peopleKinds { + if kind == models.PersonKindNarrator { + t.Fatal("ebook filters should not request narrator facets") + } + } + if len(result.Narrators) != 0 { + t.Fatalf("ebook filters returned narrators = %v, want empty", result.Narrators) + } +} + +func TestSearchFacet_EbookScopeForwardsMediaScope(t *testing.T) { + facets := &recordingFacetFetcher{} + resolver := &CatalogResolver{ + browseRepo: &BrowseRepository{}, + facets: facets, + } + + result, err := resolver.SearchFacet( + context.Background(), + CatalogRequest{ + Source: CatalogSourceQuery, + Query: QueryDefinition{MediaScope: "ebook"}, + }, + AccessFilter{}, + "author", + "Au", + 20, + ) + if err != nil { + t.Fatalf("SearchFacet returned error: %v", err) + } + if len(result.Matches) != 1 || result.Matches[0] != "Author" { + t.Fatalf("matches = %v, want Author", result.Matches) + } + + facets.mu.Lock() + defer facets.mu.Unlock() + if facets.searchPeopleKind != models.PersonKindAuthor { + t.Fatalf("searchPeopleKind = %v, want author", facets.searchPeopleKind) + } + if facets.searchMediaScope != "ebook" { + t.Fatalf("search mediaScope = %q, want ebook", facets.searchMediaScope) + } +} + +func TestSearchFacet_EbookScopeRejectsNarratorFacet(t *testing.T) { + resolver := &CatalogResolver{ + browseRepo: &BrowseRepository{}, + facets: &recordingFacetFetcher{}, + } + + _, err := resolver.SearchFacet( + context.Background(), + CatalogRequest{ + Source: CatalogSourceQuery, + Query: QueryDefinition{MediaScope: "ebook"}, + }, + AccessFilter{}, + "narrator", + "Na", + 20, + ) + if err == nil { + t.Fatal("expected narrator facet to be rejected for ebook scope") + } +} diff --git a/internal/catalog/detail.go b/internal/catalog/detail.go index 4c56ba73..e46b016a 100644 --- a/internal/catalog/detail.go +++ b/internal/catalog/detail.go @@ -157,6 +157,9 @@ type ItemDetail struct { // Audiobook-specific detail. Present only when Type == "audiobook". Audiobook *AudiobookDetailExtension `json:"audiobook,omitempty"` + + // Ebook-specific detail. Present only when Type == "ebook". + Ebook *EbookDetailExtension `json:"ebook,omitempty"` } type AudiobookDetailExtension struct { @@ -201,6 +204,13 @@ type AudiobookNarration struct { Narrators []string `json:"narrators"` } +type EbookDetailExtension struct { + Authors []AudiobookPerson `json:"authors"` + Publisher string `json:"publisher,omitempty"` + Series *AudiobookSeriesGroup `json:"series,omitempty"` + Related AudiobookRelatedContent `json:"related"` +} + // ItemUserState is per-profile viewer state included in item detail responses. type ItemUserState struct { Played bool `json:"played"` @@ -895,6 +905,9 @@ func (s *DetailService) buildMediaItemDetail(ctx context.Context, item *models.M if item.Type == "audiobook" { detail.Audiobook = s.buildAudiobookExtension(ctx, item, detail.Versions, crewCredits, filter) } + if item.Type == "ebook" { + detail.Ebook = s.buildEbookExtension(ctx, item, crewCredits, filter) + } // Series folder paths from confirmed claims when available, otherwise from // the file links that currently belong to the item. This keeps provisional @@ -1036,6 +1049,26 @@ func (s *DetailService) buildAudiobookExtension( } } +func (s *DetailService) buildEbookExtension( + ctx context.Context, + item *models.MediaItem, + crew []CrewCredit, + filter AccessFilter, +) *EbookDetailExtension { + if item == nil { + return nil + } + return &EbookDetailExtension{ + Authors: audiobookPeopleFromCrew(crew, models.PersonKindAuthor.String()), + Publisher: firstNonEmptyString(item.Studios), + Series: s.fetchEbookSeries(ctx, item.ContentID, filter), + Related: AudiobookRelatedContent{ + AlsoByAuthor: s.fetchEbookAlsoByAuthor(ctx, item.ContentID, filter), + Similar: s.fetchEbookSimilarByGenres(ctx, item.ContentID, filter), + }, + } +} + func audiobookPeopleFromCrew(crew []CrewCredit, job string) []AudiobookPerson { out := make([]AudiobookPerson, 0) for _, credit := range crew { @@ -1107,15 +1140,23 @@ func appendAudiobookItemAccessConditions( } func (s *DetailService) fetchAudiobookAlsoByAuthor(ctx context.Context, contentID string, filter AccessFilter) []AudiobookRelatedItem { + return s.fetchBookAlsoByAuthor(ctx, contentID, "audiobook", filter) +} + +func (s *DetailService) fetchEbookAlsoByAuthor(ctx context.Context, contentID string, filter AccessFilter) []AudiobookRelatedItem { + return s.fetchBookAlsoByAuthor(ctx, contentID, "ebook", filter) +} + +func (s *DetailService) fetchBookAlsoByAuthor(ctx context.Context, contentID string, mediaType string, filter AccessFilter) []AudiobookRelatedItem { if s == nil || s.itemRepo == nil || s.itemRepo.pool == nil { return []AudiobookRelatedItem{} } - args := []any{contentID, models.PersonKindAuthor} - argIdx := 3 + args := []any{contentID, models.PersonKindAuthor, mediaType} + argIdx := 4 conditions := []string{ "ip1.content_id = $1", "ip1.kind = $2", - "m2.type = 'audiobook'", + "m2.type = $3", } if !appendAudiobookItemAccessConditions("m2", filter, &conditions, &args, &argIdx) { return []AudiobookRelatedItem{} @@ -1157,13 +1198,21 @@ func (s *DetailService) fetchAudiobookAlsoByAuthor(ctx context.Context, contentI } func (s *DetailService) fetchAudiobookSimilarByGenres(ctx context.Context, contentID string, filter AccessFilter) []AudiobookRelatedItem { + return s.fetchBookSimilarByGenres(ctx, contentID, "audiobook", filter) +} + +func (s *DetailService) fetchEbookSimilarByGenres(ctx context.Context, contentID string, filter AccessFilter) []AudiobookRelatedItem { + return s.fetchBookSimilarByGenres(ctx, contentID, "ebook", filter) +} + +func (s *DetailService) fetchBookSimilarByGenres(ctx context.Context, contentID string, mediaType string, filter AccessFilter) []AudiobookRelatedItem { if s == nil || s.itemRepo == nil || s.itemRepo.pool == nil { return []AudiobookRelatedItem{} } - args := []any{contentID, models.PersonKindAuthor} - argIdx := 3 + args := []any{contentID, models.PersonKindAuthor, mediaType} + argIdx := 4 conditions := []string{ - "m.type = 'audiobook'", + "m.type = $3", "m.content_id <> $1", "m.genres && (SELECT array_agg(g) FROM this_genres)", `NOT EXISTS ( @@ -1216,14 +1265,27 @@ func (s *DetailService) fetchAudiobookSimilarByGenres(ctx context.Context, conte } func (s *DetailService) fetchAudiobookSeries(ctx context.Context, contentID string, filter AccessFilter) *AudiobookSeriesGroup { + return s.fetchBookSeries(ctx, contentID, "audiobook", "audiobook_series", filter) +} + +func (s *DetailService) fetchEbookSeries(ctx context.Context, contentID string, filter AccessFilter) *AudiobookSeriesGroup { + return s.fetchBookSeries(ctx, contentID, "ebook", "ebook_series", filter) +} + +func (s *DetailService) fetchBookSeries(ctx context.Context, contentID string, mediaType string, tableName string, filter AccessFilter) *AudiobookSeriesGroup { if s == nil || s.itemRepo == nil || s.itemRepo.pool == nil { return nil } - args := []any{contentID} - argIdx := 2 + switch tableName { + case "audiobook_series", "ebook_series": + default: + return nil + } + args := []any{contentID, mediaType} + argIdx := 3 conditions := []string{ "root.content_id = $1", - "m.type = 'audiobook'", + "m.type = $2", } if !appendAudiobookItemAccessConditions("m", filter, &conditions, &args, &argIdx) { return nil @@ -1236,13 +1298,13 @@ func (s *DetailService) fetchAudiobookSeries(ctx context.Context, contentID stri COALESCE(m.poster_path, ''), s.series_name, s.series_index - FROM audiobook_series root - JOIN audiobook_series s ON LOWER(s.series_name) = LOWER(root.series_name) + FROM %s root + JOIN %s s ON LOWER(s.series_name) = LOWER(root.series_name) JOIN media_items m ON m.content_id = s.content_id WHERE %s ORDER BY s.series_index NULLS LAST, LOWER(m.sort_title) LIMIT 30 - `, strings.Join(conditions, " AND ")) + `, tableName, tableName, strings.Join(conditions, " AND ")) rows, err := s.itemRepo.pool.Query(ctx, query, args...) if err != nil { return nil diff --git a/internal/catalog/detail_audiobook_test.go b/internal/catalog/detail_audiobook_test.go index 35763e1a..6b1b06e8 100644 --- a/internal/catalog/detail_audiobook_test.go +++ b/internal/catalog/detail_audiobook_test.go @@ -76,3 +76,27 @@ func (r *recordingCatalogImageResolver) ResolveImageURLs(_ context.Context, path } return out } + +func TestBuildEbookExtensionUsesAuthorsAndPublisherWithoutNarrators(t *testing.T) { + crew := []CrewCredit{ + {Name: "Becky Chambers", Job: models.PersonKindAuthor.String(), PersonID: "10"}, + {Name: "Narrator Should Not Apply", Job: models.PersonKindNarrator.String(), PersonID: "20"}, + } + item := &models.MediaItem{ + ContentID: "ebook-1", + Type: "ebook", + Studios: []string{"Tor"}, + } + + extension := (&DetailService{}).buildEbookExtension(nil, item, crew, AccessFilter{}) + + if extension == nil { + t.Fatal("buildEbookExtension returned nil") + } + if len(extension.Authors) != 1 || extension.Authors[0].Name != "Becky Chambers" { + t.Fatalf("Authors = %+v, want Becky Chambers", extension.Authors) + } + if extension.Publisher != "Tor" { + t.Fatalf("Publisher = %q, want Tor", extension.Publisher) + } +} diff --git a/internal/catalog/item_repo.go b/internal/catalog/item_repo.go index 716a81c5..015d3be9 100644 --- a/internal/catalog/item_repo.go +++ b/internal/catalog/item_repo.go @@ -35,6 +35,49 @@ func NewItemRepository(pool *pgxpool.Pool) *ItemRepository { return &ItemRepository{pool: pool} } +// GetPoster returns the current poster path and thumbhash for a media item. +// Missing or NULL values are returned as empty strings. +func (r *ItemRepository) GetPoster(ctx context.Context, contentID string) (posterPath string, posterThumbhash string, err error) { + if r == nil || r.pool == nil { + return "", "", ErrItemNotFound + } + if err := r.pool.QueryRow(ctx, ` + SELECT COALESCE(poster_path, ''), COALESCE(poster_thumbhash, '') + FROM media_items + WHERE content_id = $1 + `, contentID).Scan(&posterPath, &posterThumbhash); err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return "", "", ErrItemNotFound + } + return "", "", fmt.Errorf("getting media item poster: %w", err) + } + return posterPath, posterThumbhash, nil +} + +// SetLocalPoster records a locally extracted poster without ever overwriting +// provider or manually applied artwork: the row is updated only when the item +// has no poster yet or its current poster lives under localPrefix. The +// condition is evaluated atomically in SQL so concurrent metadata writers +// (e.g. the ebook enrichment sweep) cannot be clobbered between a read and a +// write. Returns true when a row was updated. +func (r *ItemRepository) SetLocalPoster(ctx context.Context, contentID, posterPath, thumbhash, localPrefix string) (bool, error) { + if r == nil || r.pool == nil { + return false, ErrItemNotFound + } + tag, err := r.pool.Exec(ctx, ` + UPDATE media_items + SET poster_path = $2, + poster_thumbhash = NULLIF($3, ''), + updated_at = NOW() + WHERE content_id = $1 + AND (poster_path IS NULL OR poster_path = '' OR poster_path LIKE $4 || '%') + `, contentID, posterPath, thumbhash, localPrefix) + if err != nil { + return false, fmt.Errorf("setting local poster: %w", err) + } + return tag.RowsAffected() > 0, nil +} + // GetPosterPath returns the current poster path for a media item. Missing or // NULL poster values are returned as an empty string. func (r *ItemRepository) GetPosterPath(ctx context.Context, contentID string) (string, error) { diff --git a/internal/catalog/query_builder.go b/internal/catalog/query_builder.go index 6767db87..126b30e3 100644 --- a/internal/catalog/query_builder.go +++ b/internal/catalog/query_builder.go @@ -11,6 +11,12 @@ import ( "github.com/Silo-Server/silo-server/internal/models" ) +// EbookFinishedProgressThresholdSQL is models.EbookFinishedProgressThreshold +// rendered as a SQL numeric literal. Queries that classify ebook reader +// progress as finished must interpolate this value instead of hardcoding the +// threshold so the definition of "finished" cannot drift between subsystems. +var EbookFinishedProgressThresholdSQL = strconv.FormatFloat(models.EbookFinishedProgressThreshold, 'f', -1, 64) + type QueryBuilder struct { alias string argIdx int @@ -159,9 +165,10 @@ func (qb *QueryBuilder) UserHistoryCTEArgs() []any { // UserHistoryCTESQL returns the user_last_watched CTE definition. The two // placeholder positions (user_id, profile_id) are bound to the args returned // by UserHistoryCTEArgs and should be the first two entries in the final -// statement's arg list. The CTE aggregates user_watch_history watch_at and -// user_watch_progress.completed=TRUE updated_at into one row per -// media_item_id, filtering out items the user has hidden via +// statement's arg list. The CTE aggregates user_watch_history watched_at, +// user_watch_progress.completed=TRUE updated_at, and completed ebook reader +// progress updated_at into one row per media_item_id, filtering out videos the +// user has hidden via // user_history_hidden_items. The single GROUP BY replaces the two // correlated MAX subqueries the previous lastWatchedExpr emitted (audit // 2026-05-01 §3.1 Pattern B). @@ -187,6 +194,10 @@ func UserHistoryCTESQL(argIdx int) string { SELECT uwp.media_item_id, NULL::timestamptz, uwp.updated_at FROM user_watch_progress uwp WHERE uwp.user_id = $%d AND uwp.profile_id = $%d AND uwp.completed = TRUE + UNION ALL + SELECT erp.content_id AS media_item_id, NULL::timestamptz, erp.updated_at + FROM ebook_reader_progress erp + WHERE erp.user_id = $%d AND erp.profile_id = $%d AND erp.progress >= %s ) src WHERE NOT EXISTS ( SELECT 1 FROM user_history_hidden_items hhi @@ -195,7 +206,7 @@ func UserHistoryCTESQL(argIdx int) string { AND COALESCE(src.uwh_at, src.uwp_at) <= hhi.hidden_before ) GROUP BY src.media_item_id -)`, argIdx, argIdx+1, argIdx, argIdx+1, argIdx, argIdx+1) +)`, argIdx, argIdx+1, argIdx, argIdx+1, argIdx, argIdx+1, EbookFinishedProgressThresholdSQL, argIdx, argIdx+1) } func (qb *QueryBuilder) BuildSortClause(sortConfig QuerySort) (string, []any, error) { @@ -298,7 +309,8 @@ func (qb *QueryBuilder) BuildSortPlan(sortConfig QuerySort) (QuerySortPlan, erro return plan, nil case "series": plan.Joins = []string{fmt.Sprintf( - "LEFT JOIN audiobook_series sort_series ON sort_series.content_id = %s.content_id", + "LEFT JOIN %s sort_series ON sort_series.content_id = %s.content_id", + qb.bookSeriesTable(), qb.alias, )} // Sort by series name primarily, then by series_index so books @@ -385,7 +397,7 @@ func (qb *QueryBuilder) buildRule(rule QueryRule) (string, error) { case "narrator": return qb.buildPersonClause(models.PersonKindNarrator, rule) case "series": - return qb.buildAudiobookSeriesClause(rule) + return qb.buildBookSeriesClause(rule) case "watched": return qb.buildWatchedClause(rule) case "favorited": @@ -502,14 +514,21 @@ func (qb *QueryBuilder) personKindSortJoin(kind models.PersonKind, alias string) ) } -func (qb *QueryBuilder) buildAudiobookSeriesClause(rule QueryRule) (string, error) { +func (qb *QueryBuilder) bookSeriesTable() string { + if qb.mediaScope == "ebook" { + return "ebook_series" + } + return "audiobook_series" +} + +func (qb *QueryBuilder) buildBookSeriesClause(rule QueryRule) (string, error) { qb.args = append(qb.args, rule.Value) clause := fmt.Sprintf(`EXISTS ( SELECT 1 - FROM audiobook_series s + FROM %s s WHERE s.content_id = %s.content_id AND LOWER(BTRIM(s.series_name)) = LOWER(BTRIM($%d)) - )`, qb.alias, qb.argIdx) +)`, qb.bookSeriesTable(), qb.alias, qb.argIdx) qb.argIdx++ if rule.Op == "is_not" { return "NOT (" + clause + ")", nil @@ -947,6 +966,9 @@ func (qb *QueryBuilder) buildInProgressClause(rule QueryRule) (string, error) { if !ok { return "", fmt.Errorf("in_progress requires a boolean value") } + if qb.mediaScope == "ebook" { + return qb.buildEbookInProgressClause(value), nil + } qb.args = append(qb.args, qb.userID, qb.profileID) clause := fmt.Sprintf(`EXISTS ( SELECT 1 @@ -971,6 +993,32 @@ func (qb *QueryBuilder) buildInProgressClause(rule QueryRule) (string, error) { return clause, nil } +func (qb *QueryBuilder) buildEbookInProgressClause(value bool) string { + qb.args = append(qb.args, qb.userID, qb.profileID) + clause := fmt.Sprintf(`EXISTS ( + SELECT 1 + FROM ebook_reader_progress erp + WHERE erp.user_id = $%d + AND erp.profile_id = $%d + AND erp.content_id = %s.content_id + AND erp.progress > 0 + AND erp.progress < %s + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = $%d + AND hhi.profile_id = $%d + AND hhi.media_item_id = erp.content_id + AND erp.updated_at <= hhi.hidden_before + ) + )`, qb.argIdx, qb.argIdx+1, qb.alias, EbookFinishedProgressThresholdSQL, qb.argIdx, qb.argIdx+1) + qb.argIdx += 2 + if !value { + return "NOT (" + clause + ")" + } + return clause +} + func (qb *QueryBuilder) buildLastWatchedClause(rule QueryRule) (string, error) { if err := qb.ensureUserScope(rule.Field); err != nil { return "", err @@ -1069,6 +1117,9 @@ func (qb *QueryBuilder) buildReleaseDateClause(rule QueryRule) (string, error) { } func (qb *QueryBuilder) userStateCompletionClause() string { + if qb.mediaScope == "ebook" { + return qb.ebookUserStateCompletionClause() + } qb.args = append(qb.args, qb.userID, qb.profileID) clause := fmt.Sprintf(`( EXISTS ( @@ -1119,6 +1170,28 @@ func (qb *QueryBuilder) userStateCompletionClause() string { return clause } +func (qb *QueryBuilder) ebookUserStateCompletionClause() string { + qb.args = append(qb.args, qb.userID, qb.profileID) + clause := fmt.Sprintf(`EXISTS ( + SELECT 1 + FROM ebook_reader_progress erp + WHERE erp.user_id = $%d + AND erp.profile_id = $%d + AND erp.content_id = %s.content_id + AND erp.progress >= %s + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = $%d + AND hhi.profile_id = $%d + AND hhi.media_item_id = erp.content_id + AND erp.updated_at <= hhi.hidden_before + ) + )`, qb.argIdx, qb.argIdx+1, qb.alias, EbookFinishedProgressThresholdSQL, qb.argIdx, qb.argIdx+1) + qb.argIdx += 2 + return clause +} + // lastWatchedExpr returns the SQL expression the executor binds to the // per-user history aggregate. It signals the executor (via // requireUserHistoryCTE) that the user_last_watched CTE and a LEFT JOIN @@ -1342,6 +1415,9 @@ func (qb *QueryBuilder) consumeIntArgs(values []int) ([]string, []any) { } func (qb *QueryBuilder) progressSortPlan() (string, []string, []any) { + if qb.mediaScope == "ebook" { + return qb.ebookProgressSortPlan() + } joinSQL := fmt.Sprintf( `LEFT JOIN ( SELECT uwp.media_item_id AS content_id, @@ -1369,7 +1445,39 @@ func (qb *QueryBuilder) progressSortPlan() (string, []string, []any) { return "sort_progress.progress_ratio", []string{joinSQL}, []any{qb.userID, qb.profileID} } +func (qb *QueryBuilder) ebookProgressSortPlan() (string, []string, []any) { + joinSQL := fmt.Sprintf( + `LEFT JOIN ( + SELECT erp.content_id, + CASE + WHEN erp.progress > 0 + AND erp.progress < %s + AND (hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before) + THEN erp.progress::double precision + ELSE NULL + END AS progress_ratio + FROM ebook_reader_progress erp + LEFT JOIN user_history_hidden_items hhi + ON hhi.user_id = $%d + AND hhi.profile_id = $%d + AND hhi.media_item_id = erp.content_id + WHERE erp.user_id = $%d + AND erp.profile_id = $%d + ) sort_progress ON sort_progress.content_id = %s.content_id`, + EbookFinishedProgressThresholdSQL, + qb.argIdx, + qb.argIdx+1, + qb.argIdx, + qb.argIdx+1, + qb.alias, + ) + return "sort_progress.progress_ratio", []string{joinSQL}, []any{qb.userID, qb.profileID} +} + func (qb *QueryBuilder) dateViewedSortPlan() (string, []string, []any) { + if qb.mediaScope == "ebook" { + return qb.ebookDateViewedSortPlan() + } historyJoin := fmt.Sprintf( `LEFT JOIN ( SELECT uwh.media_item_id AS content_id, MAX(uwh.watched_at) AS viewed_at @@ -1420,7 +1528,38 @@ func (qb *QueryBuilder) dateViewedSortPlan() (string, []string, []any) { return expr, []string{historyJoin, progressJoin}, []any{qb.userID, qb.profileID} } +func (qb *QueryBuilder) ebookDateViewedSortPlan() (string, []string, []any) { + joinSQL := fmt.Sprintf( + `LEFT JOIN ( + SELECT erp.content_id, + CASE + WHEN erp.progress >= %s + AND (hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before) + THEN erp.updated_at + ELSE NULL + END AS viewed_at + FROM ebook_reader_progress erp + LEFT JOIN user_history_hidden_items hhi + ON hhi.user_id = $%d + AND hhi.profile_id = $%d + AND hhi.media_item_id = erp.content_id + WHERE erp.user_id = $%d + AND erp.profile_id = $%d + ) sort_ebook_viewed ON sort_ebook_viewed.content_id = %s.content_id`, + EbookFinishedProgressThresholdSQL, + qb.argIdx, + qb.argIdx+1, + qb.argIdx, + qb.argIdx+1, + qb.alias, + ) + return "sort_ebook_viewed.viewed_at", []string{joinSQL}, []any{qb.userID, qb.profileID} +} + func (qb *QueryBuilder) playsSortPlan() (string, []string, []any) { + if qb.mediaScope == "ebook" { + return qb.ebookPlaysSortPlan() + } historyJoin := fmt.Sprintf( `LEFT JOIN ( SELECT uwh.media_item_id AS content_id, COUNT(*) AS play_count @@ -1471,6 +1610,34 @@ func (qb *QueryBuilder) playsSortPlan() (string, []string, []any) { return expr, []string{historyJoin, progressJoin}, []any{qb.userID, qb.profileID} } +func (qb *QueryBuilder) ebookPlaysSortPlan() (string, []string, []any) { + joinSQL := fmt.Sprintf( + `LEFT JOIN ( + SELECT erp.content_id, + CASE + WHEN erp.progress >= %s + AND (hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before) + THEN 1 + ELSE 0 + END AS completed_play_count + FROM ebook_reader_progress erp + LEFT JOIN user_history_hidden_items hhi + ON hhi.user_id = $%d + AND hhi.profile_id = $%d + AND hhi.media_item_id = erp.content_id + WHERE erp.user_id = $%d + AND erp.profile_id = $%d + ) sort_ebook_plays ON sort_ebook_plays.content_id = %s.content_id`, + EbookFinishedProgressThresholdSQL, + qb.argIdx, + qb.argIdx+1, + qb.argIdx, + qb.argIdx+1, + qb.alias, + ) + return "NULLIF(sort_ebook_plays.completed_play_count, 0)", []string{joinSQL}, []any{qb.userID, qb.profileID} +} + func (qb *QueryBuilder) lastAirDateSortPlan() (string, []string) { expr := fmt.Sprintf("%s.last_air_date_at", qb.alias) return expr, nil // denormalized column — no JOIN required diff --git a/internal/catalog/query_builder_test.go b/internal/catalog/query_builder_test.go index 8c692ffc..7b6b20de 100644 --- a/internal/catalog/query_builder_test.go +++ b/internal/catalog/query_builder_test.go @@ -390,6 +390,161 @@ func TestBuildSortClause_PersonalizedComputedSorts(t *testing.T) { } } +func TestBuildSortClause_EbookPersonalizedComputedSortsUseReaderProgress(t *testing.T) { + builder := NewQueryBuilder("mi").WithMediaScope("ebook").WithUserScope(42, "profile-1") + tests := []struct { + field string + expectJoin []string + expectExpr []string + }{ + { + field: "progress", + expectJoin: []string{ + "FROM ebook_reader_progress erp", + "erp.progress > 0", + "erp.progress < 0.9", + "LEFT JOIN user_history_hidden_items hhi", + "hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before", + }, + expectExpr: []string{"sort_progress.progress_ratio"}, + }, + { + field: "date_viewed", + expectJoin: []string{ + "FROM ebook_reader_progress erp", + "erp.progress >= 0.9", + "LEFT JOIN user_history_hidden_items hhi", + "hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before", + }, + expectExpr: []string{"sort_ebook_viewed.viewed_at"}, + }, + { + field: "plays", + expectJoin: []string{ + "FROM ebook_reader_progress erp", + "erp.progress >= 0.9", + "completed_play_count", + "LEFT JOIN user_history_hidden_items hhi", + "hhi.media_item_id IS NULL OR erp.updated_at > hhi.hidden_before", + }, + expectExpr: []string{"sort_ebook_plays.completed_play_count"}, + }, + } + + for _, tt := range tests { + plan, err := builder.BuildSortPlan(QuerySort{Field: tt.field, Order: "desc"}) + if err != nil { + t.Fatalf("%s: BuildSortPlan returned error: %v", tt.field, err) + } + if len(plan.Args) != 2 || plan.Args[0] != 42 || plan.Args[1] != "profile-1" { + t.Fatalf("%s: expected user scope args, got %v", tt.field, plan.Args) + } + joined := strings.Join(plan.Joins, "\n") + for _, fragment := range tt.expectJoin { + if !strings.Contains(joined, fragment) { + t.Fatalf("%s: expected joins to contain %q, got %q", tt.field, fragment, joined) + } + } + for _, fragment := range tt.expectExpr { + if !strings.Contains(plan.OrderBy, fragment) { + t.Fatalf("%s: expected order by to contain %q, got %q", tt.field, fragment, plan.OrderBy) + } + } + } +} + +func TestBuild_EbookUserStateRulesUseReaderProgress(t *testing.T) { + tests := []struct { + name string + rule QueryRule + expectSQL []string + unexpectSQL []string + }{ + { + name: "watched", + rule: QueryRule{Field: "watched", Op: "is", Value: true}, + expectSQL: []string{ + "FROM ebook_reader_progress erp", + "erp.progress >= 0.9", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = erp.content_id", + "erp.updated_at <= hhi.hidden_before", + }, + unexpectSQL: []string{"FROM user_watch_progress uwp", "FROM user_watch_history uwh"}, + }, + { + name: "unread", + rule: QueryRule{Field: "watched", Op: "is", Value: false}, + expectSQL: []string{ + "NOT (EXISTS", + "FROM ebook_reader_progress erp", + "erp.progress >= 0.9", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = erp.content_id", + "erp.updated_at <= hhi.hidden_before", + }, + unexpectSQL: []string{"FROM user_watch_progress uwp", "FROM user_watch_history uwh"}, + }, + { + name: "in progress", + rule: QueryRule{Field: "in_progress", Op: "is", Value: true}, + expectSQL: []string{ + "FROM ebook_reader_progress erp", + "erp.progress > 0", + "erp.progress < 0.9", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = erp.content_id", + "erp.updated_at <= hhi.hidden_before", + }, + unexpectSQL: []string{"FROM user_watch_progress uwp"}, + }, + { + name: "not in progress", + rule: QueryRule{Field: "in_progress", Op: "is", Value: false}, + expectSQL: []string{ + "NOT (EXISTS", + "FROM ebook_reader_progress erp", + "erp.progress > 0", + "erp.progress < 0.9", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = erp.content_id", + "erp.updated_at <= hhi.hidden_before", + }, + unexpectSQL: []string{"FROM user_watch_progress uwp"}, + }, + } + + for _, tt := range tests { + clause, args, err := NewQueryBuilder("mi"). + WithMediaScope("ebook"). + WithUserScope(42, "profile-1"). + Build(QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []QueryGroup{{ + Match: "all", + Rules: []QueryRule{tt.rule}, + }}, + }) + if err != nil { + t.Fatalf("%s: Build returned error: %v", tt.name, err) + } + if len(args) != 2 || args[0] != 42 || args[1] != "profile-1" { + t.Fatalf("%s: expected user scope args, got %v", tt.name, args) + } + for _, fragment := range tt.expectSQL { + if !strings.Contains(clause, fragment) { + t.Fatalf("%s: expected clause to contain %q, got %q", tt.name, fragment, clause) + } + } + for _, fragment := range tt.unexpectSQL { + if strings.Contains(clause, fragment) { + t.Fatalf("%s: did not expect clause to contain %q, got %q", tt.name, fragment, clause) + } + } + } +} + func TestBuild_ResolutionNormalizes4KAndScopesMediaFiles(t *testing.T) { clause, args, err := NewQueryBuilder("mi"). WithLibraryScope([]int{3}). @@ -531,6 +686,26 @@ func TestBuild_SeriesClauseJoinsAudiobookSeries(t *testing.T) { } } +func TestBuild_SeriesClauseJoinsEbookSeriesForEbookScope(t *testing.T) { + clause, args, err := NewQueryBuilder("mi"). + WithMediaScope("ebook"). + Build(QueryDefinition{ + Match: "all", + Groups: []QueryGroup{ + {Match: "all", Rules: []QueryRule{{Field: "series", Op: "is", Value: "Wayfarers"}}}, + }, + }) + if err != nil { + t.Fatalf("Build returned error: %v", err) + } + if len(args) != 1 || args[0] != "Wayfarers" { + t.Fatalf("expected series arg, got %v", args) + } + if !strings.Contains(clause, "FROM ebook_series s") { + t.Fatalf("expected ebook_series join in series clause, got %q", clause) + } +} + func TestBuildSortPlan_AuthorJoinsLateralOnPersonKindAuthor(t *testing.T) { plan, err := NewQueryBuilder("mi").BuildSortPlan(QuerySort{Field: "author", Order: "asc"}) if err != nil { @@ -576,6 +751,18 @@ func TestBuildSortPlan_SeriesOrdersByNameThenIndex(t *testing.T) { } } +func TestBuildSortPlan_SeriesUsesEbookSeriesForEbookScope(t *testing.T) { + plan, err := NewQueryBuilder("mi"). + WithMediaScope("ebook"). + BuildSortPlan(QuerySort{Field: "series", Order: "asc"}) + if err != nil { + t.Fatalf("BuildSortPlan(series) returned error: %v", err) + } + if len(plan.Joins) != 1 || !strings.Contains(plan.Joins[0], "ebook_series sort_series") { + t.Fatalf("expected LEFT JOIN ebook_series, got %v", plan.Joins) + } +} + func TestBuild_SeriesClauseNegationWrapsInNOT(t *testing.T) { clause, _, err := NewQueryBuilder("mi").Build(QueryDefinition{ Match: "all", @@ -713,3 +900,18 @@ func TestQueryBuilder_LastWatched_RequiresCTE(t *testing.T) { t.Fatalf("after lastWatchedExpr, builder should require CTE") } } + +func TestUserHistoryCTESQLIncludesCompletedEbookReaderProgress(t *testing.T) { + sql := UserHistoryCTESQL(1) + expectedFragments := []string{ + "FROM ebook_reader_progress erp", + "erp.progress >= 0.9", + "erp.content_id", + "erp.updated_at", + } + for _, fragment := range expectedFragments { + if !strings.Contains(sql, fragment) { + t.Fatalf("expected CTE to contain %q, got:\n%s", fragment, sql) + } + } +} diff --git a/internal/catalog/query_definition.go b/internal/catalog/query_definition.go index ccd859c6..a3076c45 100644 --- a/internal/catalog/query_definition.go +++ b/internal/catalog/query_definition.go @@ -113,7 +113,7 @@ const MediaScopeVideo = "video" // is an accepted media_scope value. Empty means unscoped and is valid. func IsValidMediaScope(scope string) bool { switch scope { - case "", "movie", "series", "episode", "audiobook", MediaScopeVideo: + case "", "movie", "series", "episode", "audiobook", "ebook", MediaScopeVideo: return true default: return false @@ -230,7 +230,7 @@ func (q QueryDefinition) ValidateWithOptions(allowPersonalizedSorts, allowPerson } if !IsValidMediaScope(normalized.MediaScope) { - return fmt.Errorf("media_scope must be 'movie', 'series', 'episode', 'audiobook', or 'video'") + return fmt.Errorf("media_scope must be 'movie', 'series', 'episode', 'audiobook', 'ebook', or 'video'") } if normalized.Match != "all" && normalized.Match != "any" { @@ -249,6 +249,9 @@ func (q QueryDefinition) ValidateWithOptions(allowPersonalizedSorts, allowPerson if def.personalized && !allowPersonalizedFields { return fmt.Errorf("groups[%d].rules[%d].field %q requires profile scope", i, j, rule.Field) } + if normalized.MediaScope == "ebook" && rule.Field == "narrator" { + return fmt.Errorf("groups[%d].rules[%d].field %q is not supported for ebook media_scope", i, j, rule.Field) + } if !def.validOps[rule.Op] { return fmt.Errorf("groups[%d].rules[%d].op %q is not supported for field %q", i, j, rule.Op, rule.Field) } @@ -263,6 +266,9 @@ func (q QueryDefinition) ValidateWithOptions(allowPersonalizedSorts, allowPerson if def.personalized && !allowPersonalizedSorts { return fmt.Errorf("sort.field %q requires profile scope", normalized.Sort.Field) } + if normalized.MediaScope == "ebook" && normalized.Sort.Field == "narrator" { + return fmt.Errorf("sort.field %q is not supported for ebook media_scope", normalized.Sort.Field) + } } if normalized.Sort.Order != "" && normalized.Sort.Order != "asc" && normalized.Sort.Order != "desc" { return fmt.Errorf("sort.order must be 'asc' or 'desc'") diff --git a/internal/catalog/query_definition_test.go b/internal/catalog/query_definition_test.go index 91629e40..b95762e1 100644 --- a/internal/catalog/query_definition_test.go +++ b/internal/catalog/query_definition_test.go @@ -72,6 +72,45 @@ func TestValidate_AudiobookMediaScope(t *testing.T) { } } +func TestValidate_EbookMediaScope(t *testing.T) { + qd := QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []QueryGroup{}, + Sort: QuerySort{Field: "title", Order: "asc"}, + } + if err := qd.Validate(); err != nil { + t.Fatalf("expected ebook media scope to be valid, got %v", err) + } +} + +func TestValidate_EbookMediaScopeRejectsNarratorRule(t *testing.T) { + qd := QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []QueryGroup{{ + Match: "all", + Rules: []QueryRule{{Field: "narrator", Op: "is", Value: "Narrator"}}, + }}, + Sort: QuerySort{Field: "title", Order: "asc"}, + } + if err := qd.Validate(); err == nil { + t.Fatal("expected ebook narrator rule to be rejected") + } +} + +func TestValidate_EbookMediaScopeRejectsNarratorSort(t *testing.T) { + qd := QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []QueryGroup{}, + Sort: QuerySort{Field: "narrator", Order: "asc"}, + } + if err := qd.Validate(); err == nil { + t.Fatal("expected ebook narrator sort to be rejected") + } +} + func TestValidateWithSortScope_RejectsPersonalizedSortWithoutProfileScope(t *testing.T) { qd := QueryDefinition{ Match: "all", diff --git a/internal/ebooks/enrichment.go b/internal/ebooks/enrichment.go new file mode 100644 index 00000000..fe1b8124 --- /dev/null +++ b/internal/ebooks/enrichment.go @@ -0,0 +1,765 @@ +package ebooks + +// Enricher periodically enriches ebook media_items that are missing metadata +// by querying the configured metadata-provider chain for each item's library +// folder. + +import ( + "context" + "errors" + "fmt" + "log/slog" + "os" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/jackc/pgx/v5/pgxpool" + + "github.com/Silo-Server/silo-server/internal/catalog" + "github.com/Silo-Server/silo-server/internal/metadata" + "github.com/Silo-Server/silo-server/internal/models" +) + +const ( + ebookMetadataImageProviderID = "ebook-metadata" + + defaultEnrichBatchSize = 50 + defaultEnrichWorkers = 4 + + // enrichFailureCap is the ebook_enrichment_state.failures count at which + // an ebook stops being claimed for enrichment. Combined with the + // failure-count-first claim ordering this prevents a head-of-line block + // of permanently failing items from starving newer items and hammering + // providers. + enrichFailureCap = 5 +) + +// errEnrichmentSkipped marks an item that could not be attempted at all (no +// library folder linked yet, no providers configured). Skipped items are +// neither stamped as refreshed nor counted against the failure cap, so they +// are retried on every sweep until the missing prerequisite appears. +var errEnrichmentSkipped = errors.New("ebook enrichment skipped") + +func ebookContentType() string { + return "ebook" +} + +func ebookEnrichWorkers() int { + n := defaultEnrichWorkers + if v := os.Getenv("SILO_EBOOK_ENRICH_WORKERS"); v != "" { + if parsed, err := strconv.Atoi(v); err == nil && parsed > 0 { + n = parsed + } + } + if n > defaultEnrichBatchSize { + n = defaultEnrichBatchSize + } + return n +} + +type enrichmentItemRow struct { + ContentID string + Title string + Year int + FolderID int + Language string + Author string + ProviderIDs map[string]string +} + +// Enricher drives the ebook metadata enrichment sweep. +type Enricher struct { + pool *pgxpool.Pool + chainRepo *metadata.ChainRepository + resolver *metadata.PluginResolverAdapter + itemRepo *catalog.ItemRepository + personRepo *catalog.PersonRepository + providerIDs *catalog.ProviderIDRepository + imageCacher metadata.ImageCacher + batchSize int + workers int +} + +func NewEnricher( + pool *pgxpool.Pool, + chainRepo *metadata.ChainRepository, + resolver *metadata.PluginResolverAdapter, + itemRepo *catalog.ItemRepository, + personRepo *catalog.PersonRepository, + providerIDs *catalog.ProviderIDRepository, +) *Enricher { + return &Enricher{ + pool: pool, + chainRepo: chainRepo, + resolver: resolver, + itemRepo: itemRepo, + personRepo: personRepo, + providerIDs: providerIDs, + batchSize: defaultEnrichBatchSize, + workers: ebookEnrichWorkers(), + } +} + +func (e *Enricher) SetImageCacher(cacher metadata.ImageCacher) { + if e == nil { + return + } + e.imageCacher = cacher +} + +func (e *Enricher) Run(ctx context.Context) (int, error) { + if e == nil || e.pool == nil || e.chainRepo == nil { + return 0, nil + } + + items, err := e.claimBatch(ctx) + if err != nil { + return 0, fmt.Errorf("ebook enrichment: claim batch: %w", err) + } + if len(items) == 0 { + return 0, nil + } + + slog.Info("ebook enrichment: sweep started", + "count", len(items), + "workers", e.workers, + ) + + enriched := e.runBatch(ctx, items, e.enrichItem, e.recordEnrichFailure) + + slog.Info("ebook enrichment: sweep complete", + "attempted", len(items), + "enriched", enriched, + ) + return enriched, nil +} + +func (e *Enricher) runBatch( + ctx context.Context, + items []enrichmentItemRow, + enrichFn func(context.Context, enrichmentItemRow) error, + recordFailure func(context.Context, enrichmentItemRow), +) int { + workers := e.workers + if workers <= 0 { + workers = 1 + } + if workers > len(items) { + workers = len(items) + } + + ch := make(chan enrichmentItemRow, workers) + var ( + wg sync.WaitGroup + enriched int64 + ) + for i := 0; i < workers; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for item := range ch { + if ctx.Err() != nil { + continue + } + if err := enrichFn(ctx, item); err != nil { + if errors.Is(err, errEnrichmentSkipped) { + slog.Debug("ebook enrichment: item skipped", + "content_id", item.ContentID, + "title", item.Title, + "reason", err, + ) + continue + } + slog.Warn("ebook enrichment: item failed", + "content_id", item.ContentID, + "title", item.Title, + "error", err, + ) + // A cancelled sweep says nothing about the item itself, + // so it does not count against the failure cap. + if recordFailure != nil && !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) { + recordFailure(ctx, item) + } + continue + } + atomic.AddInt64(&enriched, 1) + } + }() + } + for _, item := range items { + if ctx.Err() != nil { + break + } + ch <- item + } + close(ch) + wg.Wait() + return int(enriched) +} + +// claimBatchQuery selects unenriched ebooks. Items with fewer prior failures +// are claimed first and items at/above enrichFailureCap are skipped entirely, +// so a block of permanently failing items cannot occupy every sweep. +const claimBatchQuery = ` + SELECT + mi.content_id, + mi.title, + mi.year, + COALESCE(mil.media_folder_id, 0) AS folder_id, + COALESCE(mf.metadata_language, 'en') AS language, + COALESCE( + (SELECT p.name + FROM item_people ip + JOIN people p ON p.id = ip.person_id + WHERE ip.content_id = mi.content_id + AND ip.kind = 7 + ORDER BY ip.sort_order, ip.id + LIMIT 1), + '' + ) AS author + FROM media_items mi + LEFT JOIN media_item_libraries mil ON mil.content_id = mi.content_id + LEFT JOIN media_folders mf ON mf.id = mil.media_folder_id + LEFT JOIN ebook_enrichment_state ees ON ees.content_id = mi.content_id + WHERE mi.type = 'ebook' + AND (mi.poster_path IS NULL OR mi.poster_path = '') + AND mi.last_refreshed IS NULL + AND COALESCE(ees.failures, 0) < $2 + ORDER BY COALESCE(ees.failures, 0) ASC, mi.created_at ASC + LIMIT $1 +` + +func (e *Enricher) claimBatch(ctx context.Context) ([]enrichmentItemRow, error) { + rows, err := e.pool.Query(ctx, claimBatchQuery, e.batchSize, enrichFailureCap) + if err != nil { + return nil, fmt.Errorf("querying unenriched ebooks: %w", err) + } + defer rows.Close() + + var items []enrichmentItemRow + seen := make(map[string]struct{}) + for rows.Next() { + var item enrichmentItemRow + if err := rows.Scan( + &item.ContentID, + &item.Title, + &item.Year, + &item.FolderID, + &item.Language, + &item.Author, + ); err != nil { + return nil, fmt.Errorf("scanning ebook enrichment row: %w", err) + } + if _, dup := seen[item.ContentID]; dup { + continue + } + seen[item.ContentID] = struct{}{} + items = append(items, item) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterating ebook enrichment rows: %w", err) + } + + if e.providerIDs != nil { + for i := range items { + pids, err := e.providerIDs.GetByContentID(ctx, items[i].ContentID) + if err == nil { + items[i].ProviderIDs = providerIDMapFromRows(pids) + } + } + } + + return items, nil +} + +func (e *Enricher) enrichItem(ctx context.Context, item enrichmentItemRow) error { + if item.FolderID == 0 { + // The scanner inserts the library membership after the item upsert, so + // a freshly indexed ebook can be claimed inside that window. Skip it: + // stamping here would terminally mark the item refreshed before any + // provider ever saw it. + return fmt.Errorf("%w: item %s has no library folder yet", errEnrichmentSkipped, item.ContentID) + } + + providers, err := metadata.ResolveChain(ctx, item.FolderID, ebookContentType(), e.chainRepo, e.resolver) + if err != nil { + return fmt.Errorf("resolving ebook chain for folder %d: %w", item.FolderID, err) + } + return e.enrichWithProviders(ctx, item, providers) +} + +// enrichWithProviders runs the provider chain for one claimed item. Outcomes: +// - metadata obtained: persist it and stamp last_refreshed (nil error); +// - providers answered but nothing matched: stamp last_refreshed so the +// item is not re-claimed every sweep (nil error); +// - one or more providers errored and no metadata was obtained: return an +// error so the failure cap/backoff engages, without stamping; +// - no providers configured: skip (no stamp, no failure) so the item is +// retried once a chain exists. +func (e *Enricher) enrichWithProviders(ctx context.Context, item enrichmentItemRow, providers []metadata.Provider) error { + if len(providers) == 0 { + return fmt.Errorf("%w: no metadata providers configured for folder %d", errEnrichmentSkipped, item.FolderID) + } + + accumulator, accumulatedIDs, providerErrs := collectEbookMetadata(ctx, item, providers) + + if !accumulator.HasMetadata && accumulator.PosterPath == "" && accumulator.Overview == "" { + if err := ctx.Err(); err != nil { + // A cancelled sweep says nothing about the item or the providers. + return err + } + if len(providerErrs) > 0 { + // Transient provider trouble must not stamp the item terminally; + // surfacing an error engages the failure cap and backoff instead. + return fmt.Errorf("no metadata obtained, %d provider error(s): %w", + len(providerErrs), errors.Join(providerErrs...)) + } + slog.Info("ebook enrichment: no metadata found", + "content_id", item.ContentID, + "title", item.Title, + ) + return e.stampLastRefreshed(ctx, item.ContentID) + } + + e.cacheRemotePoster(ctx, item.ContentID, accumulator) + + if err := e.persist(ctx, item.ContentID, accumulatedIDs, accumulator); err != nil { + return fmt.Errorf("persisting enrichment for %s: %w", item.ContentID, err) + } + + slog.Info("ebook enrichment: enriched", + "content_id", item.ContentID, + "title", item.Title, + "poster", accumulator.PosterPath != "", + "overview", accumulator.Overview != "", + "people", len(filterEbookPeople(accumulator.People)), + ) + + return nil +} + +// collectEbookMetadata queries every provider in the chain and accumulates +// IDs and metadata. Individual provider failures are collected (not fatal) so +// the caller can distinguish "providers answered, no match" from "providers +// were unreachable". +func collectEbookMetadata(ctx context.Context, item enrichmentItemRow, providers []metadata.Provider) (*metadata.MetadataResult, map[string]string, []error) { + searchQuery, accumulatedIDs := buildEbookSearchQuery(item) + var providerErrs []error + + for _, p := range providers { + sp, ok := p.(metadata.SearchProvider) + if !ok { + continue + } + results, searchErr := sp.Search(ctx, searchQuery) + if searchErr != nil { + slog.Warn("ebook enrichment: search error", + "provider", p.Slug(), + "content_id", item.ContentID, + "error", searchErr, + ) + providerErrs = append(providerErrs, fmt.Errorf("%s search: %w", p.Slug(), searchErr)) + continue + } + if len(results) == 0 { + continue + } + for k, v := range results[0].ProviderIDs { + if v != "" { + if _, exists := accumulatedIDs[k]; !exists { + accumulatedIDs[k] = v + } + } + } + slog.Debug("ebook enrichment: search result", + "provider", p.Slug(), + "content_id", item.ContentID, + "matched_ids", accumulatedIDs, + ) + } + + accumulator := &metadata.MetadataResult{ + ProviderIDs: accumulatedIDs, + } + + for _, p := range providers { + mp, ok := p.(metadata.MetadataProvider) + if !ok { + continue + } + result, getErr := mp.GetMetadata(ctx, buildEbookMetadataRequest(accumulator.ProviderIDs, item.Language)) + if getErr != nil { + slog.Warn("ebook enrichment: GetMetadata error", + "provider", p.Slug(), + "content_id", item.ContentID, + "error", getErr, + ) + providerErrs = append(providerErrs, fmt.Errorf("%s metadata: %w", p.Slug(), getErr)) + continue + } + if result == nil || !result.HasMetadata { + continue + } + mergeEnrichmentProviderIDs(accumulator, result) + metadata.MergeMetadata(result, accumulator, nil, metadata.MergeFillEmpty) + + slog.Debug("ebook enrichment: metadata received", + "provider", p.Slug(), + "content_id", item.ContentID, + "has_poster", result.PosterPath != "", + "has_overview", result.Overview != "", + ) + } + + return accumulator, accumulator.ProviderIDs, providerErrs +} + +func (e *Enricher) cacheRemotePoster(ctx context.Context, contentID string, result *metadata.MetadataResult) { + if e == nil || result == nil || result.PosterPath == "" { + return + } + if !strings.HasPrefix(result.PosterPath, "http://") && !strings.HasPrefix(result.PosterPath, "https://") { + return + } + if isNilImageCacher(e.imageCacher) { + return + } + + cached, err := e.imageCacher.CacheImage(ctx, metadata.CacheImageRequest{ + SourceURL: result.PosterPath, + ProviderID: ebookMetadataImageProviderID, + ContentType: "ebooks", + ContentID: contentID, + ImageType: metadata.ImagePoster, + }) + if err != nil { + slog.Warn("ebook enrichment: poster cache failed, keeping provider URL", + "content_id", contentID, + "url", result.PosterPath, + "error", err, + ) + return + } + if cached == nil { + slog.Warn("ebook enrichment: poster cache returned no result, keeping provider URL", + "content_id", contentID, + "url", result.PosterPath, + ) + return + } + + if storedPath := cachedOriginalImagePath(cached.BasePath, cached.Ext); storedPath != "" { + result.PosterPath = storedPath + } + if cached.Thumbhash != "" { + result.PosterThumbhash = cached.Thumbhash + } +} + +func isNilImageCacher(cacher metadata.ImageCacher) bool { + if cacher == nil { + return true + } + value := reflect.ValueOf(cacher) + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return value.IsNil() + default: + return false + } +} + +func cachedOriginalImagePath(basePath, ext string) string { + if basePath == "" { + return "" + } + if strings.Contains(basePath, "/original.") { + return basePath + } + if ext == "" { + ext = ".jpg" + } + return strings.TrimRight(basePath, "/") + "/original" + ext +} + +func (e *Enricher) persist(ctx context.Context, contentID string, providerIDs map[string]string, result *metadata.MetadataResult) error { + upd := &catalog.MetadataUpdate{} + + if result.PosterPath != "" { + upd.PosterPath = &result.PosterPath + } + if result.PosterThumbhash != "" { + upd.PosterThumbhash = &result.PosterThumbhash + } + if result.BackdropPath != "" { + upd.BackdropPath = &result.BackdropPath + } + if result.BackdropThumbhash != "" { + upd.BackdropThumbhash = &result.BackdropThumbhash + } + if result.LogoPath != "" { + upd.LogoPath = &result.LogoPath + } + if result.Overview != "" { + upd.Overview = &result.Overview + } + if result.Tagline != "" { + upd.Tagline = &result.Tagline + } + if result.ReleaseDate != "" { + upd.ReleaseDate = &result.ReleaseDate + } + if len(result.Genres) > 0 { + genres := append([]string(nil), result.Genres...) + upd.Genres = &genres + } + if len(result.Studios) > 0 { + studios := append([]string(nil), result.Studios...) + upd.Studios = &studios + } + if result.ContentRating != "" { + upd.ContentRating = &result.ContentRating + } + if result.Runtime > 0 { + upd.Runtime = &result.Runtime + } + if result.Year > 0 { + upd.Year = &result.Year + } + + providerIDs = filterEbookProviderIDs(providerIDs) + if e.providerIDs != nil && len(providerIDs) > 0 { + if err := e.providerIDs.ReplaceByContentID(ctx, contentID, providerIDs); err != nil { + slog.Warn("ebook enrichment: failed to persist provider IDs", + "content_id", contentID, + "error", err, + ) + } + } + + if err := e.updateMetadataAndTimestamps(ctx, contentID, upd); err != nil { + return err + } + + authors := filterEbookPeople(result.People) + if len(authors) > 0 && e.personRepo != nil && e.itemRepo != nil { + if err := e.persistPeople(ctx, contentID, authors); err != nil { + slog.Warn("ebook enrichment: failed to persist people", + "content_id", contentID, + "error", err, + ) + } + } + + return nil +} + +func (e *Enricher) updateMetadataAndTimestamps(ctx context.Context, contentID string, upd *catalog.MetadataUpdate) error { + if e.itemRepo == nil { + return nil + } + if err := e.itemRepo.UpdateMetadata(ctx, contentID, upd); err != nil { + return fmt.Errorf("UpdateMetadata: %w", err) + } + return e.stampLastRefreshed(ctx, contentID) +} + +func (e *Enricher) stampLastRefreshed(ctx context.Context, contentID string) error { + if e.pool == nil { + return nil + } + now := time.Now().UTC() + if _, err := e.pool.Exec(ctx, ` + UPDATE media_items + SET last_refreshed = $1, + matched_at = COALESCE(matched_at, $1), + status = CASE WHEN status = 'pending' THEN 'matched' ELSE status END + WHERE content_id = $2 + `, now, contentID); err != nil { + return err + } + // Success clears the enrichment failure backlog. media_items.refresh_failures + // is intentionally left alone: it belongs to the metadata refresh-debt system. + _, err := e.pool.Exec(ctx, ` + DELETE FROM ebook_enrichment_state WHERE content_id = $1 + `, contentID) + return err +} + +// recordEnrichFailure increments the item's ebook_enrichment_state failure +// counter so claimBatch deprioritizes it on the next sweep and stops claiming +// it at enrichFailureCap. The state is dedicated to ebook enrichment; +// media_items.refresh_failures is owned by the metadata refresh-debt system +// and is never touched here. +func (e *Enricher) recordEnrichFailure(ctx context.Context, item enrichmentItemRow) { + if e == nil || e.pool == nil { + return + } + if _, err := e.pool.Exec(ctx, ` + INSERT INTO ebook_enrichment_state (content_id, failures, updated_at) + VALUES ($1, 1, NOW()) + ON CONFLICT (content_id) DO UPDATE SET + failures = ebook_enrichment_state.failures + 1, + updated_at = NOW() + `, item.ContentID); err != nil { + slog.Warn("ebook enrichment: failed to record enrichment failure", + "content_id", item.ContentID, + "error", err, + ) + } +} + +func (e *Enricher) persistPeople(ctx context.Context, contentID string, people []models.ItemPerson) error { + people = filterEbookPeople(people) + if len(people) == 0 { + return nil + } + + persons := make([]models.Person, len(people)) + for i := range people { + persons[i] = people[i].Person + } + + personIDs, err := e.personRepo.BatchFindOrCreate(ctx, persons) + if err != nil { + return fmt.Errorf("BatchFindOrCreate people: %w", err) + } + + linked := make([]models.ItemPerson, 0, len(people)) + for i := range people { + if i >= len(personIDs) || personIDs[i] == 0 { + continue + } + ip := people[i] + ip.Person.ID = personIDs[i] + linked = append(linked, ip) + } + + if len(linked) == 0 { + return nil + } + + existing, err := e.itemRepo.GetPeople(ctx, contentID) + if err != nil { + return fmt.Errorf("get existing people: %w", err) + } + return e.itemRepo.ReplacePeople(ctx, contentID, mergeEbookAuthorCredits(existing, linked)) +} + +// mergeEbookAuthorCredits mirrors the scanner's mergeEbookPeople semantics: +// the provider authors replace existing author (and stale narrator) credits, +// while every other curated people kind on the item is preserved. +func mergeEbookAuthorCredits(existing []models.ItemPerson, authors []models.ItemPerson) []models.ItemPerson { + merged := make([]models.ItemPerson, 0, len(existing)+len(authors)) + for _, p := range existing { + if p.Kind == models.PersonKindAuthor || p.Kind == models.PersonKindNarrator { + continue + } + p.SortOrder = len(merged) + merged = append(merged, p) + } + for _, a := range authors { + a.SortOrder = len(merged) + merged = append(merged, a) + } + return merged +} + +func filterEbookPeople(people []models.ItemPerson) []models.ItemPerson { + authors := make([]models.ItemPerson, 0, len(people)) + for _, person := range people { + if person.Kind != models.PersonKindAuthor { + continue + } + person.SortOrder = len(authors) + authors = append(authors, person) + } + return authors +} + +func buildEbookSearchQuery(item enrichmentItemRow) (metadata.SearchQuery, map[string]string) { + accumulatedIDs := filterEbookProviderIDs(item.ProviderIDs) + if accumulatedIDs == nil { + accumulatedIDs = map[string]string{} + } + return metadata.SearchQuery{ + Title: item.Title, + Year: item.Year, + ContentType: ebookContentType(), + ProviderIDs: accumulatedIDs, + Language: item.Language, + }, accumulatedIDs +} + +func buildEbookMetadataRequest(providerIDs map[string]string, language string) metadata.MetadataRequest { + return metadata.MetadataRequest{ + ProviderIDs: filterEbookProviderIDs(providerIDs), + ContentType: ebookContentType(), + Language: language, + } +} + +func mergeEnrichmentProviderIDs(dst *metadata.MetadataResult, src *metadata.MetadataResult) { + if src == nil || len(src.ProviderIDs) == 0 { + return + } + if dst.ProviderIDs == nil { + dst.ProviderIDs = make(map[string]string, len(src.ProviderIDs)) + } + for k, v := range filterEbookProviderIDs(src.ProviderIDs) { + if v != "" { + if _, exists := dst.ProviderIDs[k]; !exists { + dst.ProviderIDs[k] = v + } + } + } +} + +func filterEbookProviderIDs(providerIDs map[string]string) map[string]string { + if len(providerIDs) == 0 { + return nil + } + filtered := make(map[string]string, len(providerIDs)) + for provider, providerID := range providerIDs { + provider = strings.TrimSpace(provider) + providerID = strings.TrimSpace(providerID) + if provider == "" || providerID == "" { + continue + } + provider = strings.ToLower(provider) + if isEbookASINProvider(provider) { + continue + } + filtered[provider] = providerID + } + if len(filtered) == 0 { + return nil + } + return filtered +} + +func isEbookASINProvider(provider string) bool { + normalized := strings.ReplaceAll(strings.ReplaceAll(provider, "_", ""), "-", "") + return normalized == "asin" || normalized == "audibleasin" +} + +func providerIDMapFromRows(rows []*models.MediaItemProviderID) map[string]string { + if len(rows) == 0 { + return nil + } + m := make(map[string]string, len(rows)) + for _, r := range rows { + if r != nil { + for provider, providerID := range filterEbookProviderIDs(map[string]string{ + r.Provider: r.ProviderID, + }) { + m[provider] = providerID + } + } + } + return m +} diff --git a/internal/ebooks/enrichment_test.go b/internal/ebooks/enrichment_test.go new file mode 100644 index 00000000..571ec23b --- /dev/null +++ b/internal/ebooks/enrichment_test.go @@ -0,0 +1,573 @@ +package ebooks + +import ( + "context" + "errors" + "fmt" + "sort" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/Silo-Server/silo-server/internal/metadata" + "github.com/Silo-Server/silo-server/internal/models" +) + +func TestEbookContentType(t *testing.T) { + if got := ebookContentType(); got != "ebook" { + t.Fatalf("ebookContentType() = %q, want ebook", got) + } +} + +func TestFilterEbookPeopleKeepsAuthorsOnly(t *testing.T) { + people := []models.ItemPerson{ + {Person: models.Person{Name: "Author One"}, Kind: models.PersonKindAuthor, SortOrder: 7}, + {Person: models.Person{Name: "Narrator One"}, Kind: models.PersonKindNarrator, SortOrder: 8}, + {Person: models.Person{Name: "Writer One"}, Kind: models.PersonKindWriter, SortOrder: 9}, + {Person: models.Person{Name: "Author Two"}, Kind: models.PersonKindAuthor, SortOrder: 10}, + } + + got := filterEbookPeople(people) + + if len(got) != 2 { + t.Fatalf("filtered people len = %d, want 2: %+v", len(got), got) + } + for i, p := range got { + if p.Kind != models.PersonKindAuthor { + t.Fatalf("filtered[%d].Kind = %v, want author", i, p.Kind) + } + if p.SortOrder != i { + t.Fatalf("filtered[%d].SortOrder = %d, want %d", i, p.SortOrder, i) + } + } + if got[0].Person.Name != "Author One" || got[1].Person.Name != "Author Two" { + t.Fatalf("filtered author order = %+v", got) + } +} + +func TestEbookEnrichWorkersFromEnv(t *testing.T) { + t.Setenv("SILO_EBOOK_ENRICH_WORKERS", "12") + if got := ebookEnrichWorkers(); got != 12 { + t.Fatalf("ebookEnrichWorkers() = %d, want 12", got) + } + + t.Setenv("SILO_EBOOK_ENRICH_WORKERS", "0") + if got := ebookEnrichWorkers(); got != defaultEnrichWorkers { + t.Fatalf("ebookEnrichWorkers() with zero = %d, want default %d", got, defaultEnrichWorkers) + } + + t.Setenv("SILO_EBOOK_ENRICH_WORKERS", "999") + if got := ebookEnrichWorkers(); got != defaultEnrichBatchSize { + t.Fatalf("ebookEnrichWorkers() capped = %d, want %d", got, defaultEnrichBatchSize) + } +} + +func TestEnricherRunFansOut(t *testing.T) { + const wantWorkers = 4 + const itemCount = 16 + + items := make([]enrichmentItemRow, itemCount) + for i := range items { + items[i] = enrichmentItemRow{ContentID: "test", Title: "t"} + } + + var inFlight int32 + var maxInFlight int32 + var signaled int32 + var wg sync.WaitGroup + wg.Add(wantWorkers) + gate := make(chan struct{}) + + enrich := func(ctx context.Context, item enrichmentItemRow) error { + cur := atomic.AddInt32(&inFlight, 1) + defer atomic.AddInt32(&inFlight, -1) + for { + prev := atomic.LoadInt32(&maxInFlight) + if cur <= prev || atomic.CompareAndSwapInt32(&maxInFlight, prev, cur) { + break + } + } + if atomic.AddInt32(&signaled, 1) <= wantWorkers { + wg.Done() + } + select { + case <-gate: + case <-time.After(2 * time.Second): + } + return nil + } + + go func() { + wg.Wait() + close(gate) + }() + + e := &Enricher{workers: wantWorkers, batchSize: itemCount} + e.runBatch(context.Background(), items, enrich, nil) + + if got := atomic.LoadInt32(&maxInFlight); got < wantWorkers { + t.Errorf("max in-flight = %d, want >= %d", got, wantWorkers) + } +} + +func TestRunBatchRecordsFailuresForFailedItemsOnly(t *testing.T) { + items := []enrichmentItemRow{ + {ContentID: "ok-1"}, + {ContentID: "bad-1"}, + {ContentID: "ok-2"}, + {ContentID: "bad-2"}, + } + + enrich := func(_ context.Context, item enrichmentItemRow) error { + if strings.HasPrefix(item.ContentID, "bad") { + return errors.New("provider exploded") + } + return nil + } + + var mu sync.Mutex + var recorded []string + record := func(_ context.Context, item enrichmentItemRow) { + mu.Lock() + defer mu.Unlock() + recorded = append(recorded, item.ContentID) + } + + e := &Enricher{workers: 2, batchSize: len(items)} + enriched := e.runBatch(context.Background(), items, enrich, record) + + if enriched != 2 { + t.Fatalf("enriched = %d, want 2", enriched) + } + sort.Strings(recorded) + if strings.Join(recorded, ",") != "bad-1,bad-2" { + t.Fatalf("recorded failures = %v, want exactly the failing items", recorded) + } +} + +func TestRunBatchSkipsFailureRecordingOnCancellation(t *testing.T) { + items := []enrichmentItemRow{{ContentID: "cancelled-1"}} + + enrich := func(context.Context, enrichmentItemRow) error { + return fmt.Errorf("search aborted: %w", context.Canceled) + } + + var recorded int32 + record := func(context.Context, enrichmentItemRow) { + atomic.AddInt32(&recorded, 1) + } + + e := &Enricher{workers: 1, batchSize: len(items)} + if enriched := e.runBatch(context.Background(), items, enrich, record); enriched != 0 { + t.Fatalf("enriched = %d, want 0", enriched) + } + if got := atomic.LoadInt32(&recorded); got != 0 { + t.Fatalf("failure recordings = %d, want 0: cancellation must not count against the cap", got) + } +} + +func TestClaimBatchQueryAppliesFailureBackoffAndCap(t *testing.T) { + // Pin the starvation guard: failing items are deprioritized, not retried + // at the head of every sweep, and capped items are never re-claimed. + if !strings.Contains(claimBatchQuery, "LEFT JOIN ebook_enrichment_state ees ON ees.content_id = mi.content_id") { + t.Fatalf("claimBatchQuery must read dedicated ebook enrichment failure state:\n%s", claimBatchQuery) + } + if !strings.Contains(claimBatchQuery, "COALESCE(ees.failures, 0) < $2") { + t.Fatalf("claimBatchQuery must exclude items at the failure cap:\n%s", claimBatchQuery) + } + if !strings.Contains(claimBatchQuery, "ORDER BY COALESCE(ees.failures, 0) ASC, mi.created_at ASC") { + t.Fatalf("claimBatchQuery must claim least-failed items first:\n%s", claimBatchQuery) + } + if strings.Contains(claimBatchQuery, "refresh_failures") { + t.Fatalf("claimBatchQuery must not read media_items.refresh_failures (owned by the metadata refresh-debt system):\n%s", claimBatchQuery) + } + if enrichFailureCap < 1 { + t.Fatalf("enrichFailureCap = %d, want >= 1", enrichFailureCap) + } +} + +func TestEnrichItemSkipsItemWithoutLibraryFolder(t *testing.T) { + // Membership rows are inserted after the item upsert, so a scan-window + // race can claim an item before its folder link exists. The item must be + // skipped (retried next sweep), never stamped or counted as a failure. + e := &Enricher{} + err := e.enrichItem(context.Background(), enrichmentItemRow{ContentID: "no-folder", Title: "t"}) + if !errors.Is(err, errEnrichmentSkipped) { + t.Fatalf("enrichItem error = %v, want errEnrichmentSkipped", err) + } +} + +func TestEnrichWithProvidersSkipsWhenNoProvidersConfigured(t *testing.T) { + e := &Enricher{} + err := e.enrichWithProviders(context.Background(), enrichmentItemRow{ContentID: "c1", FolderID: 7}, nil) + if !errors.Is(err, errEnrichmentSkipped) { + t.Fatalf("enrichWithProviders error = %v, want errEnrichmentSkipped", err) + } +} + +func TestEnrichWithProvidersReturnsFailureWhenAllProvidersError(t *testing.T) { + providerErr := errors.New("provider exploded") + providers := []metadata.Provider{ + &fakeEbookMetadataProvider{slug: "p1", searchErr: providerErr, getErr: providerErr}, + &fakeEbookMetadataProvider{slug: "p2", searchErr: providerErr, getErr: providerErr}, + } + + e := &Enricher{} + err := e.enrichWithProviders(context.Background(), enrichmentItemRow{ContentID: "c1", FolderID: 7, Title: "t"}, providers) + if err == nil { + t.Fatal("enrichWithProviders = nil, want error so the failure cap engages instead of stamping") + } + if errors.Is(err, errEnrichmentSkipped) { + t.Fatalf("enrichWithProviders error = %v, want a recordable failure, not a skip", err) + } + if !errors.Is(err, providerErr) { + t.Fatalf("enrichWithProviders error = %v, want wrapped provider error", err) + } +} + +func TestEnrichWithProvidersStampsWhenProvidersAnswerWithNoMatch(t *testing.T) { + // Providers reachable, genuinely nothing found: nil means the no-match + // path ran and the item was stamped so it is not re-claimed every sweep. + providers := []metadata.Provider{ + &fakeEbookMetadataProvider{slug: "p1"}, + } + + e := &Enricher{} + err := e.enrichWithProviders(context.Background(), enrichmentItemRow{ContentID: "c1", FolderID: 7, Title: "t"}, providers) + if err != nil { + t.Fatalf("enrichWithProviders = %v, want nil for a genuine no-match", err) + } +} + +func TestEnrichWithProvidersReturnsContextErrorOverProviderFailure(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + providers := []metadata.Provider{ + &fakeEbookMetadataProvider{slug: "p1", searchErr: ctx.Err(), getErr: ctx.Err()}, + } + + e := &Enricher{} + err := e.enrichWithProviders(ctx, enrichmentItemRow{ContentID: "c1", FolderID: 7}, providers) + if !errors.Is(err, context.Canceled) { + t.Fatalf("enrichWithProviders error = %v, want context.Canceled so cancellation never counts against the cap", err) + } +} + +func TestCollectEbookMetadataAccumulatesProviderErrors(t *testing.T) { + searchErr := errors.New("search down") + getErr := errors.New("metadata down") + providers := []metadata.Provider{ + &fakeEbookMetadataProvider{slug: "broken", searchErr: searchErr, getErr: getErr}, + &fakeEbookMetadataProvider{ + slug: "working", + results: []metadata.SearchResult{{ProviderIDs: map[string]string{"openlibrary": "OL1M"}}}, + result: &metadata.MetadataResult{HasMetadata: true, Overview: "found"}, + }, + } + + accumulator, ids, errs := collectEbookMetadata(context.Background(), enrichmentItemRow{ContentID: "c1", Title: "t"}, providers) + + if len(errs) != 2 || !errors.Is(errs[0], searchErr) || !errors.Is(errs[1], getErr) { + t.Fatalf("provider errors = %v, want both broken-provider errors", errs) + } + if accumulator.Overview != "found" { + t.Fatalf("accumulator overview = %q, want metadata from the working provider", accumulator.Overview) + } + if ids["openlibrary"] != "OL1M" { + t.Fatalf("accumulated IDs = %v, want search-result openlibrary ID", ids) + } +} + +func TestRunBatchDoesNotRecordFailuresForSkippedItems(t *testing.T) { + items := []enrichmentItemRow{{ContentID: "skipped-1"}} + + enrich := func(context.Context, enrichmentItemRow) error { + return fmt.Errorf("%w: no providers", errEnrichmentSkipped) + } + + var recorded int32 + record := func(context.Context, enrichmentItemRow) { + atomic.AddInt32(&recorded, 1) + } + + e := &Enricher{workers: 1, batchSize: len(items)} + if enriched := e.runBatch(context.Background(), items, enrich, record); enriched != 0 { + t.Fatalf("enriched = %d, want 0", enriched) + } + if got := atomic.LoadInt32(&recorded); got != 0 { + t.Fatalf("failure recordings = %d, want 0: skips must not count against the cap", got) + } +} + +func TestMergeEbookAuthorCreditsPreservesOtherPeopleKinds(t *testing.T) { + existing := []models.ItemPerson{ + {Person: models.Person{ID: 10, Name: "Old Author"}, Kind: models.PersonKindAuthor, SortOrder: 0}, + {Person: models.Person{ID: 20, Name: "Manual Writer"}, Kind: models.PersonKindWriter, SortOrder: 1, Character: "essay"}, + {Person: models.Person{ID: 30, Name: "Stale Narrator"}, Kind: models.PersonKindNarrator, SortOrder: 2}, + } + authors := []models.ItemPerson{ + {Person: models.Person{ID: 40, Name: "Provider Author"}, Kind: models.PersonKindAuthor}, + } + + got := mergeEbookAuthorCredits(existing, authors) + + if len(got) != 2 { + t.Fatalf("merged people len = %d, want 2: %+v", len(got), got) + } + if got[0].Person.ID != 20 || got[0].Kind != models.PersonKindWriter || got[0].Character != "essay" || got[0].SortOrder != 0 { + t.Fatalf("preserved non-author credit = %+v", got[0]) + } + if got[1].Person.ID != 40 || got[1].Kind != models.PersonKindAuthor || got[1].SortOrder != 1 { + t.Fatalf("provider author credit = %+v", got[1]) + } +} + +func TestCacheRemotePosterCachesProviderURL(t *testing.T) { + cacher := &fakeEbookImageCacher{} + e := &Enricher{imageCacher: cacher} + result := &metadata.MetadataResult{ + PosterPath: "https://example.test/book.jpg", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if cacher.calls != 1 { + t.Fatalf("CacheImage calls = %d, want 1", cacher.calls) + } + if cacher.req.ProviderID != ebookMetadataImageProviderID { + t.Fatalf("ProviderID = %q, want %q", cacher.req.ProviderID, ebookMetadataImageProviderID) + } + if cacher.req.ContentType != "ebooks" || cacher.req.ContentID != "content-1" { + t.Fatalf("cache target = %q/%q", cacher.req.ContentType, cacher.req.ContentID) + } + if result.PosterPath != "ebook-metadata/ebooks/content-1/poster/original.webp" { + t.Fatalf("PosterPath = %q", result.PosterPath) + } + if result.PosterThumbhash != "thumb" { + t.Fatalf("PosterThumbhash = %q", result.PosterThumbhash) + } +} + +func TestCacheRemotePosterSkipsNilCacher(t *testing.T) { + e := &Enricher{} + result := &metadata.MetadataResult{ + PosterPath: "https://example.test/book.jpg", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if result.PosterPath != "https://example.test/book.jpg" { + t.Fatalf("PosterPath = %q, want provider URL preserved", result.PosterPath) + } +} + +func TestCacheRemotePosterSkipsTypedNilCacher(t *testing.T) { + var cacher *fakeEbookImageCacher + e := &Enricher{imageCacher: cacher} + result := &metadata.MetadataResult{ + PosterPath: "https://example.test/book.jpg", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if result.PosterPath != "https://example.test/book.jpg" { + t.Fatalf("PosterPath = %q, want provider URL preserved", result.PosterPath) + } +} + +func TestCacheRemotePosterSkipsAlreadyCachedPath(t *testing.T) { + cacher := &fakeEbookImageCacher{} + e := &Enricher{imageCacher: cacher} + result := &metadata.MetadataResult{ + PosterPath: "local/ebooks/content-1/poster/original.webp", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if cacher.calls != 0 { + t.Fatalf("CacheImage calls = %d, want 0", cacher.calls) + } + if result.PosterPath != "local/ebooks/content-1/poster/original.webp" { + t.Fatalf("PosterPath = %q", result.PosterPath) + } +} + +func TestCacheRemotePosterPreservesProviderURLOnCacheError(t *testing.T) { + cacher := &fakeEbookImageCacher{err: errors.New("cache failed")} + e := &Enricher{imageCacher: cacher} + result := &metadata.MetadataResult{ + PosterPath: "https://example.test/book.jpg", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if cacher.calls != 1 { + t.Fatalf("CacheImage calls = %d, want 1", cacher.calls) + } + if result.PosterPath != "https://example.test/book.jpg" { + t.Fatalf("PosterPath = %q, want provider URL preserved", result.PosterPath) + } +} + +func TestCacheRemotePosterPreservesProviderURLOnNilCacheResult(t *testing.T) { + cacher := &fakeEbookImageCacher{returnNil: true} + e := &Enricher{imageCacher: cacher} + result := &metadata.MetadataResult{ + PosterPath: "https://example.test/book.jpg", + } + + e.cacheRemotePoster(context.Background(), "content-1", result) + + if cacher.calls != 1 { + t.Fatalf("CacheImage calls = %d, want 1", cacher.calls) + } + if result.PosterPath != "https://example.test/book.jpg" { + t.Fatalf("PosterPath = %q, want provider URL preserved", result.PosterPath) + } +} + +func TestMergeEnrichmentProviderIDsKeepsExistingIDs(t *testing.T) { + dst := &metadata.MetadataResult{ProviderIDs: map[string]string{"isbn": "9780306406157"}} + src := &metadata.MetadataResult{ProviderIDs: map[string]string{"isbn": "new", "openlibrary": "OL1M", "empty": ""}} + + mergeEnrichmentProviderIDs(dst, src) + + if got := dst.ProviderIDs["isbn"]; got != "9780306406157" { + t.Fatalf("isbn = %q, want original", got) + } + if got := dst.ProviderIDs["openlibrary"]; got != "OL1M" { + t.Fatalf("openlibrary = %q, want OL1M", got) + } + if _, exists := dst.ProviderIDs["empty"]; exists { + t.Fatal("empty provider ID should not be merged") + } +} + +func TestMergeEnrichmentProviderIDsDropsAsinIDs(t *testing.T) { + dst := &metadata.MetadataResult{ProviderIDs: map[string]string{"isbn": "9780306406157"}} + src := &metadata.MetadataResult{ + ProviderIDs: map[string]string{ + "ASIN": "B00TEST", + "audible_asin": "B00AUDIO", + "openlibrary": "OL1M", + }, + } + + mergeEnrichmentProviderIDs(dst, src) + + if _, exists := dst.ProviderIDs["ASIN"]; exists { + t.Fatal("ASIN provider ID should not be merged for ebooks") + } + if _, exists := dst.ProviderIDs["audible_asin"]; exists { + t.Fatal("audible_asin provider ID should not be merged for ebooks") + } + if got := dst.ProviderIDs["openlibrary"]; got != "OL1M" { + t.Fatalf("openlibrary = %q, want OL1M", got) + } +} + +func TestBuildEbookSearchQueryUsesFilteredScannerISBN(t *testing.T) { + item := enrichmentItemRow{ + Title: "Tagged Ebook", + Year: 2024, + Language: "en", + ProviderIDs: map[string]string{ + " ISBN ": " 9780306406157 ", + "ASIN": "B00TEST", + "audible_asin": "B00AUDIO", + }, + } + + query, ids := buildEbookSearchQuery(item) + + if query.Title != "Tagged Ebook" || query.Year != 2024 || query.Language != "en" || query.ContentType != "ebook" { + t.Fatalf("query basics = %+v", query) + } + if got := query.ProviderIDs["isbn"]; got != "9780306406157" { + t.Fatalf("query isbn = %q, want scanner ISBN", got) + } + if _, exists := query.ProviderIDs["ASIN"]; exists { + t.Fatal("query should not include ASIN for ebooks") + } + if got := ids["isbn"]; got != "9780306406157" { + t.Fatalf("accumulated isbn = %q, want scanner ISBN", got) + } +} + +func TestFilterEbookProviderIDsDropsAsinAliases(t *testing.T) { + got := filterEbookProviderIDs(map[string]string{ + "ASIN": "B00TEST", + "audibleASIN": "B00AUDIO", + "audible-asin": "B00AUDIO2", + "audible_asin": "B00AUDIO3", + " ISBN ": " 9780306406157 ", + " OpenLibraryID": " OL1M ", + }) + + if got["asin"] != "" || got["audibleasin"] != "" || got["audible-asin"] != "" || got["audible_asin"] != "" { + t.Fatalf("ASIN aliases should be filtered, got %+v", got) + } + if got["isbn"] != "9780306406157" || got["openlibraryid"] != "OL1M" { + t.Fatalf("filtered IDs = %+v, want ISBN and OpenLibraryID only", got) + } +} + +func TestBuildEbookMetadataRequestCarriesAccumulatedISBN(t *testing.T) { + req := buildEbookMetadataRequest(map[string]string{ + " ISBN ": " 9780306406157 ", + "openlibrary": "OL1M", + }, "fr") + + if req.ContentType != "ebook" || req.Language != "fr" { + t.Fatalf("request basics = %+v", req) + } + if got := req.ProviderIDs["isbn"]; got != "9780306406157" { + t.Fatalf("request isbn = %q, want normalized key/value", got) + } + if got := req.ProviderIDs["openlibrary"]; got != "OL1M" { + t.Fatalf("request openlibrary = %q, want OL1M", got) + } +} + +type fakeEbookMetadataProvider struct { + slug string + searchErr error + results []metadata.SearchResult + getErr error + result *metadata.MetadataResult +} + +func (f *fakeEbookMetadataProvider) Slug() string { return f.slug } +func (f *fakeEbookMetadataProvider) Name() string { return f.slug } +func (f *fakeEbookMetadataProvider) ForTypes() []string { return []string{"ebook"} } +func (f *fakeEbookMetadataProvider) Search(context.Context, metadata.SearchQuery) ([]metadata.SearchResult, error) { + return f.results, f.searchErr +} +func (f *fakeEbookMetadataProvider) GetMetadata(context.Context, metadata.MetadataRequest) (*metadata.MetadataResult, error) { + return f.result, f.getErr +} + +type fakeEbookImageCacher struct { + calls int + req metadata.CacheImageRequest + err error + returnNil bool +} + +func (f *fakeEbookImageCacher) CacheImage(_ context.Context, req metadata.CacheImageRequest) (*metadata.CacheImageResult, error) { + f.calls++ + f.req = req + if f.err != nil { + return nil, f.err + } + if f.returnNil { + return nil, nil + } + return &metadata.CacheImageResult{ + BasePath: req.ProviderID + "/" + req.ContentType + "/" + req.ContentID + "/poster", + Thumbhash: "thumb", + Ext: ".webp", + }, nil +} diff --git a/internal/imagecache/imagecache.go b/internal/imagecache/imagecache.go index 79472ad2..f4eb3171 100644 --- a/internal/imagecache/imagecache.go +++ b/internal/imagecache/imagecache.go @@ -114,6 +114,22 @@ func (c *Cacher) CacheAudiobookCover(ctx context.Context, data []byte, contentID return res.BasePath, res.Ext, res.Thumbhash, nil } +// CacheEbookCover stores an embedded ebook cover under +// "local/ebooks/{contentID}/poster/..." using the same poster variants as +// provider-hosted book artwork. +func (c *Cacher) CacheEbookCover(ctx context.Context, data []byte, contentID string) (basePath string, ext string, thumbhash string, err error) { + res, err := c.CacheBytes(ctx, data, CacheRequest{ + ProviderID: "local", + ContentType: "ebooks", + ContentID: contentID, + ImageType: metadata.ImagePoster, + }) + if err != nil { + return "", "", "", err + } + return res.BasePath, res.Ext, res.Thumbhash, nil +} + // CacheBytes performs the same variant generation, thumbhash, and S3 upload as // Cache but starts from raw image bytes already in hand. Used by the // audiobook scanner to push embedded M4B cover art into S3 without round- diff --git a/internal/jellycompat/web.go b/internal/jellycompat/web.go index 694de6cb..4900a924 100644 --- a/internal/jellycompat/web.go +++ b/internal/jellycompat/web.go @@ -44,6 +44,10 @@ func newCompatWebHandler(webFS fs.FS, version string) http.Handler { if version != "" { w.Header().Set("X-Silo-Jellyfin-Web-Version", version) } + // Block content sniffing on everything we serve here. A CSP is + // intentionally NOT set: the vendored jellyfin-web bundle relies on + // inline scripts and would break under any meaningful policy. + w.Header().Set("X-Content-Type-Options", "nosniff") if fileExists(webFS, relPath) { if relPath == "index.html" { diff --git a/internal/metadata/provider_id_integrity.go b/internal/metadata/provider_id_integrity.go index 2850968d..1d45acb6 100644 --- a/internal/metadata/provider_id_integrity.go +++ b/internal/metadata/provider_id_integrity.go @@ -722,6 +722,19 @@ var mediaItemMergeSteps = []mediaItemMergeStep{ last_codec_video = CASE WHEN EXCLUDED.updated_at >= user_watch_progress.updated_at THEN EXCLUDED.last_codec_video ELSE user_watch_progress.last_codec_video END, last_edition_key = CASE WHEN EXCLUDED.updated_at >= user_watch_progress.updated_at THEN EXCLUDED.last_edition_key ELSE user_watch_progress.last_edition_key END`}, {"delete source progress", `DELETE FROM user_watch_progress WHERE media_item_id = $1`}, + {"merge ebook reader progress", ` + INSERT INTO ebook_reader_progress ( + user_id, profile_id, content_id, file_id, location, progress, updated_at + ) + SELECT user_id, profile_id, $2, file_id, location, progress, updated_at + FROM ebook_reader_progress + WHERE content_id = $1 + ON CONFLICT (user_id, profile_id, content_id) DO UPDATE + SET file_id = CASE WHEN EXCLUDED.updated_at >= ebook_reader_progress.updated_at THEN EXCLUDED.file_id ELSE ebook_reader_progress.file_id END, + location = CASE WHEN EXCLUDED.updated_at >= ebook_reader_progress.updated_at THEN EXCLUDED.location ELSE ebook_reader_progress.location END, + progress = CASE WHEN EXCLUDED.updated_at >= ebook_reader_progress.updated_at THEN EXCLUDED.progress ELSE ebook_reader_progress.progress END, + updated_at = GREATEST(ebook_reader_progress.updated_at, EXCLUDED.updated_at)`}, + {"delete source ebook reader progress", `DELETE FROM ebook_reader_progress WHERE content_id = $1`}, {"move history", `UPDATE user_watch_history SET media_item_id = $2 WHERE media_item_id = $1`}, {"merge hidden history", ` INSERT INTO user_history_hidden_items (user_id, profile_id, media_item_id, hidden_before, updated_at) diff --git a/internal/metadata/provider_id_integrity_test.go b/internal/metadata/provider_id_integrity_test.go index ef2ad10f..12441e8a 100644 --- a/internal/metadata/provider_id_integrity_test.go +++ b/internal/metadata/provider_id_integrity_test.go @@ -110,6 +110,25 @@ func TestMergeStepPlaceholdersAreBounded(t *testing.T) { } } +func TestMergeStepsPreserveEbookReaderProgress(t *testing.T) { + var hasMerge bool + var hasDelete bool + for _, step := range mediaItemMergeSteps { + if strings.Contains(step.sql, "ebook_reader_progress") && strings.Contains(step.sql, "INSERT INTO") { + hasMerge = true + } + if strings.Contains(step.sql, "ebook_reader_progress") && strings.Contains(step.sql, "DELETE FROM") { + hasDelete = true + } + } + if !hasMerge { + t.Fatal("media item merge steps should merge ebook_reader_progress rows") + } + if !hasDelete { + t.Fatal("media item merge steps should delete source ebook_reader_progress rows") + } +} + func TestBothCandidatesHaveContentDetectsRealUserData(t *testing.T) { withFiles := canonicalCandidate{ContentID: "a", ActiveFiles: 2} withLibraries := canonicalCandidate{ContentID: "b", LibraryCount: 1} diff --git a/internal/models/ebook_progress.go b/internal/models/ebook_progress.go new file mode 100644 index 00000000..0e249595 --- /dev/null +++ b/internal/models/ebook_progress.go @@ -0,0 +1,8 @@ +package models + +// EbookFinishedProgressThreshold is the reading-progress ratio (0..1) at or +// above which an ebook counts as finished/read. Progress strictly between 0 +// and this threshold counts as in progress. Shared by the reader API, +// catalog query builder, sections, and recommendation signals so the +// definition of "finished" cannot drift between subsystems. +const EbookFinishedProgressThreshold = 0.9 diff --git a/internal/recommendations/accuracy_test.go b/internal/recommendations/accuracy_test.go index 6d5c86b9..20a30f18 100644 --- a/internal/recommendations/accuracy_test.go +++ b/internal/recommendations/accuracy_test.go @@ -142,6 +142,32 @@ func TestApplyMediaTypeFloorNoopsWithoutSupplementalType(t *testing.T) { } } +func TestApplyMediaTypeFloorIncludesEbookSupplement(t *testing.T) { + items := []ScoredItem{ + {MediaItemID: "s1", Score: 1.00}, + {MediaItemID: "s2", Score: 0.99}, + {MediaItemID: "s3", Score: 0.98}, + {MediaItemID: "s4", Score: 0.97}, + {MediaItemID: "s5", Score: 0.96}, + } + candidates := append([]ScoredItem(nil), items...) + candidates = append(candidates, ScoredItem{MediaItemID: "e1", Score: 0.95}) + mediaTypes := map[string]string{ + "s1": "series", + "s2": "series", + "s3": "series", + "s4": "series", + "s5": "series", + "e1": "ebook", + } + + mixed := applyMediaTypeFloor(items, candidates, mediaTypes) + + if got := countMediaType(mixed, mediaTypes, "ebook"); got != 1 { + t.Fatalf("expected 1 ebook from supplemental candidates, got %d in %#v", got, mixed) + } +} + func TestApplyGenreCapDoesNotCollapseConcentratedRows(t *testing.T) { items := []ScoredItem{ {MediaItemID: "a", Score: 1.0}, diff --git a/internal/recommendations/embeddings/text.go b/internal/recommendations/embeddings/text.go index bd15e4a5..faa884dc 100644 --- a/internal/recommendations/embeddings/text.go +++ b/internal/recommendations/embeddings/text.go @@ -63,17 +63,20 @@ func BuildEmbeddingText(item *models.MediaItem) string { parts = append(parts, fmt.Sprintf(`"%s"`, item.Tagline)) } - if item.Type == "audiobook" { - // Audiobooks credit author (kind=7) and narrator (kind=8). Cast/ - // director/writer don't apply. Keep the SQL canonical_text builder - // in recommendations/repo.go in sync with this shape. + if item.Type == "audiobook" || item.Type == "ebook" { + // Books credit authors (kind=7). Audiobooks also credit narrators + // (kind=8); ebooks do not. Cast/director/writer don't apply. Keep + // the SQL canonical_text builder in recommendations/repo.go in sync + // with this shape. var authors, narrators []models.ItemPerson for _, p := range item.People { switch p.Kind { case models.PersonKindAuthor: authors = append(authors, p) case models.PersonKindNarrator: - narrators = append(narrators, p) + if item.Type == "audiobook" { + narrators = append(narrators, p) + } } } sortItemPeople(authors) @@ -174,6 +177,8 @@ func mediaTypeLabel(t string) string { return "TV series" case "audiobook": return "audiobook" + case "ebook": + return "ebook" default: return "movie" } diff --git a/internal/recommendations/embeddings/text_test.go b/internal/recommendations/embeddings/text_test.go index b23b303b..3a90e034 100644 --- a/internal/recommendations/embeddings/text_test.go +++ b/internal/recommendations/embeddings/text_test.go @@ -61,6 +61,42 @@ func TestBuildEmbeddingTextAudiobookUsesAuthorAndNarrator(t *testing.T) { } } +func TestBuildEmbeddingTextEbookUsesAuthorWithoutNarratorOrCast(t *testing.T) { + item := &models.MediaItem{ + Title: "A Wizard of Earthsea", + Type: "ebook", + Year: 1968, + Genres: []string{"Fantasy"}, + Overview: "Ged learns the cost of power.", + People: []models.ItemPerson{ + {Person: models.Person{ID: 1, Name: "Ursula K. Le Guin"}, Kind: models.PersonKindAuthor}, + {Person: models.Person{ID: 2, Name: "Narrator Should Not Apply"}, Kind: models.PersonKindNarrator}, + {Person: models.Person{ID: 3, Name: "Actor Should Not Apply"}, Kind: models.PersonKindActor, Character: "Ged"}, + {Person: models.Person{ID: 4, Name: "Writer Should Not Apply"}, Kind: models.PersonKindWriter}, + }, + } + + text := BuildEmbeddingText(item) + + if !strings.Contains(text, "Fantasy ebook about Ged learns the cost of power.") { + t.Fatalf("ebook lede missing or wrong: %q", text) + } + if !strings.Contains(text, "Written by Ursula K. Le Guin") { + t.Fatalf("ebook author missing: %q", text) + } + for _, unwanted := range []string{ + "Narrated by", + "Narrator Should Not Apply", + "Cast:", + "Actor Should Not Apply", + "Writer Should Not Apply", + } { + if strings.Contains(text, unwanted) { + t.Fatalf("ebook text should not contain %q: %q", unwanted, text) + } + } +} + func TestBuildEmbeddingTextSortsActorsBeforeTopFive(t *testing.T) { item := &models.MediaItem{ Title: "Example", diff --git a/internal/recommendations/personal.go b/internal/recommendations/personal.go index a35919c7..d51ac658 100644 --- a/internal/recommendations/personal.go +++ b/internal/recommendations/personal.go @@ -11,7 +11,7 @@ import ( const aggregateMediaTypeFloorDivisor = 5 -var aggregateSupplementMediaTypes = []string{"movie", "series", "audiobook"} +var aggregateSupplementMediaTypes = []string{"movie", "series", "audiobook", "ebook"} // ForYou returns personalised recommendations grouped by taste clusters. // For cold-start users, non-personalized rows are returned. diff --git a/internal/recommendations/repo.go b/internal/recommendations/repo.go index b4183e10..21c05c1a 100644 --- a/internal/recommendations/repo.go +++ b/internal/recommendations/repo.go @@ -39,21 +39,63 @@ func ensureCanonicalDimensions(vec []float32) ([]float32, error) { const embeddingLockSettingKey = "recommendations.embedding_lock" const minHNSWEfSearch = 200 -const tasteSeedCandidateQuery = ` - WITH watched_counts AS ( - SELECT COALESCE(e.series_id, wp.media_item_id) AS item_id, - COUNT(DISTINCT wp.user_id::text || ':' || COALESCE(wp.profile_id, '')) AS watch_count - FROM user_watch_progress wp - LEFT JOIN episodes e ON e.content_id = wp.media_item_id - WHERE (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) - AND wp.updated_at > NOW() - INTERVAL '180 days' - GROUP BY 1 +// watchedActivityCTE unifies video watch progress and ebook reader progress +// into one activity stream. Episodes roll up to their parent series via +// COALESCE(e.series_id, ...). The ebook completed flag is derived from the +// shared finished-progress threshold. +var watchedActivityCTE = fmt.Sprintf(` +watched_activity AS ( + SELECT COALESCE(e.series_id, wp.media_item_id) AS item_id, + wp.media_item_id AS leaf_item_id, + wp.user_id, + wp.profile_id, + wp.user_id::text || ':' || COALESCE(wp.profile_id, '') AS watcher_id, + wp.updated_at, + wp.completed AS completed + FROM user_watch_progress wp + LEFT JOIN episodes e ON e.content_id = wp.media_item_id + WHERE (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = wp.user_id + AND hhi.profile_id = wp.profile_id + AND hhi.media_item_id = wp.media_item_id + AND wp.updated_at <= hhi.hidden_before + ) + UNION ALL + SELECT erp.content_id AS item_id, + erp.content_id AS leaf_item_id, + erp.user_id, + erp.profile_id, + erp.user_id::text || ':' || COALESCE(erp.profile_id, '') AS watcher_id, + erp.updated_at, + erp.progress >= %s AS completed + FROM ebook_reader_progress erp + WHERE erp.progress >= 0.5 + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = erp.user_id + AND hhi.profile_id = erp.profile_id + AND hhi.media_item_id = erp.content_id + AND erp.updated_at <= hhi.hidden_before + ) +)`, catalog.EbookFinishedProgressThresholdSQL) + +var tasteSeedCandidateQuery = fmt.Sprintf(` + WITH %s, + watched_counts AS ( + SELECT item_id, COUNT(DISTINCT watcher_id) AS watch_count + FROM watched_activity + WHERE updated_at > NOW() - INTERVAL '180 days' + GROUP BY item_id ) SELECT mi.content_id FROM media_items mi LEFT JOIN watched_counts wc ON wc.item_id = mi.content_id - WHERE (mi.status = 'matched' OR mi.type = 'audiobook') - AND mi.type IN ('movie', 'series', 'audiobook') + WHERE %s + AND mi.type IN ('movie', 'series', 'audiobook', 'ebook') AND mi.poster_path IS NOT NULL AND mi.poster_path <> '' ORDER BY COALESCE(wc.watch_count, 0) DESC, @@ -66,7 +108,7 @@ const tasteSeedCandidateQuery = ` CASE WHEN mi.rating_tmdb < 9.5 THEN mi.rating_tmdb END DESC NULLS LAST, mi.year DESC NULLS LAST, mi.content_id ASC - LIMIT $1 OFFSET $2` + LIMIT $1 OFFSET $2`, watchedActivityCTE, recommendationItemEligibilityWhereClause("mi")) // Repo provides database operations for the recommendation system. type Repo struct { @@ -120,6 +162,18 @@ type EmbeddingTextCandidate struct { CanonicalText string } +func embeddingEligibilityWhereClause() string { + return recommendationItemEligibilityWhereClause("mi") +} + +func recommendationItemEligibilityWhereClause(alias string) string { + alias = strings.TrimSpace(alias) + if alias == "" { + alias = "media_items" + } + return fmt.Sprintf("(%s.status = 'matched' OR %s.type = 'audiobook' OR %s.type = 'ebook')", alias, alias, alias) +} + // UpsertEmbedding stores or updates an embedding for a media item. func (r *Repo) UpsertEmbedding(ctx context.Context, itemID string, embedding []float32, model, canonicalText string) error { padded, err := ensureCanonicalDimensions(embedding) @@ -416,18 +470,18 @@ func (r *Repo) findTasteProfileCandidates( // ItemsNeedingEmbedding returns content IDs of media items that either have no // embedding or whose embedding was generated with a different model. -// Audiobooks bypass the status='matched' gate because they don't go through -// the external-provider match pipeline; their tag-derived metadata is -// authoritative as soon as the scan completes. +// Books bypass the status='matched' gate because their scanner/plugin-derived +// metadata is authoritative as soon as the scan/enrichment completes. func (r *Repo) ItemsNeedingEmbedding(ctx context.Context, currentModel string, limit int) ([]string, error) { - rows, err := r.pool.Query(ctx, ` + query := fmt.Sprintf(` SELECT mi.content_id FROM media_items mi LEFT JOIN media_item_embeddings e ON e.media_item_id = mi.content_id - WHERE (mi.status = 'matched' OR mi.type = 'audiobook') + WHERE %s AND (e.media_item_id IS NULL OR e.model != $1) LIMIT $2 - `, currentModel, limit) + `, embeddingEligibilityWhereClause()) + rows, err := r.pool.Query(ctx, query, currentModel, limit) if err != nil { return nil, fmt.Errorf("items needing embedding: %w", err) } @@ -448,11 +502,11 @@ func (r *Repo) ItemsNeedingEmbedding(ctx context.Context, currentModel string, l } func (r *Repo) ListEmbeddingTextCandidates(ctx context.Context, afterID, currentModel string, limit int) ([]EmbeddingTextCandidate, error) { - rows, err := r.pool.Query(ctx, ` + query := fmt.Sprintf(` -- Keep current_text in sync with embeddings.BuildEmbeddingText. This lets -- the embedding job page over only missing, model-stale, or text-stale rows. - -- Audiobook lines map to embeddings.mediaTypeLabel + the author/narrator - -- branch in BuildEmbeddingText; any divergence here forces every audiobook + -- Book lines map to embeddings.mediaTypeLabel + the author/narrator + -- branch in BuildEmbeddingText; any divergence here forces book items -- to re-embed every job run. WITH text_candidates AS ( SELECT mi.content_id, @@ -461,11 +515,11 @@ func (r *Repo) ListEmbeddingTextCandidates(ctx context.Context, afterID, current array_to_string(array_remove(ARRAY[ CASE WHEN cardinality(COALESCE(mi.genres, ARRAY[]::text[])) > 0 AND COALESCE(mi.overview, '') <> '' - THEN array_to_string(mi.genres, ', ') || ' ' || CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' ELSE 'movie' END || ' about ' || substr(mi.overview, 1, 1000) + THEN array_to_string(mi.genres, ', ') || ' ' || CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' WHEN mi.type = 'ebook' THEN 'ebook' ELSE 'movie' END || ' about ' || substr(mi.overview, 1, 1000) WHEN cardinality(COALESCE(mi.genres, ARRAY[]::text[])) > 0 - THEN array_to_string(mi.genres, ', ') || ' ' || CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' ELSE 'movie' END + THEN array_to_string(mi.genres, ', ') || ' ' || CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' WHEN mi.type = 'ebook' THEN 'ebook' ELSE 'movie' END WHEN COALESCE(mi.overview, '') <> '' - THEN CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' ELSE 'movie' END || '. ' || substr(mi.overview, 1, 1000) + THEN CASE WHEN mi.type = 'series' THEN 'TV series' WHEN mi.type = 'audiobook' THEN 'audiobook' WHEN mi.type = 'ebook' THEN 'ebook' ELSE 'movie' END || '. ' || substr(mi.overview, 1, 1000) ELSE NULL END, CASE WHEN COALESCE(mi.year, 0) > 0 @@ -474,11 +528,11 @@ func (r *Repo) ListEmbeddingTextCandidates(ctx context.Context, afterID, current END, CASE WHEN COALESCE(mi.content_rating, '') <> '' THEN 'Rated ' || mi.content_rating ELSE NULL END, CASE WHEN COALESCE(mi.tagline, '') <> '' THEN '"' || mi.tagline || '"' ELSE NULL END, - CASE WHEN mi.type <> 'audiobook' AND actors.names <> '' THEN 'Cast: ' || actors.names ELSE NULL END, - CASE WHEN mi.type <> 'audiobook' AND directors.names <> '' THEN 'Directed by ' || directors.names ELSE NULL END, + CASE WHEN mi.type NOT IN ('audiobook', 'ebook') AND actors.names <> '' THEN 'Cast: ' || actors.names ELSE NULL END, + CASE WHEN mi.type NOT IN ('audiobook', 'ebook') AND directors.names <> '' THEN 'Directed by ' || directors.names ELSE NULL END, CASE - WHEN mi.type = 'audiobook' AND authors.names <> '' THEN 'Written by ' || authors.names - WHEN mi.type <> 'audiobook' AND writers.names <> '' THEN 'Written by ' || writers.names + WHEN mi.type IN ('audiobook', 'ebook') AND authors.names <> '' THEN 'Written by ' || authors.names + WHEN mi.type NOT IN ('audiobook', 'ebook') AND writers.names <> '' THEN 'Written by ' || writers.names ELSE NULL END, CASE WHEN mi.type = 'audiobook' AND narrators.names <> '' THEN 'Narrated by ' || narrators.names ELSE NULL END, @@ -536,7 +590,7 @@ func (r *Repo) ListEmbeddingTextCandidates(ctx context.Context, afterID, current WHERE ip.content_id = mi.content_id AND ip.kind = 8 ) narrators ON TRUE - WHERE (mi.status = 'matched' OR mi.type = 'audiobook') + WHERE %s AND ($1 = '' OR mi.content_id > $1) ) SELECT mi.content_id, @@ -548,7 +602,8 @@ func (r *Repo) ListEmbeddingTextCandidates(ctx context.Context, afterID, current OR mi.canonical_text IS DISTINCT FROM mi.current_text ORDER BY mi.content_id LIMIT $3 - `, afterID, currentModel, limit) + `, embeddingEligibilityWhereClause()) + rows, err := r.pool.Query(ctx, query, afterID, currentModel, limit) if err != nil { return nil, fmt.Errorf("embedding text candidates: %w", err) } @@ -583,7 +638,8 @@ func (r *Repo) EmbeddingCount(ctx context.Context) (int, error) { // (used by the admin worker UI) lines up with what the job actually does. func (r *Repo) TotalMediaItemCount(ctx context.Context) (int, error) { var count int - err := r.pool.QueryRow(ctx, `SELECT COUNT(*) FROM media_items WHERE status = 'matched' OR type = 'audiobook'`).Scan(&count) + query := fmt.Sprintf(`SELECT COUNT(*) FROM media_items mi WHERE %s`, embeddingEligibilityWhereClause()) + err := r.pool.QueryRow(ctx, query).Scan(&count) if err != nil { return 0, fmt.Errorf("total media item count: %w", err) } @@ -1137,6 +1193,46 @@ func (r *Repo) GetWatchProgressForUser(ctx context.Context, userID int, profileI return result, rows.Err() } +// ebookReaderProgressForUserQuery maps ebook reader progress onto the +// WatchProgressRow shape (progress as position with duration 1). Rows hidden +// via user_history_hidden_items are excluded with the same semantics as +// GetWatchProgressForUser: hidden when updated_at <= hidden_before, visible +// again once new reading activity lands after hidden_before. +var ebookReaderProgressForUserQuery = fmt.Sprintf(` + SELECT content_id, + progress::double precision AS position_seconds, + 1::double precision AS duration_seconds, + progress >= %s AS completed, + updated_at + FROM ebook_reader_progress + WHERE user_id = $1 AND profile_id = $2 + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = ebook_reader_progress.user_id + AND hhi.profile_id = ebook_reader_progress.profile_id + AND hhi.media_item_id = ebook_reader_progress.content_id + AND ebook_reader_progress.updated_at <= hhi.hidden_before + )`, catalog.EbookFinishedProgressThresholdSQL) + +func (r *Repo) GetEbookReaderProgressForUser(ctx context.Context, userID int, profileID string) ([]WatchProgressRow, error) { + rows, err := r.pool.Query(ctx, ebookReaderProgressForUserQuery, userID, profileID) + if err != nil { + return nil, fmt.Errorf("get ebook reader progress: %w", err) + } + defer rows.Close() + + var result []WatchProgressRow + for rows.Next() { + var wp WatchProgressRow + if err := rows.Scan(&wp.MediaItemID, &wp.PositionSeconds, &wp.DurationSeconds, &wp.Completed, &wp.UpdatedAt); err != nil { + return nil, fmt.Errorf("scan ebook reader progress: %w", err) + } + result = append(result, wp) + } + return result, rows.Err() +} + // RewatchCount holds the number of completed watches for an item. type RewatchCount struct { MediaItemID string @@ -1177,33 +1273,38 @@ func (r *Repo) GetRewatchCounts(ctx context.Context, userID int, profileID strin return result, rows.Err() } +// itemWatchersQuery feeds co-watch matrix computation. watched_activity rolls +// episodes up to their parent series, so a single watcher can produce many +// rows for the same item; the GROUP BY collapses them to one row per +// (watcher, item) before ranking and aggregation so a lone binge-watcher +// cannot satisfy the minimum-watchers threshold ($2) by itself and the +// per-user recency cap ($1) counts distinct items rather than raw rows. +// +// Watcher identity is (user_id, profile_id) for the Jaccard math — profiles of +// one account legitimately have distinct tastes — but the minimum-watchers +// floor ($2) is a sparsity/privacy threshold and must count distinct login +// ACCOUNTS: one household account with N profiles must not satisfy it alone, +// so the HAVING clause counts DISTINCT user_id rather than watcher rows. +var itemWatchersQuery = fmt.Sprintf(` + WITH %s, + user_watches AS ( + SELECT user_id, + watcher_id, + item_id AS media_item_id, + ROW_NUMBER() OVER (PARTITION BY user_id, profile_id ORDER BY MAX(updated_at) DESC) AS rn + FROM watched_activity + GROUP BY user_id, profile_id, watcher_id, item_id + ) + SELECT media_item_id, ARRAY_AGG(watcher_id) AS watchers + FROM user_watches + WHERE rn <= $1 + GROUP BY media_item_id + HAVING COUNT(DISTINCT user_id) >= $2`, watchedActivityCTE) + // ItemWatchers maps item_id to profile identities that watched >= 50% progress. // Used for co-watch matrix computation. func (r *Repo) GetItemWatchers(ctx context.Context, minWatchers int, maxPerUser int) (map[string][]string, error) { - // Get all watch progress entries where progress >= 50% or completed - rows, err := r.pool.Query(ctx, ` - WITH user_watches AS ( - SELECT user_id::text || ':' || COALESCE(profile_id, '') AS watcher_id, - media_item_id, - ROW_NUMBER() OVER (PARTITION BY user_id, profile_id ORDER BY updated_at DESC) AS rn - FROM user_watch_progress - WHERE (completed = true - OR (duration_seconds > 0 AND position_seconds / duration_seconds >= 0.5)) - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = user_watch_progress.user_id - AND hhi.profile_id = user_watch_progress.profile_id - AND hhi.media_item_id = user_watch_progress.media_item_id - AND user_watch_progress.updated_at <= hhi.hidden_before - ) - ) - SELECT media_item_id, ARRAY_AGG(watcher_id) AS watchers - FROM user_watches - WHERE rn <= $1 - GROUP BY media_item_id - HAVING COUNT(*) >= $2`, - maxPerUser, minWatchers) + rows, err := r.pool.Query(ctx, itemWatchersQuery, maxPerUser, minWatchers) if err != nil { return nil, fmt.Errorf("get item watchers: %w", err) } @@ -1226,30 +1327,20 @@ func (r *Repo) GetItemWatchers(ctx context.Context, minWatchers int, maxPerUser // GetPopularItems returns the most-played media items over the given number of days. // Episodes are resolved to their parent series. func (r *Repo) GetPopularItems(ctx context.Context, days, limit int) ([]ScoredItem, error) { - rows, err := r.pool.Query(ctx, ` - WITH watched_items AS ( - SELECT COALESCE(e.series_id, wp.media_item_id) AS item_id, - wp.user_id::text || ':' || COALESCE(wp.profile_id, '') AS watcher_id - FROM user_watch_progress wp - LEFT JOIN episodes e ON e.content_id = wp.media_item_id - WHERE (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) - AND wp.updated_at > NOW() - ($1 || ' days')::interval - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = wp.user_id - AND hhi.profile_id = wp.profile_id - AND hhi.media_item_id = wp.media_item_id - AND wp.updated_at <= hhi.hidden_before - ) + query := fmt.Sprintf(` + WITH %s, + watched_items AS ( + SELECT item_id, watcher_id + FROM watched_activity + WHERE updated_at > NOW() - ($1 || ' days')::interval ) SELECT wi.item_id, COUNT(DISTINCT wi.watcher_id) AS watch_count FROM watched_items wi JOIN media_items mi ON mi.content_id = wi.item_id GROUP BY wi.item_id ORDER BY watch_count DESC - LIMIT $2`, - fmt.Sprintf("%d", days), limit) + LIMIT $2`, watchedActivityCTE) + rows, err := r.pool.Query(ctx, query, fmt.Sprintf("%d", days), limit) if err != nil { return nil, fmt.Errorf("get popular items: %w", err) } @@ -1270,17 +1361,18 @@ func (r *Repo) GetPopularItems(ctx context.Context, days, limit int) ([]ScoredIt } // GetRecentlyAddedItems returns items added within the given number of days. -// Audiobooks bypass the matched-status gate because their scan-derived metadata -// is authoritative before any external-provider match exists. +// Audiobooks and ebooks bypass the matched-status gate because their +// scan-derived metadata is authoritative before any external-provider match +// exists. func (r *Repo) GetRecentlyAddedItems(ctx context.Context, days, limit int) ([]ScoredItem, error) { - rows, err := r.pool.Query(ctx, ` - SELECT content_id, created_at - FROM media_items - WHERE (status = 'matched' OR type = 'audiobook') - AND created_at > NOW() - ($1 || ' days')::interval - ORDER BY created_at DESC - LIMIT $2`, - fmt.Sprintf("%d", days), limit) + query := fmt.Sprintf(` + SELECT mi.content_id, mi.created_at + FROM media_items mi + WHERE %s + AND mi.created_at > NOW() - ($1 || ' days')::interval + ORDER BY mi.created_at DESC + LIMIT $2`, recommendationItemEligibilityWhereClause("mi")) + rows, err := r.pool.Query(ctx, query, fmt.Sprintf("%d", days), limit) if err != nil { return nil, fmt.Errorf("get recently added: %w", err) } @@ -1354,21 +1446,11 @@ func (r *Repo) GetTasteSeedCandidates(ctx context.Context, limit, offset int) ([ // GetTopGenres returns the most popular genres by watch count. // Episodes are resolved to their parent series for genre lookup. func (r *Repo) GetTopGenres(ctx context.Context, limit int) ([]string, error) { - rows, err := r.pool.Query(ctx, ` - WITH watched_items AS ( - SELECT COALESCE(e.series_id, wp.media_item_id) AS item_id, - wp.user_id::text || ':' || COALESCE(wp.profile_id, '') AS watcher_id - FROM user_watch_progress wp - LEFT JOIN episodes e ON e.content_id = wp.media_item_id - WHERE (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = wp.user_id - AND hhi.profile_id = wp.profile_id - AND hhi.media_item_id = wp.media_item_id - AND wp.updated_at <= hhi.hidden_before - ) + query := fmt.Sprintf(` + WITH %s, + watched_items AS ( + SELECT item_id, watcher_id + FROM watched_activity ) SELECT g.genre, COUNT(DISTINCT wi.watcher_id) AS watchers FROM watched_items wi @@ -1376,8 +1458,8 @@ func (r *Repo) GetTopGenres(ctx context.Context, limit int) ([]string, error) { CROSS JOIN LATERAL UNNEST(mi.genres) AS g(genre) GROUP BY g.genre ORDER BY watchers DESC - LIMIT $1`, - limit) + LIMIT $1`, watchedActivityCTE) + rows, err := r.pool.Query(ctx, query, limit) if err != nil { return nil, fmt.Errorf("get top genres: %w", err) } @@ -1397,21 +1479,11 @@ func (r *Repo) GetTopGenres(ctx context.Context, limit int) ([]string, error) { // GetGenreSamplerItems returns the most-played media items in a specific genre. func (r *Repo) GetGenreSamplerItems(ctx context.Context, genre string, limit int) ([]ScoredItem, error) { - rows, err := r.pool.Query(ctx, ` - WITH watched_items AS ( - SELECT COALESCE(e.series_id, wp.media_item_id) AS item_id, - wp.user_id::text || ':' || COALESCE(wp.profile_id, '') AS watcher_id - FROM user_watch_progress wp - LEFT JOIN episodes e ON e.content_id = wp.media_item_id - WHERE (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = wp.user_id - AND hhi.profile_id = wp.profile_id - AND hhi.media_item_id = wp.media_item_id - AND wp.updated_at <= hhi.hidden_before - ) + query := fmt.Sprintf(` + WITH %s, + watched_items AS ( + SELECT item_id, watcher_id + FROM watched_activity ) SELECT wi.item_id, COUNT(DISTINCT wi.watcher_id) AS watch_count FROM watched_items wi @@ -1419,8 +1491,8 @@ func (r *Repo) GetGenreSamplerItems(ctx context.Context, genre string, limit int WHERE $1 = ANY(mi.genres) GROUP BY wi.item_id ORDER BY watch_count DESC - LIMIT $2`, - genre, limit) + LIMIT $2`, watchedActivityCTE) + rows, err := r.pool.Query(ctx, query, genre, limit) if err != nil { return nil, fmt.Errorf("get genre sampler items: %w", err) } @@ -1619,21 +1691,12 @@ func (r *Repo) GetAllUsersWithTasteProfiles(ctx context.Context) ([]StaleProfile // GetWatchedItemIDs returns content IDs of media items the user has watched // (>= 50% progress or completed). Episodes are resolved to their parent series. func (r *Repo) GetWatchedItemIDs(ctx context.Context, userID int, profileID string) ([]string, error) { - rows, err := r.pool.Query(ctx, ` - SELECT DISTINCT COALESCE(e.series_id, wp.media_item_id) AS item_id - FROM user_watch_progress wp - LEFT JOIN episodes e ON e.content_id = wp.media_item_id - WHERE wp.user_id = $1 AND wp.profile_id = $2 - AND (wp.completed = true OR (wp.duration_seconds > 0 AND wp.position_seconds / wp.duration_seconds >= 0.5)) - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = wp.user_id - AND hhi.profile_id = wp.profile_id - AND hhi.media_item_id = wp.media_item_id - AND wp.updated_at <= hhi.hidden_before - )`, - userID, profileID) + query := fmt.Sprintf(` + WITH %s + SELECT DISTINCT item_id + FROM watched_activity + WHERE user_id = $1 AND profile_id = $2`, watchedActivityCTE) + rows, err := r.pool.Query(ctx, query, userID, profileID) if err != nil { return nil, fmt.Errorf("get watched item IDs: %w", err) } @@ -1697,21 +1760,15 @@ func (r *Repo) GetRecentCompletedItemIDs(ctx context.Context, userID int, profil return []string{}, nil } - rows, err := r.pool.Query(ctx, ` - SELECT media_item_id - FROM user_watch_progress + query := fmt.Sprintf(` + WITH %s + SELECT leaf_item_id + FROM watched_activity WHERE user_id = $1 AND profile_id = $2 AND completed = true - AND NOT EXISTS ( - SELECT 1 - FROM user_history_hidden_items hhi - WHERE hhi.user_id = user_watch_progress.user_id - AND hhi.profile_id = user_watch_progress.profile_id - AND hhi.media_item_id = user_watch_progress.media_item_id - AND user_watch_progress.updated_at <= hhi.hidden_before - ) - ORDER BY updated_at DESC, media_item_id ASC + ORDER BY updated_at DESC, leaf_item_id ASC LIMIT $3 - `, userID, profileID, limit) + `, watchedActivityCTE) + rows, err := r.pool.Query(ctx, query, userID, profileID, limit) if err != nil { return nil, fmt.Errorf("get recent completed item IDs: %w", err) } diff --git a/internal/recommendations/repo_test.go b/internal/recommendations/repo_test.go index da5e52ca..a67d84dd 100644 --- a/internal/recommendations/repo_test.go +++ b/internal/recommendations/repo_test.go @@ -24,6 +24,128 @@ func TestTasteSeedCandidateQueryOrdersByReliableColdStartSignals(t *testing.T) { } } +func TestTasteSeedCandidateQueryIncludesEbooks(t *testing.T) { + query := strings.Join(strings.Fields(tasteSeedCandidateQuery), " ") + + for _, term := range []string{ + "(mi.status = 'matched' OR mi.type = 'audiobook' OR mi.type = 'ebook')", + "mi.type IN ('movie', 'series', 'audiobook', 'ebook')", + } { + if !strings.Contains(query, term) { + t.Fatalf("taste seed candidate query missing %q: %s", term, query) + } + } +} + +func TestItemWatchersQueryCountsDistinctWatchersPerItem(t *testing.T) { + query := strings.Join(strings.Fields(itemWatchersQuery), " ") + + // watched_activity rolls episodes up to their parent series, so one + // watcher can emit many rows per item. The pairs must be deduplicated + // before ROW_NUMBER ranking and the HAVING watcher count, otherwise a + // single binge-watcher inflates both. + assertQueryTermsInOrder(t, query, + "ROW_NUMBER() OVER (PARTITION BY user_id, profile_id ORDER BY MAX(updated_at) DESC) AS rn", + "GROUP BY user_id, profile_id, watcher_id, item_id", + "WHERE rn <= $1", + "GROUP BY media_item_id", + "HAVING COUNT(DISTINCT user_id) >= $2", + ) +} + +func TestItemWatchersQueryMinWatchersCountsDistinctAccounts(t *testing.T) { + query := strings.Join(strings.Fields(itemWatchersQuery), " ") + + // The minimum-watchers floor is a sparsity/privacy threshold: one login + // account with N household profiles must not satisfy it by itself, so the + // HAVING clause counts distinct user_id (accounts), not watcher rows. The + // per-profile watcher_id array is still aggregated for Jaccard math. + assertQueryTermsInOrder(t, query, + "SELECT user_id, watcher_id, item_id AS media_item_id", + "ARRAY_AGG(watcher_id) AS watchers", + "HAVING COUNT(DISTINCT user_id) >= $2", + ) + if strings.Contains(query, "HAVING COUNT(*) >= $2") { + t.Fatal("minWatchers floor must not count per-profile watcher rows") + } +} + +func TestEbookReaderProgressForUserQueryGatesHiddenHistory(t *testing.T) { + query := strings.Join(strings.Fields(ebookReaderProgressForUserQuery), " ") + + // Mirrors GetWatchProgressForUser: rows the user hid stay hidden while + // updated_at <= hidden_before; reading activity after hidden_before + // surfaces again. + assertQueryTermsInOrder(t, query, + "FROM ebook_reader_progress", + "NOT EXISTS", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = ebook_reader_progress.content_id", + "ebook_reader_progress.updated_at <= hhi.hidden_before", + ) +} + +func TestWatchedActivityCTEIncludesEbookReaderProgress(t *testing.T) { + query := strings.Join(strings.Fields(watchedActivityCTE), " ") + + for _, term := range []string{ + "FROM ebook_reader_progress erp", + "erp.progress >= 0.5", + "erp.progress >= 0.9 AS completed", + "hhi.media_item_id = erp.content_id", + } { + if !strings.Contains(query, term) { + t.Fatalf("watched activity CTE missing %q: %s", term, query) + } + } +} + +func TestEmbeddingEligibilityWhereClauseIncludesBookTypes(t *testing.T) { + clause := embeddingEligibilityWhereClause() + + for _, term := range []string{"mi.status = 'matched'", "mi.type = 'audiobook'", "mi.type = 'ebook'"} { + if !strings.Contains(clause, term) { + t.Fatalf("embedding eligibility clause missing %q: %s", term, clause) + } + } +} + +func TestEmbeddingEligibilityWhereClauseUsesMediaItemsAlias(t *testing.T) { + clause := embeddingEligibilityWhereClause() + + if strings.Contains(clause, " type =") || strings.Contains(clause, " status =") { + t.Fatalf("embedding eligibility clause should qualify media_items columns: %s", clause) + } +} + +func TestRecommendationItemEligibilityWhereClauseIncludesBookTypes(t *testing.T) { + clause := recommendationItemEligibilityWhereClause("mi") + + for _, term := range []string{"mi.status = 'matched'", "mi.type = 'audiobook'", "mi.type = 'ebook'"} { + if !strings.Contains(clause, term) { + t.Fatalf("recommendation item eligibility clause missing %q: %s", term, clause) + } + } +} + +func TestRecommendationItemEligibilityWhereClauseDefaultsAlias(t *testing.T) { + clause := recommendationItemEligibilityWhereClause("") + + if !strings.Contains(clause, "media_items.status = 'matched'") { + t.Fatalf("default eligibility alias missing media_items qualification: %s", clause) + } +} + +func TestTasteProfileRefreshSubjectsQueryIncludesEbookReaderProgress(t *testing.T) { + query := strings.Join(strings.Fields(tasteProfileRefreshSubjectsQuery), " ") + + assertQueryTermsInOrder(t, query, + "SELECT DISTINCT user_id, profile_id FROM user_watch_progress", + "UNION", + "SELECT DISTINCT user_id, profile_id FROM ebook_reader_progress", + ) +} + func assertQueryTermsInOrder(t *testing.T, query string, terms ...string) { t.Helper() diff --git a/internal/recommendations/signals.go b/internal/recommendations/signals.go index c73b4e5a..ee462a95 100644 --- a/internal/recommendations/signals.go +++ b/internal/recommendations/signals.go @@ -14,6 +14,7 @@ const signalPageSize = 1000 type signalRepo interface { GetWatchedItemIDSet(ctx context.Context, userID int, profileID string) (map[string]struct{}, error) GetWatchProgressForUser(ctx context.Context, userID int, profileID string) ([]WatchProgressRow, error) + GetEbookReaderProgressForUser(ctx context.Context, userID int, profileID string) ([]WatchProgressRow, error) GetRecentCompletedItemIDs(ctx context.Context, userID int, profileID string, limit int) ([]string, error) GetRewatchCounts(ctx context.Context, userID int, profileID string) ([]RewatchCount, error) ResolveCanonicalItemIDSet(ctx context.Context, contentIDs []string) (map[string]struct{}, error) @@ -69,6 +70,15 @@ func (s *SignalReader) WatchedItemIDSet(ctx context.Context, userID int, profile }); err != nil { return nil, err } + ebookProgress, err := s.repo.GetEbookReaderProgressForUser(ctx, userID, profileID) + if err != nil { + return nil, err + } + for _, wp := range ebookProgress { + if wp.Completed || watchedProgressThresholdMet(wp.PositionSeconds, wp.DurationSeconds) { + rawIDs = append(rawIDs, wp.MediaItemID) + } + } return s.repo.ResolveCanonicalItemIDSet(ctx, rawIDs) } @@ -97,6 +107,11 @@ func (s *SignalReader) WatchProgressForUser(ctx context.Context, userID int, pro }); err != nil { return nil, err } + ebookProgress, err := s.repo.GetEbookReaderProgressForUser(ctx, userID, profileID) + if err != nil { + return nil, err + } + rows = append(rows, ebookProgress...) return rows, nil } @@ -118,20 +133,38 @@ func (s *SignalReader) RecentCompletedItemIDs(ctx context.Context, userID int, p if err != nil { return nil, fmt.Errorf("list completed progress from store: %w", err) } - sort.SliceStable(progress, func(i, j int) bool { - left := parseSignalTime(progress[i].UpdatedAt, time.Time{}) - right := parseSignalTime(progress[j].UpdatedAt, time.Time{}) - if !left.Equal(right) { - return left.After(right) - } - return progress[i].MediaItemID < progress[j].MediaItemID - }) - - ids := make([]string, 0, min(limit, len(progress))) + completed := make([]WatchProgressRow, 0, len(progress)) for _, wp := range progress { if !wp.Completed { continue } + completed = append(completed, WatchProgressRow{ + MediaItemID: wp.MediaItemID, + Completed: true, + UpdatedAt: parseSignalTime(wp.UpdatedAt, time.Time{}), + }) + } + ebookProgress, err := s.repo.GetEbookReaderProgressForUser(ctx, userID, profileID) + if err != nil { + return nil, err + } + for _, wp := range ebookProgress { + if !wp.Completed { + continue + } + completed = append(completed, wp) + } + sort.SliceStable(completed, func(i, j int) bool { + left := completed[i].UpdatedAt + right := completed[j].UpdatedAt + if !left.Equal(right) { + return left.After(right) + } + return completed[i].MediaItemID < completed[j].MediaItemID + }) + + ids := make([]string, 0, min(limit, len(completed))) + for _, wp := range completed { ids = append(ids, wp.MediaItemID) if len(ids) == limit { break diff --git a/internal/recommendations/signals_test.go b/internal/recommendations/signals_test.go index a3b54480..ae8f54ee 100644 --- a/internal/recommendations/signals_test.go +++ b/internal/recommendations/signals_test.go @@ -14,6 +14,7 @@ type fakeSignalRepo struct { fallbackWatched map[string]struct{} fallbackProgress []WatchProgressRow + ebookProgress []WatchProgressRow fallbackRecentCompleted []string fallbackRewatches []RewatchCount } @@ -26,6 +27,10 @@ func (r *fakeSignalRepo) GetWatchProgressForUser(context.Context, int, string) ( return r.fallbackProgress, nil } +func (r *fakeSignalRepo) GetEbookReaderProgressForUser(context.Context, int, string) ([]WatchProgressRow, error) { + return r.ebookProgress, nil +} + func (r *fakeSignalRepo) GetRecentCompletedItemIDs(context.Context, int, string, int) ([]string, error) { return r.fallbackRecentCompleted, nil } @@ -161,6 +166,52 @@ func TestSignalReaderWatchedSetCanonicalizesStoreProgress(t *testing.T) { } } +func TestSignalReaderWatchedSetIncludesEbookReaderProgress(t *testing.T) { + store := &fakeSignalStore{} + repo := &fakeSignalRepo{ + ebookProgress: []WatchProgressRow{ + {MediaItemID: "ebook-half", PositionSeconds: 0.6, DurationSeconds: 1, UpdatedAt: time.Date(2026, 6, 1, 10, 0, 0, 0, time.UTC)}, + {MediaItemID: "ebook-low", PositionSeconds: 0.2, DurationSeconds: 1, UpdatedAt: time.Date(2026, 6, 1, 11, 0, 0, 0, time.UTC)}, + }, + } + reader := NewSignalReader(repo, fakeSignalProvider{store: store}) + + watched, err := reader.WatchedItemIDSet(context.Background(), 7, "p1") + if err != nil { + t.Fatalf("WatchedItemIDSet returned error: %v", err) + } + + if _, ok := watched["ebook-half"]; !ok { + t.Fatalf("expected ebook-half in watched set, got %#v", watched) + } + if _, ok := watched["ebook-low"]; ok { + t.Fatalf("did not expect low-progress ebook in watched set: %#v", watched) + } +} + +func TestSignalReaderWatchProgressIncludesEbookReaderProgress(t *testing.T) { + store := &fakeSignalStore{progress: []userstore.WatchProgress{ + {ProfileID: "p1", MediaItemID: "movie", PositionSeconds: 60, DurationSeconds: 100, UpdatedAt: "2026-06-01T10:00:00Z"}, + }} + repo := &fakeSignalRepo{ + ebookProgress: []WatchProgressRow{ + {MediaItemID: "ebook", PositionSeconds: 0.42, DurationSeconds: 1, Completed: false, UpdatedAt: time.Date(2026, 6, 1, 11, 0, 0, 0, time.UTC)}, + }, + } + reader := NewSignalReader(repo, fakeSignalProvider{store: store}) + + progress, err := reader.WatchProgressForUser(context.Background(), 7, "p1") + if err != nil { + t.Fatalf("WatchProgressForUser returned error: %v", err) + } + + if !slices.ContainsFunc(progress, func(row WatchProgressRow) bool { + return row.MediaItemID == "ebook" && row.PositionSeconds == 0.42 && row.DurationSeconds == 1 + }) { + t.Fatalf("ebook progress missing from rows: %#v", progress) + } +} + func TestSignalReaderRecentCompletedUsesStoreUpdatedOrder(t *testing.T) { store := &fakeSignalStore{progress: []userstore.WatchProgress{ {ProfileID: "p1", MediaItemID: "older", Completed: true, UpdatedAt: "2026-05-01T10:00:00Z"}, @@ -181,6 +232,29 @@ func TestSignalReaderRecentCompletedUsesStoreUpdatedOrder(t *testing.T) { } } +func TestSignalReaderRecentCompletedIncludesEbookReaderProgress(t *testing.T) { + store := &fakeSignalStore{progress: []userstore.WatchProgress{ + {ProfileID: "p1", MediaItemID: "movie", Completed: true, UpdatedAt: "2026-06-01T10:00:00Z"}, + }} + repo := &fakeSignalRepo{ + ebookProgress: []WatchProgressRow{ + {MediaItemID: "ebook-done", PositionSeconds: 0.95, DurationSeconds: 1, Completed: true, UpdatedAt: time.Date(2026, 6, 3, 10, 0, 0, 0, time.UTC)}, + {MediaItemID: "ebook-open", PositionSeconds: 0.4, DurationSeconds: 1, Completed: false, UpdatedAt: time.Date(2026, 6, 4, 10, 0, 0, 0, time.UTC)}, + }, + } + reader := NewSignalReader(repo, fakeSignalProvider{store: store}) + + ids, err := reader.RecentCompletedItemIDs(context.Background(), 7, "p1", 3) + if err != nil { + t.Fatalf("RecentCompletedItemIDs returned error: %v", err) + } + + want := []string{"ebook-done", "movie"} + if !slices.Equal(ids, want) { + t.Fatalf("recent completed = %#v, want %#v", ids, want) + } +} + func TestSignalReaderRewatchCountsAggregatesCompletedHistory(t *testing.T) { store := &fakeSignalStore{history: []userstore.WatchHistoryEntry{ {ProfileID: "p1", MediaItemID: "rewatched", Completed: true, WatchedAt: "2026-05-01T10:00:00Z"}, diff --git a/internal/recommendations/taste_signals.go b/internal/recommendations/taste_signals.go index 5fa9f95d..028e063a 100644 --- a/internal/recommendations/taste_signals.go +++ b/internal/recommendations/taste_signals.go @@ -12,6 +12,7 @@ const ( canonicalKindSeries canonicalContentKind = "series" canonicalKindSeason canonicalContentKind = "season" canonicalKindEpisode canonicalContentKind = "episode" + canonicalKindEbook canonicalContentKind = "ebook" ) const ( @@ -310,7 +311,11 @@ func buildCanonicalImplicitSignals(progress []WatchProgressRow, rewatches []Rewa if timestamp.After(builder.lastSignalAt) { builder.lastSignalAt = timestamp } - case canonicalKindMovie, canonicalKindSeries: + case canonicalKindMovie, canonicalKindSeries, canonicalKindEbook: + // Ebooks are their own canonical entity. Reader progress rows carry + // progress as position with duration 1, so implicitWatchWeight + // treats the reading ratio exactly like a movie's + // position/duration ratio (finished book == finished movie). signals[signal.Ref.CanonicalID] += signal.Weight * timeDecay(timestamp, now, halfLife) } } diff --git a/internal/recommendations/taste_signals_test.go b/internal/recommendations/taste_signals_test.go new file mode 100644 index 00000000..d6ebc6ae --- /dev/null +++ b/internal/recommendations/taste_signals_test.go @@ -0,0 +1,71 @@ +package recommendations + +import ( + "math" + "testing" + "time" +) + +func TestBuildCanonicalImplicitSignalsIncludesEbookCompletion(t *testing.T) { + now := time.Date(2026, 6, 1, 12, 0, 0, 0, time.UTC) + halfLife := 90.0 + + // Ebook reader progress rows map progress onto position with duration 1, + // so a finished book carries the same ratio shape as a finished movie. + progress := []WatchProgressRow{ + {MediaItemID: "ebook-1", PositionSeconds: 0.95, DurationSeconds: 1, Completed: true, UpdatedAt: now}, + {MediaItemID: "movie-1", PositionSeconds: 5400, DurationSeconds: 5700, Completed: true, UpdatedAt: now}, + } + refs := map[string]canonicalContentRef{ + "ebook-1": {Kind: canonicalKindEbook, CanonicalID: "ebook-1"}, + "movie-1": {Kind: canonicalKindMovie, CanonicalID: "movie-1"}, + } + + signals, completed := buildCanonicalImplicitSignals(progress, nil, refs, now, halfLife) + + ebookWeight, ok := signals["ebook-1"] + if !ok { + t.Fatal("expected ebook completion to produce a canonical implicit signal") + } + movieWeight, ok := signals["movie-1"] + if !ok { + t.Fatal("expected movie completion to produce a canonical implicit signal") + } + if math.Abs(ebookWeight-movieWeight) > 1e-9 { + t.Fatalf("ebook completion weight %v should match movie completion weight %v", ebookWeight, movieWeight) + } + if math.Abs(ebookWeight-WeightWatchHigh) > 1e-9 { + t.Fatalf("ebook completion weight = %v, want WeightWatchHigh (%v) with no decay at t=now", ebookWeight, WeightWatchHigh) + } + if _, ok := completed["ebook-1"]; !ok { + t.Fatal("expected completed ebook to enter the completed set") + } +} + +func TestBuildCanonicalImplicitSignalsWeightsPartialEbookLikeMovie(t *testing.T) { + now := time.Date(2026, 6, 1, 12, 0, 0, 0, time.UTC) + halfLife := 90.0 + + progress := []WatchProgressRow{ + // Mid-read book (60%) mirrors a movie watched to 60%. + {MediaItemID: "ebook-mid", PositionSeconds: 0.6, DurationSeconds: 1, UpdatedAt: now}, + // Abandoned book (<15%) mirrors an abandoned movie: negative signal. + {MediaItemID: "ebook-abandoned", PositionSeconds: 0.05, DurationSeconds: 1, UpdatedAt: now}, + } + refs := map[string]canonicalContentRef{ + "ebook-mid": {Kind: canonicalKindEbook, CanonicalID: "ebook-mid"}, + "ebook-abandoned": {Kind: canonicalKindEbook, CanonicalID: "ebook-abandoned"}, + } + + signals, completed := buildCanonicalImplicitSignals(progress, nil, refs, now, halfLife) + + if got := signals["ebook-mid"]; math.Abs(got-WeightWatchMed) > 1e-9 { + t.Fatalf("mid-read ebook weight = %v, want WeightWatchMed (%v)", got, WeightWatchMed) + } + if got := signals["ebook-abandoned"]; math.Abs(got-WeightWatchLow) > 1e-9 { + t.Fatalf("abandoned ebook weight = %v, want WeightWatchLow (%v)", got, WeightWatchLow) + } + if len(completed) != 0 { + t.Fatalf("no row was completed, got completed set %v", completed) + } +} diff --git a/internal/recommendations/worker.go b/internal/recommendations/worker.go index bc509b52..2a64dc1b 100644 --- a/internal/recommendations/worker.go +++ b/internal/recommendations/worker.go @@ -31,6 +31,19 @@ type Worker struct { cancelFunc context.CancelFunc } +const tasteProfileRefreshSubjectsQuery = ` + SELECT DISTINCT user_id, profile_id FROM user_ratings + UNION + SELECT DISTINCT user_id, profile_id FROM user_taste_profiles + UNION + SELECT DISTINCT user_id, profile_id FROM user_watch_progress + UNION + SELECT DISTINCT user_id, profile_id FROM ebook_reader_progress + UNION + SELECT DISTINCT user_id, profile_id FROM user_favorites + UNION + SELECT DISTINCT user_id, profile_id FROM user_watchlist` + // NewWorker creates a new recommendation Worker. func NewWorker(engine *Engine, embeddingsCron, tasteProfilesCron, cowatchCron, recommendationsCron string) (*Worker, error) { w := &Worker{ @@ -266,16 +279,7 @@ func (w *Worker) doTasteProfiles() { defer cancel() slog.Info("starting taste profile refresh") - rows, err := w.engine.pool.Query(ctx, ` - SELECT DISTINCT user_id, profile_id FROM user_ratings - UNION - SELECT DISTINCT user_id, profile_id FROM user_taste_profiles - UNION - SELECT DISTINCT user_id, profile_id FROM user_watch_progress - UNION - SELECT DISTINCT user_id, profile_id FROM user_favorites - UNION - SELECT DISTINCT user_id, profile_id FROM user_watchlist`) + rows, err := w.engine.pool.Query(ctx, tasteProfileRefreshSubjectsQuery) if err != nil { slog.Error("taste profile query failed", "error", err) return diff --git a/internal/scanner/audiobook.go b/internal/scanner/audiobook.go index a9bbe4f9..2a59cf09 100644 --- a/internal/scanner/audiobook.go +++ b/internal/scanner/audiobook.go @@ -48,7 +48,7 @@ func stripNarratorSuffix(title string) string { // The scanner write path (Task 8) converts this into media_items + // media_files + item_people rows. type parsedAudiobook struct { - Title string + Title string Author string Narrator string Series string diff --git a/internal/scanner/audiobook_cover.go b/internal/scanner/audiobook_cover.go index b4f5b714..6a1440e6 100644 --- a/internal/scanner/audiobook_cover.go +++ b/internal/scanner/audiobook_cover.go @@ -24,6 +24,10 @@ type audiobookCoverCacher interface { CacheAudiobookCover(ctx context.Context, data []byte, contentID string) (basePath string, ext string, thumbhash string, err error) } +type ebookCoverCacher interface { + CacheEbookCover(ctx context.Context, data []byte, contentID string) (basePath string, ext string, thumbhash string, err error) +} + type audiobookCoverMetadataStore interface { GetPosterPath(ctx context.Context, contentID string) (string, error) UpdateMetadata(ctx context.Context, contentID string, upd *catalog.MetadataUpdate) error diff --git a/internal/scanner/ebook.go b/internal/scanner/ebook.go new file mode 100644 index 00000000..96c93827 --- /dev/null +++ b/internal/scanner/ebook.go @@ -0,0 +1,1110 @@ +package scanner + +import ( + "archive/zip" + "bytes" + "encoding/hex" + "encoding/xml" + "fmt" + "html" + "io" + "os" + "path" + "path/filepath" + "strconv" + "strings" + "time" + "unicode" + "unicode/utf8" + + xhtml "golang.org/x/net/html" + "golang.org/x/net/html/charset" + "golang.org/x/text/encoding/charmap" + textunicode "golang.org/x/text/encoding/unicode" +) + +const maxEPUBMetadataEntrySize = 8 * 1024 * 1024 +const maxPDFMetadataScanSize = 2 * 1024 * 1024 + +var ebookExtensions = map[string]bool{ + ".epub": true, + ".pdf": true, + ".mobi": true, + ".azw": true, + ".azw3": true, + ".fb2": true, + ".fbz": true, + ".cbz": true, + ".cbr": true, +} + +type parsedEbook struct { + Format string + Title string + Authors []string + Description string + Publisher string + PublishedAt time.Time + Year int + Language string + ISBN string + Series string + SeriesIndex string + Genres []string + PageCount int + Cover *parsedEbookCover +} + +type parsedEbookCover struct { + ContentType string + Bytes []byte +} + +func SupportsEbookFile(filePath string) bool { + if strings.HasSuffix(strings.ToLower(filePath), ".fb2.zip") { + return true + } + return ebookExtensions[strings.ToLower(filepath.Ext(filePath))] +} + +func parseEbookFile(path string) (book parsedEbook, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("panic parsing ebook %s: %v", path, r) + } + }() + format := ebookFileFormat(path) + switch format { + case ".epub": + book, err = parseEbookEPUB(path) + case ".fb2": + book, err = parseEbookFB2(path) + case ".fbz": + book, err = parseEbookFBZ(path) + case ".cbz": + book, err = parseEbookCBZ(path) + case ".pdf": + book, err = parseEbookPDF(path) + case ".mobi", ".azw", ".azw3", ".cbr": + book = parsedEbook{Format: strings.TrimPrefix(format, ".")} + default: + err = fmt.Errorf("unsupported ebook format: %s", filepath.Ext(path)) + } + book.sanitize() + return book, err +} + +func parseEbookPDF(path string) (parsedEbook, error) { + book := parsedEbook{Format: "pdf"} + file, err := os.Open(path) + if err != nil { + return book, err + } + defer file.Close() + + head, tail, err := readPDFMetadataWindows(file) + if err != nil { + return book, err + } + info := parsePDFInfoFields(head) + // A head match comes from a linearized PDF whose Info dictionary sits at + // the start of the file and is authoritative; non-linearized PDFs (the + // common case) store the Info dictionary near the end and usually have no + // head match at all. The tail therefore only fills keys the head did not + // produce, so key-shaped byte noise inside trailing compressed streams can + // never replace a good head value. + for key, value := range parsePDFInfoFields(tail) { + if value != "" && info[key] == "" { + info[key] = value + } + } + book.Title = info["Title"] + book.Authors = splitEbookAuthors(info["Author"]) + book.Description = info["Subject"] + book.Genres = splitPDFKeywords(info["Keywords"]) + for _, value := range []string{ + info["ISBN"], + info["Subject"], + info["Keywords"], + info["Title"], + } { + if isbn := normalizeEbookISBN(value); isbn != "" { + book.ISBN = isbn + break + } + } + if t, ok := parsePDFDate(info["CreationDate"]); ok { + book.PublishedAt = t + book.Year = t.Year() + } + return book, nil +} + +// readPDFMetadataWindows reads the first and last maxPDFMetadataScanSize bytes +// of the file. The windows never overlap: for files at most one window long +// the tail is nil, and for files shorter than two windows the tail starts +// where the head ends. +func readPDFMetadataWindows(file *os.File) (head []byte, tail []byte, err error) { + head, err = io.ReadAll(io.LimitReader(file, maxPDFMetadataScanSize)) + if err != nil { + return nil, nil, err + } + info, err := file.Stat() + if err != nil { + return nil, nil, err + } + size := info.Size() + if size <= int64(len(head)) { + return head, nil, nil + } + tailStart := size - maxPDFMetadataScanSize + if tailStart < int64(len(head)) { + tailStart = int64(len(head)) + } + tail = make([]byte, size-tailStart) + if _, err := file.ReadAt(tail, tailStart); err != nil { + return nil, nil, err + } + return head, tail, nil +} + +func ebookFileFormat(path string) string { + if strings.HasSuffix(strings.ToLower(path), ".fb2.zip") { + return ".fbz" + } + return strings.ToLower(filepath.Ext(path)) +} + +func (b *parsedEbook) sanitize() { + b.Format = strings.TrimPrefix(strings.ToLower(strings.TrimSpace(b.Format)), ".") + b.Title = strings.TrimSpace(b.Title) + b.Description = cleanEbookDescription(b.Description) + b.Publisher = strings.TrimSpace(b.Publisher) + b.Language = strings.TrimSpace(b.Language) + b.ISBN = normalizeEbookISBN(b.ISBN) + b.Series = strings.TrimSpace(b.Series) + b.SeriesIndex = strings.TrimSpace(b.SeriesIndex) + b.Authors = uniqueTrimmedStrings(b.Authors) + b.Genres = uniqueTrimmedStrings(b.Genres) + if b.PageCount < 0 { + b.PageCount = 0 + } + if b.Year == 0 && !b.PublishedAt.IsZero() { + b.Year = b.PublishedAt.Year() + } +} + +func cleanEbookDescription(value string) string { + value = strings.TrimSpace(html.UnescapeString(value)) + if value == "" { + return "" + } + if !strings.Contains(value, "<") || !strings.Contains(value, ">") { + return strings.Join(strings.Fields(value), " ") + } + + tokenizer := xhtml.NewTokenizer(strings.NewReader(value)) + var out strings.Builder + needsSpace := false + writeSpace := func() { + if out.Len() > 0 && !needsSpace { + needsSpace = true + } + } + for { + switch tokenizer.Next() { + case xhtml.ErrorToken: + return strings.Join(strings.Fields(out.String()), " ") + case xhtml.TextToken: + text := strings.TrimSpace(html.UnescapeString(string(tokenizer.Text()))) + if text == "" { + continue + } + if out.Len() > 0 && (needsSpace || !startsWithClosingPunctuation(text)) { + out.WriteByte(' ') + } + out.WriteString(text) + needsSpace = false + case xhtml.StartTagToken, xhtml.SelfClosingTagToken, xhtml.EndTagToken: + name, _ := tokenizer.TagName() + switch strings.ToLower(string(name)) { + case "br", "p", "div", "section", "article", "li", "ul", "ol", "blockquote", "tr": + writeSpace() + } + } + } +} + +func startsWithClosingPunctuation(value string) bool { + for _, r := range value { + switch r { + case '.', ',', ';', ':', '!', '?', ')', ']', '}': + return true + default: + return false + } + } + return false +} + +func looksLikeHTML(value string) bool { + value = strings.TrimSpace(value) + return strings.Contains(value, "<") && strings.Contains(value, ">") +} + +func uniqueTrimmedStrings(values []string) []string { + seen := map[string]struct{}{} + var out []string + for _, value := range values { + trimmed := strings.TrimSpace(value) + key := strings.ToLower(trimmed) + if key == "" { + continue + } + if _, ok := seen[key]; ok { + continue + } + seen[key] = struct{}{} + out = append(out, trimmed) + } + return out +} + +func normalizeEbookISBN(value string) string { + value = strings.ToUpper(strings.TrimSpace(value)) + for _, prefix := range []string{"ISBN-13", "ISBN-10", "ISBN"} { + if strings.HasPrefix(value, prefix) { + value = strings.TrimSpace(strings.TrimPrefix(value, prefix)) + value = strings.TrimLeft(value, ": ") + break + } + } + var out strings.Builder + for _, r := range value { + if r >= '0' && r <= '9' { + out.WriteRune(r) + continue + } + if r == 'X' { + out.WriteRune(r) + } + } + candidate := out.String() + switch len(candidate) { + case 10: + if validISBN10(candidate) { + return candidate + } + case 13: + if validISBN13(candidate) { + return candidate + } + } + return "" +} + +func validISBN10(candidate string) bool { + if len(candidate) != 10 { + return false + } + sum := 0 + for i, r := range candidate { + value := 0 + switch { + case r >= '0' && r <= '9': + value = int(r - '0') + case r == 'X' && i == 9: + value = 10 + default: + return false + } + sum += value * (10 - i) + } + return sum%11 == 0 +} + +func validISBN13(candidate string) bool { + if len(candidate) != 13 { + return false + } + sum := 0 + for i, r := range candidate { + if r < '0' || r > '9' { + return false + } + value := int(r - '0') + if i%2 == 1 { + value *= 3 + } + sum += value + } + return sum%10 == 0 +} + +func parseEbookEPUB(path string) (parsedEbook, error) { + book := parsedEbook{Format: "epub"} + reader, err := zip.OpenReader(path) + if err != nil { + return book, err + } + defer reader.Close() + + container, err := readEPUBZipEntry(&reader.Reader, "META-INF/container.xml") + if err != nil { + return book, err + } + opfPath, err := epubOPFPath(container) + if err != nil { + return book, err + } + opf, err := readEPUBZipEntry(&reader.Reader, opfPath) + if err != nil { + return book, err + } + if err := parseEPUBOPFMetadata(opf, &book); err != nil { + return book, err + } + if cover, err := extractEPUBCover(&reader.Reader, opfPath, opf); err == nil { + book.Cover = cover + } + return book, nil +} + +func parseEbookFB2(path string) (parsedEbook, error) { + book := parsedEbook{Format: "fb2"} + file, err := os.Open(path) + if err != nil { + return book, err + } + defer file.Close() + // Mirror the .fbz entry cap so a plain .fb2 cannot stream unbounded + // bytes through the XML decoder. + info, err := file.Stat() + if err != nil { + return book, err + } + if info.Size() > maxEPUBMetadataEntrySize { + return book, fmt.Errorf("fb2 file too large: %s", path) + } + return parseEbookFB2Reader(io.LimitReader(file, maxEPUBMetadataEntrySize+1), "fb2") +} + +func parseEbookFBZ(path string) (parsedEbook, error) { + book := parsedEbook{Format: "fbz"} + reader, err := zip.OpenReader(path) + if err != nil { + return book, err + } + defer reader.Close() + + for _, file := range reader.File { + if !strings.HasSuffix(strings.ToLower(file.Name), ".fb2") { + continue + } + if file.UncompressedSize64 > maxEPUBMetadataEntrySize { + return book, fmt.Errorf("fbz entry too large: %s", file.Name) + } + entry, err := file.Open() + if err != nil { + return book, err + } + defer entry.Close() + return parseEbookFB2Reader(io.LimitReader(entry, maxEPUBMetadataEntrySize+1), "fbz") + } + return book, fmt.Errorf("fbz archive has no fb2 entry") +} + +func parseEbookCBZ(path string) (parsedEbook, error) { + book := parsedEbook{Format: "cbz"} + reader, err := zip.OpenReader(path) + if err != nil { + return book, err + } + defer reader.Close() + + var coverPage *zip.File + var coverKey string + for _, file := range reader.File { + if !isComicArchivePage(file.Name) { + continue + } + book.PageCount++ + key := normalizedArchivePath(file.Name) + if coverPage == nil || naturalPathLess(key, coverKey) { + coverPage, coverKey = file, key + } + } + if coverPage != nil { + if cover, err := readArchiveImageCover(coverPage); err == nil { + book.Cover = cover + } + } + return book, nil +} + +// naturalPathLess orders archive entry names case-insensitively with digit +// runs compared numerically, so unpadded page numbers ("2.jpg" before +// "10.jpg") and chapter directories ("ch2/" before "ch10/") sort in reading +// order instead of byte order. +func naturalPathLess(a, b string) bool { + for len(a) > 0 && len(b) > 0 { + if isASCIIDigit(a[0]) && isASCIIDigit(b[0]) { + aRun, aRest := splitDigitRun(a) + bRun, bRest := splitDigitRun(b) + aNum := strings.TrimLeft(aRun, "0") + bNum := strings.TrimLeft(bRun, "0") + if len(aNum) != len(bNum) { + return len(aNum) < len(bNum) + } + if aNum != bNum { + return aNum < bNum + } + a, b = aRest, bRest + continue + } + ar, aSize := utf8.DecodeRuneInString(a) + br, bSize := utf8.DecodeRuneInString(b) + al, bl := unicode.ToLower(ar), unicode.ToLower(br) + if al != bl { + return al < bl + } + a, b = a[aSize:], b[bSize:] + } + return len(a) < len(b) +} + +func isASCIIDigit(b byte) bool { + return b >= '0' && b <= '9' +} + +func splitDigitRun(s string) (run string, rest string) { + i := 0 + for i < len(s) && isASCIIDigit(s[i]) { + i++ + } + return s[:i], s[i:] +} + +func isComicArchivePage(name string) bool { + clean := normalizedArchivePath(name) + if clean == "" || strings.HasSuffix(clean, "/") { + return false + } + base := strings.ToLower(filepath.Base(clean)) + if strings.HasPrefix(base, "._") { + return false + } + parts := strings.Split(strings.ToLower(clean), "/") + for _, part := range parts { + if part == "__macosx" { + return false + } + } + switch filepath.Ext(base) { + case ".jpg", ".jpeg", ".png", ".webp", ".gif", ".avif", ".bmp": + return true + default: + return false + } +} + +func normalizedArchivePath(name string) string { + return strings.TrimSpace(strings.ReplaceAll(name, "\\", "/")) +} + +func readArchiveImageCover(file *zip.File) (*parsedEbookCover, error) { + if file == nil { + return nil, fmt.Errorf("nil archive image") + } + if file.UncompressedSize64 > maxEPUBMetadataEntrySize { + return nil, fmt.Errorf("archive cover entry too large: %s", file.Name) + } + entry, err := file.Open() + if err != nil { + return nil, err + } + defer entry.Close() + data, err := io.ReadAll(io.LimitReader(entry, maxEPUBMetadataEntrySize+1)) + if err != nil { + return nil, err + } + if len(data) > maxEPUBMetadataEntrySize { + return nil, fmt.Errorf("archive cover entry too large: %s", file.Name) + } + if len(data) == 0 { + return nil, fmt.Errorf("archive cover entry empty: %s", file.Name) + } + return &parsedEbookCover{ + ContentType: ebookImageContentType(file.Name), + Bytes: data, + }, nil +} + +func parseEbookFB2Reader(reader io.Reader, format string) (parsedEbook, error) { + book := parsedEbook{Format: format} + var fb2 struct { + Description struct { + TitleInfo struct { + Genres []string `xml:"genre"` + Authors []struct { + FirstName string `xml:"first-name"` + MiddleName string `xml:"middle-name"` + LastName string `xml:"last-name"` + Nickname string `xml:"nickname"` + } `xml:"author"` + BookTitle string `xml:"book-title"` + Lang string `xml:"lang"` + Date struct { + Value string `xml:"value,attr"` + Text string `xml:",chardata"` + } `xml:"date"` + Sequences []struct { + Name string `xml:"name,attr"` + Number string `xml:"number,attr"` + } `xml:"sequence"` + } `xml:"title-info"` + PublishInfo struct { + ISBN string `xml:"isbn"` + Publisher string `xml:"publisher"` + Year string `xml:"year"` + } `xml:"publish-info"` + } `xml:"description"` + } + decoder := xml.NewDecoder(reader) + decoder.CharsetReader = ebookXMLCharsetReader + if err := decoder.Decode(&fb2); err != nil { + return book, err + } + + book.Title = fb2.Description.TitleInfo.BookTitle + book.Language = fb2.Description.TitleInfo.Lang + book.Genres = fb2.Description.TitleInfo.Genres + if t, ok := parseEbookDate(firstNonEmpty(fb2.Description.TitleInfo.Date.Value, fb2.Description.TitleInfo.Date.Text)); ok { + book.PublishedAt = t + } + for _, author := range fb2.Description.TitleInfo.Authors { + name := strings.Join(uniqueTrimmedStrings([]string{ + author.FirstName, + author.MiddleName, + author.LastName, + }), " ") + if name == "" { + name = author.Nickname + } + book.Authors = append(book.Authors, name) + } + if len(fb2.Description.TitleInfo.Sequences) > 0 { + book.Series = fb2.Description.TitleInfo.Sequences[0].Name + book.SeriesIndex = fb2.Description.TitleInfo.Sequences[0].Number + } + book.ISBN = fb2.Description.PublishInfo.ISBN + book.Publisher = fb2.Description.PublishInfo.Publisher + if year, err := strconv.Atoi(strings.TrimSpace(fb2.Description.PublishInfo.Year)); err == nil { + book.Year = year + } + return book, nil +} + +func parsePDFInfoFields(data []byte) map[string]string { + fields := map[string]string{} + for _, key := range []string{"Title", "Author", "Subject", "Keywords", "CreationDate", "ISBN"} { + if value, ok := findPDFInfoValue(data, key); ok { + fields[key] = value + } + } + return fields +} + +// pdfWhitespace is the PDF whitespace character set (ISO 32000-1, table 1). +const pdfWhitespace = "\x00\t\n\f\r " + +// isPDFTokenDelimiter reports whether b legally terminates a PDF name token. +// Without this check a key with a shared prefix (e.g. "/TitleSort") would be +// mistaken for the key itself (e.g. "/Title"). +func isPDFTokenDelimiter(b byte) bool { + switch b { + case '\x00', '\t', '\n', '\f', '\r', ' ', '(', ')', '<', '>', '[', ']', '{', '}', '/', '%': + return true + default: + return false + } +} + +// findPDFInfoValue scans every occurrence of "/" in the window and +// returns the first whose token is properly delimited and whose value parses +// as a PDF string. Raw byte search can match key-shaped noise inside +// compressed streams, so a failed parse moves on to the next occurrence +// instead of giving up. +func findPDFInfoValue(data []byte, key string) (string, bool) { + token := []byte("/" + key) + for offset := 0; offset < len(data); { + idx := bytes.Index(data[offset:], token) + if idx < 0 { + return "", false + } + idx += offset + offset = idx + len(token) + rest := data[idx+len(token):] + if len(rest) == 0 { + return "", false + } + if !isPDFTokenDelimiter(rest[0]) { + continue + } + trimmed := bytes.TrimLeft(rest, pdfWhitespace) + if len(trimmed) == 0 { + return "", false + } + if value, ok := readPDFString(trimmed); ok { + return value, true + } + } + return "", false +} + +func decodeEbookXML(data []byte, v any) error { + data = normalizeEbookXMLVersion(data) + decoder := xml.NewDecoder(bytes.NewReader(data)) + decoder.CharsetReader = ebookXMLCharsetReader + return decoder.Decode(v) +} + +func normalizeEbookXMLVersion(data []byte) []byte { + for _, needle := range []string{`version="1.1"`, `version='1.1'`} { + idx := bytes.Index(data, []byte(needle)) + if idx < 0 || idx > 128 { + continue + } + out := append([]byte(nil), data...) + copy(out[idx:], strings.Replace(needle, "1.1", "1.0", 1)) + return out + } + return data +} + +func ebookXMLCharsetReader(label string, input io.Reader) (io.Reader, error) { + name := strings.ToLower(strings.TrimSpace(label)) + if name == "" || name == "utf-8" || name == "utf8" { + return input, nil + } + reader, err := charset.NewReaderLabel(name, input) + if err != nil { + return nil, fmt.Errorf("unsupported ebook XML encoding %q: %w", label, err) + } + return reader, nil +} + +func readPDFString(data []byte) (string, bool) { + switch data[0] { + case '(': + return readPDFLiteralString(data) + case '<': + if len(data) > 1 && data[1] == '<' { + return "", false + } + return readPDFHexString(data) + default: + return "", false + } +} + +func readPDFLiteralString(data []byte) (string, bool) { + if len(data) == 0 || data[0] != '(' { + return "", false + } + var out []byte + depth := 1 + escaped := false + for _, b := range data[1:] { + if escaped { + switch b { + case 'n': + out = append(out, '\n') + case 'r': + out = append(out, '\r') + case 't': + out = append(out, '\t') + case 'b': + out = append(out, '\b') + case 'f': + out = append(out, '\f') + default: + out = append(out, b) + } + escaped = false + continue + } + switch b { + case '\\': + escaped = true + case '(': + depth++ + out = append(out, b) + case ')': + depth-- + if depth == 0 { + return strings.TrimSpace(decodePDFLiteralBytes(out)), true + } + out = append(out, b) + default: + out = append(out, b) + } + } + return "", false +} + +func readPDFHexString(data []byte) (string, bool) { + if len(data) == 0 || data[0] != '<' { + return "", false + } + end := bytes.IndexByte(data[1:], '>') + if end < 0 { + return "", false + } + raw := data[1 : end+1] + var cleaned []byte + for _, b := range raw { + switch { + case b == ' ' || b == '\t' || b == '\r' || b == '\n': + continue + case (b >= '0' && b <= '9') || (b >= 'a' && b <= 'f') || (b >= 'A' && b <= 'F'): + cleaned = append(cleaned, b) + default: + return "", false + } + } + if len(cleaned)%2 == 1 { + cleaned = append(cleaned, '0') + } + decoded := make([]byte, hex.DecodedLen(len(cleaned))) + if _, err := hex.Decode(decoded, cleaned); err != nil { + return "", false + } + return strings.TrimSpace(decodePDFLiteralBytes(decoded)), true +} + +func decodePDFLiteralBytes(data []byte) string { + if len(data) == 0 { + return "" + } + switch { + case bytes.HasPrefix(data, []byte{0xfe, 0xff}): + if decoded, err := textunicode.UTF16(textunicode.BigEndian, textunicode.ExpectBOM).NewDecoder().Bytes(data); err == nil { + return string(decoded) + } + case bytes.HasPrefix(data, []byte{0xff, 0xfe}): + if decoded, err := textunicode.UTF16(textunicode.LittleEndian, textunicode.ExpectBOM).NewDecoder().Bytes(data); err == nil { + return string(decoded) + } + } + // The PDF spec says non-UTF-16 strings are PDFDocEncoding, but real-world + // producers commonly emit UTF-8 (PDF 2.0 even allows a UTF-8 BOM). Only + // fall back to the Windows-1252 approximation for non-UTF-8 bytes so + // UTF-8 metadata is not mojibaked. + data = bytes.TrimPrefix(data, []byte{0xef, 0xbb, 0xbf}) + if utf8.Valid(data) { + return string(data) + } + if decoded, err := charmap.Windows1252.NewDecoder().Bytes(data); err == nil { + return string(decoded) + } + return strings.ToValidUTF8(string(data), "") +} + +func splitEbookAuthors(value string) []string { + value = strings.TrimSpace(value) + if value == "" { + return nil + } + parts := strings.FieldsFunc(value, func(r rune) bool { + return r == ';' || r == '|' + }) + if len(parts) == 1 { + parts = strings.Split(value, " and ") + } + return uniqueTrimmedStrings(parts) +} + +func splitPDFKeywords(value string) []string { + if strings.TrimSpace(value) == "" { + return nil + } + return uniqueTrimmedStrings(strings.FieldsFunc(value, func(r rune) bool { + return r == ',' || r == ';' + })) +} + +func parsePDFDate(value string) (time.Time, bool) { + value = strings.TrimSpace(value) + if strings.HasPrefix(value, "D:") { + value = strings.TrimPrefix(value, "D:") + } + value = strings.TrimSuffix(value, "Z") + if len(value) >= 14 { + if t, err := time.Parse("20060102150405", value[:14]); err == nil && t.Year() > 0 { + return t, true + } + } + if len(value) >= 8 { + if t, err := time.Parse("20060102", value[:8]); err == nil && t.Year() > 0 { + return t, true + } + } + if len(value) >= 4 { + if t, err := time.Parse("2006", value[:4]); err == nil && t.Year() > 0 { + return t, true + } + } + return time.Time{}, false +} + +func readEPUBZipEntry(reader *zip.Reader, name string) ([]byte, error) { + for _, file := range reader.File { + if file.Name != name { + continue + } + entry, err := file.Open() + if err != nil { + return nil, err + } + defer entry.Close() + limited := io.LimitReader(entry, maxEPUBMetadataEntrySize+1) + data, err := io.ReadAll(limited) + if err != nil { + return nil, err + } + if len(data) > maxEPUBMetadataEntrySize { + return nil, fmt.Errorf("epub entry too large: %s", name) + } + return data, nil + } + return nil, fmt.Errorf("epub entry not found: %s", name) +} + +func epubOPFPath(container []byte) (string, error) { + var parsed struct { + Rootfiles []struct { + FullPath string `xml:"full-path,attr"` + } `xml:"rootfiles>rootfile"` + } + if err := decodeEbookXML(container, &parsed); err != nil { + return "", err + } + for _, rootfile := range parsed.Rootfiles { + if strings.TrimSpace(rootfile.FullPath) != "" { + return rootfile.FullPath, nil + } + } + return "", fmt.Errorf("epub container has no rootfile") +} + +func parseEPUBOPFMetadata(opf []byte, book *parsedEbook) error { + var parsed struct { + Metadata struct { + Titles []string `xml:"title"` + Creators []string `xml:"creator"` + Identifiers []string `xml:"identifier"` + Publisher string `xml:"publisher"` + Dates []string `xml:"date"` + Language string `xml:"language"` + Subjects []string `xml:"subject"` + Descriptions []string `xml:"description"` + Meta []struct { + Name string `xml:"name,attr"` + Property string `xml:"property,attr"` + Content string `xml:"content,attr"` + Value string `xml:",chardata"` + } `xml:"meta"` + } `xml:"metadata"` + } + if err := decodeEbookXML(opf, &parsed); err != nil { + return err + } + book.Title = firstNonEmpty(parsed.Metadata.Titles...) + book.Authors = append(book.Authors, parsed.Metadata.Creators...) + book.Publisher = parsed.Metadata.Publisher + book.Language = parsed.Metadata.Language + book.Genres = append(book.Genres, parsed.Metadata.Subjects...) + book.Description = firstNonEmpty(parsed.Metadata.Descriptions...) + for _, identifier := range parsed.Metadata.Identifiers { + if isbn := normalizeEbookISBN(identifier); isbn != "" { + book.ISBN = isbn + break + } + } + for _, date := range parsed.Metadata.Dates { + if t, ok := parseEbookDate(date); ok { + book.PublishedAt = t + book.Year = t.Year() + break + } + } + for _, meta := range parsed.Metadata.Meta { + name := strings.ToLower(strings.TrimSpace(firstNonEmpty(meta.Name, meta.Property))) + value := strings.TrimSpace(firstNonEmpty(meta.Content, meta.Value)) + switch name { + case "calibre:series", "belongs-to-collection": + book.Series = value + case "calibre:series_index", "group-position": + book.SeriesIndex = value + case "calibre:isbn", "isbn", "schema:isbn": + if book.ISBN == "" { + book.ISBN = normalizeEbookISBN(value) + } + } + } + return nil +} + +func extractEPUBCover(reader *zip.Reader, opfPath string, opf []byte) (*parsedEbookCover, error) { + var parsed struct { + Metadata struct { + Meta []struct { + Name string `xml:"name,attr"` + Content string `xml:"content,attr"` + } `xml:"meta"` + } `xml:"metadata"` + Manifest struct { + Items []struct { + ID string `xml:"id,attr"` + Href string `xml:"href,attr"` + MediaType string `xml:"media-type,attr"` + Properties string `xml:"properties,attr"` + } `xml:"item"` + } `xml:"manifest"` + } + if err := decodeEbookXML(opf, &parsed); err != nil { + return nil, err + } + + coverID := "" + for _, meta := range parsed.Metadata.Meta { + if strings.EqualFold(strings.TrimSpace(meta.Name), "cover") { + coverID = strings.TrimSpace(meta.Content) + break + } + } + + // An EPUB3 properties="cover-image" item is authoritative; the EPUB2 + // id frequently points at the XHTML cover *page* + // rather than the image, so it ranks lower and non-image manifest items + // are skipped entirely instead of shadowing a later real cover image. + var coverHref string + var coverType string + coverRank := 0 + for _, item := range parsed.Manifest.Items { + rank := 0 + for _, prop := range strings.Fields(strings.ToLower(item.Properties)) { + if prop == "cover-image" { + rank = 2 + break + } + } + if rank == 0 && coverID != "" && strings.TrimSpace(item.ID) == coverID { + rank = 1 + } + if rank <= coverRank || !isEPUBImageManifestItem(item.MediaType, item.Href) { + continue + } + coverHref = strings.TrimSpace(item.Href) + coverType = strings.TrimSpace(item.MediaType) + coverRank = rank + if coverRank == 2 { + break + } + } + if coverHref == "" { + return nil, fmt.Errorf("epub cover not referenced") + } + + coverPath := resolveEPUBRelativePath(opfPath, coverHref) + data, err := readEPUBZipEntry(reader, coverPath) + if err != nil { + return nil, err + } + if coverType == "" { + coverType = ebookImageContentType(coverPath) + } + return &parsedEbookCover{ContentType: coverType, Bytes: data}, nil +} + +func isEPUBImageManifestItem(mediaType, href string) bool { + mt := strings.ToLower(strings.TrimSpace(mediaType)) + if mt != "" { + return strings.HasPrefix(mt, "image/") + } + return ebookImageContentType(href) != "application/octet-stream" +} + +func resolveEPUBRelativePath(baseFile string, href string) string { + cleanHref := strings.TrimSpace(href) + if decoded, err := urlPathUnescape(cleanHref); err == nil { + cleanHref = decoded + } + baseDir := path.Dir(strings.ReplaceAll(baseFile, "\\", "/")) + if baseDir == "." || strings.HasPrefix(cleanHref, "/") { + baseDir = "" + } + return strings.TrimPrefix(path.Clean(path.Join(baseDir, cleanHref)), "/") +} + +func urlPathUnescape(value string) (string, error) { + var out strings.Builder + for i := 0; i < len(value); i++ { + if value[i] != '%' || i+2 >= len(value) { + out.WriteByte(value[i]) + continue + } + hi := fromHex(value[i+1]) + lo := fromHex(value[i+2]) + if hi < 0 || lo < 0 { + out.WriteByte(value[i]) + continue + } + out.WriteByte(byte(hi<<4 | lo)) + i += 2 + } + return out.String(), nil +} + +func fromHex(b byte) int { + switch { + case b >= '0' && b <= '9': + return int(b - '0') + case b >= 'a' && b <= 'f': + return int(b-'a') + 10 + case b >= 'A' && b <= 'F': + return int(b-'A') + 10 + default: + return -1 + } +} + +func ebookImageContentType(name string) string { + switch strings.ToLower(filepath.Ext(name)) { + case ".jpg", ".jpeg": + return "image/jpeg" + case ".png": + return "image/png" + case ".webp": + return "image/webp" + case ".gif": + return "image/gif" + case ".avif": + return "image/avif" + case ".bmp": + return "image/bmp" + default: + return "application/octet-stream" + } +} + +func parseEbookDate(value string) (time.Time, bool) { + value = strings.TrimSpace(value) + for _, layout := range []string{"2006-01-02", "2006-01", "2006"} { + if t, err := time.Parse(layout, value); err == nil { + return t, true + } + } + return time.Time{}, false +} diff --git a/internal/scanner/ebook_scan.go b/internal/scanner/ebook_scan.go new file mode 100644 index 00000000..ea560edc --- /dev/null +++ b/internal/scanner/ebook_scan.go @@ -0,0 +1,1345 @@ +package scanner + +import ( + "context" + "errors" + "fmt" + "io" + "log/slog" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + "unicode" + + "github.com/Silo-Server/silo-server/internal/idgen" + "github.com/Silo-Server/silo-server/internal/imageutil" + "github.com/Silo-Server/silo-server/internal/models" + "github.com/Silo-Server/silo-server/internal/titleutil" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type ebookSQLExecutor interface { + Exec(ctx context.Context, sql string, arguments ...any) (pgconn.CommandTag, error) +} + +type filesystemMediaItemReader interface { + GetByIDs(ctx context.Context, ids []string) ([]*models.MediaItem, error) +} + +func ebookScanWorkers() int { + if v := os.Getenv("SILO_EBOOK_SCAN_WORKERS"); v != "" { + if n, err := strconv.Atoi(v); err == nil && n > 0 { + return n + } + } + return audiobookScanWorkers() +} + +func (s *Scanner) ScanEbookFolder(ctx context.Context, folder *models.MediaFolder) error { + if s == nil || folder == nil { + return fmt.Errorf("ScanEbookFolder: nil scanner or folder") + } + return s.scanEbookPaths(ctx, folder, folder.Paths, true) +} + +// ebookRootScan captures the walk outcome for one configured library root. +type ebookRootScan struct { + root string + files []string + rootErr error // root stat failed, or the root is not a directory + walkFailures int // entries within the subtree the walk could not read or resolve +} + +// failed reports whether the walk under this root is known to be incomplete. +// Files found under a failed root are still indexed, but the root is excluded +// from missing-file reconciliation: a transient mount/permission problem (or +// a mid-walk subtree error) must not cascade into marking — and, with +// empty_trash_after_scan, deleting — everything under it. +func (r *ebookRootScan) failed() bool { + return r.rootErr != nil || r.walkFailures > 0 +} + +// collectEbookRootScans walks every configured root with the shared +// logical-tree walker (so symlinked roots and symlinked subdirectories +// resolve and scan exactly like the video pipeline) and records per-root walk +// failures. The only error returned is context cancellation. +func collectEbookRootScans(ctx context.Context, folderID int, roots []string) ([]ebookRootScan, error) { + scans := make([]ebookRootScan, 0, len(roots)) + visitedPhysicalDirs := make(map[string]struct{}) + for _, root := range roots { + if err := ctx.Err(); err != nil { + return nil, err + } + cleanRoot := filepath.Clean(strings.TrimSpace(root)) + if cleanRoot == "" || cleanRoot == "." { + continue + } + scan := ebookRootScan{root: cleanRoot} + info, statErr := os.Stat(cleanRoot) + switch { + case statErr != nil: + // Unmounted/missing/permission-broken root: failed, not empty. + scan.rootErr = fmt.Errorf("stat root: %w", statErr) + case !info.IsDir(): + scan.rootErr = fmt.Errorf("root is not a directory after symlink resolution") + } + if statErr == nil { + if err := walkLogicalTree(ctx, cleanRoot, cleanRoot, walkModeEbook, visitedPhysicalDirs, &scan.files, &scan.walkFailures); err != nil { + return nil, err + } + } + if scan.failed() { + slog.Warn("ebook scan: root walk incomplete; root excluded from missing-file reconciliation", + "folder_id", folderID, + "root", cleanRoot, + "walk_failures", scan.walkFailures, + "error", scan.rootErr, + ) + } + scans = append(scans, scan) + } + return scans, nil +} + +// splitEbookReconcileRoots partitions walked roots into the set that may take +// part in missing-file reconciliation and reports whether any reconcilable +// root saw at least one ebook on disk. +func splitEbookReconcileRoots(scans []ebookRootScan) (reconcileRoots []string, sawFiles bool) { + reconcileRoots = make([]string, 0, len(scans)) + for i := range scans { + scan := &scans[i] + if scan.failed() { + continue + } + if len(scan.files) > 0 { + sawFiles = true + } + reconcileRoots = append(reconcileRoots, scan.root) + } + return reconcileRoots, sawFiles +} + +func (s *Scanner) scanEbookPaths(ctx context.Context, folder *models.MediaFolder, roots []string, fullScan bool) error { + if s == nil || folder == nil { + return fmt.Errorf("scanEbookPaths: nil scanner or folder") + } + scans, err := collectEbookRootScans(ctx, folder.ID, roots) + if err != nil { + return err + } + // Every discovered file is indexed, including files under roots whose + // walk partially failed: indexing is additive and safe, only the + // destructive reconciliation below is restricted to cleanly walked roots. + var candidates []string + for i := range scans { + candidates = append(candidates, scans[i].files...) + } + + if len(candidates) == 0 { + return s.reconcileEbookScan(ctx, folder, scans, nil, fullScan) + } + + workers := ebookScanWorkers() + slog.Info("ebook scan: starting", + "folder_id", folder.ID, + "candidates", len(candidates), + "workers", workers, + ) + reportEbookScanProgress(ctx, folder.ID, len(candidates), 0, 0, 0) + + ch := make(chan string, workers*2) + groupLocks := newEbookGroupLocks() + var ( + wg sync.WaitGroup + processed int64 + failed int64 + skipped int64 + failMu sync.Mutex + failures []error + cancelErr error + ) + start := time.Now() + for i := 0; i < workers; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for path := range ch { + if ctx.Err() != nil { + return + } + if err := s.reconcileEbookFile(ctx, folder, path, &skipped, groupLocks); err != nil { + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + failMu.Lock() + if cancelErr == nil { + cancelErr = err + } + failMu.Unlock() + return + } + atomic.AddInt64(&failed, 1) + failMu.Lock() + failures = append(failures, fmt.Errorf("%s: %w", path, err)) + failMu.Unlock() + slog.Warn("ebook scan: file failed", + "folder_id", folder.ID, + "path", path, + "error", err, + ) + } + n := atomic.AddInt64(&processed, 1) + if n%500 == 0 || n == int64(len(candidates)) { + failedCount := atomic.LoadInt64(&failed) + skippedCount := atomic.LoadInt64(&skipped) + slog.Info("ebook scan: progress", + "folder_id", folder.ID, + "processed", n, + "failed", failedCount, + "skipped", skippedCount, + "total", len(candidates), + "elapsed_sec", int(time.Since(start).Seconds()), + ) + reportEbookScanProgress(ctx, folder.ID, len(candidates), int(n), int(failedCount), int(skippedCount)) + } + } + }() + } + + for _, p := range candidates { + select { + case ch <- p: + case <-ctx.Done(): + close(ch) + wg.Wait() + return ctx.Err() + } + } + close(ch) + wg.Wait() + if err := ctx.Err(); err != nil { + return err + } + if cancelErr != nil { + return cancelErr + } + + slog.Info("ebook scan: completed", + "folder_id", folder.ID, + "processed", atomic.LoadInt64(&processed), + "failed", atomic.LoadInt64(&failed), + "skipped", atomic.LoadInt64(&skipped), + "elapsed_sec", int(time.Since(start).Seconds()), + ) + if processedCount := atomic.LoadInt64(&processed); processedCount > 0 { + failedCount := atomic.LoadInt64(&failed) + skippedCount := atomic.LoadInt64(&skipped) + if failedCount > 0 && skippedCount == 0 && failedCount == processedCount { + return fmt.Errorf("ebook scan failed for every attempted folder_id=%d: %w", folder.ID, errors.Join(failures...)) + } + } + + seenPaths := make(map[string]bool, len(candidates)) + for _, p := range candidates { + seenPaths[p] = true + } + return s.reconcileEbookScan(ctx, folder, scans, seenPaths, fullScan) +} + +// ebookCleanupGuardRepo is the slice of catalog.FolderRepository the +// empty-root cleanup guard needs. +type ebookCleanupGuardRepo interface { + ConsumeEmptyCleanupAllowance(ctx context.Context, id int) (bool, error) + SetScanWarning(ctx context.Context, id int, code, message string, warnedAt time.Time) error +} + +// ebookEmptyCleanupAllowed mirrors the video pipeline's empty-root guard: a +// scan that saw zero ebooks while the DB still has rows under the scanned +// roots may only reconcile (and therefore delete) when the operator has +// explicitly confirmed the cleanup. Subtree scans never consume the +// folder-level allowance; the next full scan converges them. +func ebookEmptyCleanupAllowed(ctx context.Context, repo ebookCleanupGuardRepo, folderID int, fullScan bool) (bool, error) { + if !fullScan || repo == nil { + return false, nil + } + allowed, err := repo.ConsumeEmptyCleanupAllowance(ctx, folderID) + if err != nil { + return false, fmt.Errorf("checking empty cleanup confirmation for folder %d: %w", folderID, err) + } + if !allowed { + if err := repo.SetScanWarning(ctx, folderID, + "empty_root", + "Scan found 0 media files; cleanup was skipped until deletion is confirmed.", + time.Now().UTC(), + ); err != nil { + return false, fmt.Errorf("recording empty-root warning for folder %d: %w", folderID, err) + } + } + return allowed, nil +} + +// reconcileEbookScan applies the post-walk safety policy and then performs +// missing-file reconciliation for the roots that walked cleanly. +func (s *Scanner) reconcileEbookScan(ctx context.Context, folder *models.MediaFolder, scans []ebookRootScan, seenPaths map[string]bool, fullScan bool) error { + reconcileRoots, sawFiles := splitEbookReconcileRoots(scans) + if len(reconcileRoots) == 0 { + if len(scans) > 0 { + slog.Warn("ebook scan: every root walk failed; skipping missing-file reconciliation", + "folder_id", folder.ID, + ) + } + return nil + } + if s.fileRepo == nil || s.libraryRepo == nil { + return nil + } + + if !sawFiles { + existingCount := 0 + for _, root := range reconcileRoots { + existing, err := s.fileRepo.GetByFolderAndPathPrefix(ctx, folder.ID, root) + if err != nil { + return fmt.Errorf("listing existing ebook files for %q: %w", root, err) + } + existingCount += len(existing) + } + if existingCount > 0 { + var guard ebookCleanupGuardRepo + if s.folderRepo != nil { + guard = s.folderRepo + } + allowed, err := ebookEmptyCleanupAllowed(ctx, guard, folder.ID, fullScan) + if err != nil { + return err + } + if !allowed { + slog.Warn("ebook scan: walk saw zero ebooks but the database has files under the scanned roots; skipping reconciliation until cleanup is confirmed", + "folder_id", folder.ID, + "existing_files", existingCount, + "full_scan", fullScan, + ) + return nil + } + } + } + + if err := s.reconcileMissingEbookFiles(ctx, folder, reconcileRoots, seenPaths); err != nil { + return err + } + if fullScan && s.folderRepo != nil { + // The cleanup either ran with files present or was explicitly + // confirmed; any prior empty-root warning is stale now. + if err := s.folderRepo.ClearScanWarning(ctx, folder.ID); err != nil { + return fmt.Errorf("clearing scan warning for folder %d: %w", folder.ID, err) + } + } + return nil +} + +// reconcileMissingEbookFiles mirrors the video/audio scan cleanup: DB files +// under the scanned roots that were not seen on disk are marked missing, the +// folder trash is optionally emptied, and library memberships are reconciled +// so items with no remaining files are removed (renames therefore converge on +// the newly indexed path instead of leaving a stale duplicate item). +func (s *Scanner) reconcileMissingEbookFiles(ctx context.Context, folder *models.MediaFolder, roots []string, seenPaths map[string]bool) error { + if s.fileRepo == nil || s.libraryRepo == nil || len(roots) == 0 { + return nil + } + + now := time.Now().UTC() + missing := 0 + for _, root := range roots { + existing, err := s.fileRepo.GetByFolderAndPathPrefix(ctx, folder.ID, root) + if err != nil { + return fmt.Errorf("listing existing ebook files for %q: %w", root, err) + } + for _, mf := range existing { + if mf == nil || seenPaths[mf.FilePath] { + continue + } + if mf.MissingSince == nil { + if err := s.fileRepo.MarkMissing(ctx, mf.ID, now); err != nil { + slog.Error("ebook scan: failed to mark file missing", + "folder_id", folder.ID, + "path", mf.FilePath, + "error", err, + ) + continue + } + } + missing++ + } + } + + if s.emptyTrashAfterScan { + trashed, err := s.fileRepo.DeleteMissingByFolder(ctx, folder.ID) + if err != nil { + return fmt.Errorf("emptying trash for folder %d: %w", folder.ID, err) + } + if trashed > 0 { + slog.Info("ebook scan: emptied trash", "folder_id", folder.ID, "deleted", trashed) + } + } + + removedMemberships, deletedItems, orphanedImageDirs, err := s.reconcileLibraryMemberships(ctx, folder.ID) + if err != nil { + return fmt.Errorf("reconciling library membership for folder %d: %w", folder.ID, err) + } + + // Best-effort S3 image cleanup for orphaned items. + if s.s3Client != nil && len(orphanedImageDirs) > 0 { + bucket := s.s3Client.Bucket() + for _, dir := range orphanedImageDirs { + _, _ = s.s3Client.DeletePrefix(ctx, bucket, dir) + } + } + + if missing > 0 || removedMemberships > 0 || deletedItems > 0 { + slog.Info("ebook scan: reconciled missing files", + "folder_id", folder.ID, + "missing", missing, + "memberships_removed", removedMemberships, + "items_deleted", deletedItems, + ) + } + return nil +} + +func reportEbookScanProgress(ctx context.Context, folderID int, total, processed, failed, skipped int) { + reportProgress(ctx, ProgressUpdate{ + Phase: "ebook_scan", + Message: fmt.Sprintf("Scanning ebooks in folder %d", folderID), + CurrentScope: strconv.Itoa(folderID), + TotalFiles: total, + FilesDiscovered: total, + FilesProcessed: processed, + Errors: failed, + Unchanged: skipped, + }) +} + +func (s *Scanner) reconcileEbookFile(ctx context.Context, folder *models.MediaFolder, filePath string, skipped *int64, groupLocks *ebookGroupLocks) error { + info, err := os.Stat(filePath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil + } + return fmt.Errorf("stat ebook file %s: %w", filePath, err) + } + size := info.Size() + modifiedAt := normalizeFileModifiedAt(info.ModTime()) + + isUnchanged, skipErr := s.ebookFileShouldSkip(ctx, folder, filePath, size, modifiedAt) + if skipErr != nil { + slog.Warn("ebook scan: skip-check failed, falling through", + "folder_id", folder.ID, + "path", filePath, + "error", skipErr, + ) + } else if isUnchanged { + atomic.AddInt64(skipped, 1) + return nil + } + + parsed, err := parseEbookFile(filePath) + if err != nil { + return fmt.Errorf("parse ebook file %s: %w", filePath, err) + } + if parsed.Title == "" { + parsed.Title = ebookTitleFromPath(filePath) + } + + groupKey := ebookContentGroupKey(&parsed, filePath) + unlock := groupLocks.lock(groupKey) + defer unlock() + + contentID, curated, err := s.upsertEbookMediaItem(ctx, folder.ID, filePath, &parsed, groupKey) + if err != nil { + return fmt.Errorf("upsert ebook item: %w", err) + } + if err := s.upsertEbookMediaFile(ctx, folder, contentID, filePath, size, modifiedAt, &parsed, groupKey); err != nil { + return fmt.Errorf("upsert ebook file: %w", err) + } + if err := applyEbookLocalCover(ctx, s.itemRepo, s.imageCacher, contentID, filePath, &parsed); err != nil { + slog.Warn("ebook scan: local cover upload failed", + "folder_id", folder.ID, + "content_id", contentID, + "path", filePath, + "error", err, + ) + } + if err := s.upsertEbookPeople(ctx, contentID, &parsed, curated); err != nil { + return fmt.Errorf("upsert ebook people: %w", err) + } + if err := s.upsertEbookSeries(ctx, contentID, &parsed, curated); err != nil { + return fmt.Errorf("upsert ebook series: %w", err) + } + if err := insertEbookLibraryMembership(ctx, s.fileRepo.Pool(), contentID, folder.ID); err != nil { + return fmt.Errorf("upsert ebook library membership: %w", err) + } + if parsed.ISBN != "" { + if err := insertEbookISBNProviderID(ctx, s.fileRepo.Pool(), contentID, parsed.ISBN); err != nil { + return fmt.Errorf("upsert ebook ISBN provider id: %w", err) + } + } + slog.Info("ebook scan: indexed", + "folder_id", folder.ID, + "content_id", contentID, + "title", parsed.Title, + "authors", parsed.Authors, + "path", filePath, + ) + return nil +} + +func (s *Scanner) ebookFileShouldSkip(ctx context.Context, folder *models.MediaFolder, filePath string, size int64, modifiedAt time.Time) (bool, error) { + if s.fileRepo == nil || s.itemRepo == nil { + return false, nil + } + existing, err := s.fileRepo.ListByObservedRootPath(ctx, folder.ID, filePath) + if err != nil { + return false, fmt.Errorf("list existing files: %w", err) + } + if len(existing) != 1 { + return false, nil + } + mf := existing[0] + if mf.FilePath != filePath || mf.FileSize != size || mf.FileModifiedAt == nil || !sameFileModifiedAt(mf.FileModifiedAt, modifiedAt) { + return false, nil + } + if mf.ContentID == "" { + return false, nil + } + if mf.GroupKeyVersion != ebookGroupKeyVersion { + // The grouping scheme changed since this row was written; reprocess + // once so the stored key is rewritten under the current scheme and + // sibling-format lookups can find it again. + return false, nil + } + statuses, err := s.itemRepo.GetStatusByIDs(ctx, []string{mf.ContentID}) + if err != nil { + return false, fmt.Errorf("get item status: %w", err) + } + return !strings.EqualFold(strings.TrimSpace(statuses[mf.ContentID]), "unmatched"), nil +} + +// upsertEbookMediaItem resolves or creates the media item for the file and +// reports whether the item's metadata is curated (provider-matched), in which +// case dependent writes (people, series) must be fill-empty only. +func (s *Scanner) upsertEbookMediaItem(ctx context.Context, folderID int, filePath string, book *parsedEbook, groupKey string) (string, bool, error) { + if s.itemRepo == nil { + return "", false, fmt.Errorf("itemRepo not configured on Scanner") + } + if s.fileRepo == nil { + return "", false, fmt.Errorf("fileRepo not configured on Scanner") + } + + existingID, err := s.fileRepo.FindContentIDByRootPath(ctx, folderID, filePath, "ebook") + if err != nil { + return "", false, fmt.Errorf("find ebook by root path: %w", err) + } + if existingID != "" { + curated, err := updateExistingEbookMediaItem(ctx, s.itemRepo, s.itemRepo, existingID, book) + if err != nil { + return "", false, err + } + return existingID, curated, nil + } + if existing := s.findEbookByFilePath(ctx, filePath); existing != nil { + if ebookItemHasCuratedMetadata(existing) { + return existing.ContentID, true, nil + } + applyEbookToMediaItem(existing, book) + if existing.SortTitle == "" { + existing.SortTitle = titleutil.DeriveDefaultSortTitle(existing.Title) + } + if err := s.itemRepo.Upsert(ctx, existing); err != nil { + return "", false, err + } + return existing.ContentID, false, nil + } + if existing := s.findEbookByContentGroupKey(ctx, folderID, groupKey, book.Format, filePath); existing != nil { + // The sibling file joins the group either way, but curated metadata + // on a provider-matched item must not be clobbered by whatever this + // file happens to embed. + if ebookItemHasCuratedMetadata(existing) { + return existing.ContentID, true, nil + } + applyEbookToMediaItem(existing, book) + if existing.SortTitle == "" { + existing.SortTitle = titleutil.DeriveDefaultSortTitle(existing.Title) + } + if err := s.itemRepo.Upsert(ctx, existing); err != nil { + return "", false, err + } + return existing.ContentID, false, nil + } + contentID, err := resolveEbookMediaItem(ctx, s.fileRepo, s.itemRepo, folderID, filePath, book) + if err != nil { + return "", false, err + } + return contentID, false, nil +} + +func resolveEbookMediaItem( + ctx context.Context, + rootFinder filesystemRootContentFinder, + itemWriter filesystemMediaItemWriter, + folderID int, + filePath string, + book *parsedEbook, +) (string, error) { + if rootFinder == nil { + return "", fmt.Errorf("root content finder not configured") + } + if itemWriter == nil { + return "", fmt.Errorf("media item writer not configured") + } + existingID, err := rootFinder.FindContentIDByRootPath(ctx, folderID, filePath, "ebook") + if err != nil { + return "", fmt.Errorf("find ebook by root path: %w", err) + } + if existingID != "" { + return existingID, nil + } + + cleanTitle := strings.TrimSpace(book.Title) + if cleanTitle == "" { + cleanTitle = ebookTitleFromPath(filePath) + } + return createEbookMediaItem(ctx, itemWriter, book, cleanTitle) +} + +func createEbookMediaItem(ctx context.Context, itemWriter filesystemMediaItemWriter, book *parsedEbook, cleanTitle string) (string, error) { + id, err := idgen.NextID() + if err != nil { + return "", fmt.Errorf("generate content_id: %w", err) + } + item := &models.MediaItem{ + ContentID: id, + Type: "ebook", + // Explicit "pending" (the item upsert writes the literal status, so the + // DB default never applies): enrichment promotes it to "matched", which + // arms ebookItemHasCuratedMetadata against file-metadata clobbering. + Status: "pending", + Title: cleanTitle, + SortTitle: titleutil.DeriveDefaultSortTitle(cleanTitle), + Year: book.Year, + } + applyEbookToMediaItem(item, book) + if item.SortTitle == "" { + item.SortTitle = titleutil.DeriveDefaultSortTitle(item.Title) + } + if err := itemWriter.Upsert(ctx, item); err != nil { + return "", err + } + return id, nil +} + +// updateExistingEbookMediaItem refreshes a known item from file metadata and +// reports whether the item's metadata is curated (and was therefore left +// untouched). +func updateExistingEbookMediaItem(ctx context.Context, itemReader filesystemMediaItemReader, itemWriter filesystemMediaItemWriter, contentID string, book *parsedEbook) (bool, error) { + if itemReader == nil { + return false, fmt.Errorf("media item reader not configured") + } + if itemWriter == nil { + return false, fmt.Errorf("media item writer not configured") + } + items, err := itemReader.GetByIDs(ctx, []string{contentID}) + if err != nil { + return false, fmt.Errorf("get ebook media item %s: %w", contentID, err) + } + if len(items) == 0 || items[0] == nil { + return false, fmt.Errorf("ebook media item %s not found", contentID) + } + item := items[0] + if ebookItemHasCuratedMetadata(item) { + // A matched item's metadata was curated by a provider or a person; + // re-parsing the file (mtime change, group-key version bump) must not + // clobber it with embedded file metadata. + return true, nil + } + applyEbookToMediaItem(item, book) + if item.SortTitle == "" { + item.SortTitle = titleutil.DeriveDefaultSortTitle(item.Title) + } + return false, itemWriter.Upsert(ctx, item) +} + +// ebookItemHasCuratedMetadata reports whether the item's metadata is owned by +// a provider match (or manual curation) and therefore must not be overwritten +// by metadata embedded in scanned files. +func ebookItemHasCuratedMetadata(item *models.MediaItem) bool { + return item != nil && strings.EqualFold(strings.TrimSpace(item.Status), "matched") +} + +func applyEbookToMediaItem(item *models.MediaItem, book *parsedEbook) { + item.Type = "ebook" + if title := strings.TrimSpace(book.Title); title != "" { + item.Title = title + } + if book.Year > 0 { + item.Year = book.Year + } + if book.Description != "" && (item.Overview == "" || looksLikeHTML(item.Overview)) { + item.Overview = book.Description + } + if book.Publisher != "" { + item.Studios = mergeUniqueStrings(item.Studios, []string{book.Publisher}) + } + if len(book.Genres) > 0 { + item.Genres = mergeUniqueStrings(item.Genres, book.Genres) + } + if !book.PublishedAt.IsZero() && item.ReleaseDate == nil { + rd := book.PublishedAt.UTC().Format("2006-01-02") + item.ReleaseDate = &rd + } + if book.Language != "" && item.OriginalLanguage == "" { + item.OriginalLanguage = book.Language + } +} + +func (s *Scanner) findEbookByFilePath(ctx context.Context, filePath string) *models.MediaItem { + if s.fileRepo == nil { + return nil + } + var existingID string + err := s.fileRepo.Pool().QueryRow(ctx, ` + SELECT mf.content_id + FROM media_files mf + JOIN media_items mi ON mi.content_id = mf.content_id + WHERE mf.file_path = $1 + AND mi.type = 'ebook' + LIMIT 1 + `, filePath).Scan(&existingID) + if err != nil || existingID == "" { + return nil + } + items, err := s.itemRepo.GetByIDs(ctx, []string{existingID}) + if err != nil || len(items) == 0 { + return nil + } + return items[0] +} + +// findEbookByContentGroupKey locates an existing item that a sibling format of +// the same book should join. Grouping merges *different* formats only: an item +// that already owns another file of the same format is excluded, so two +// distinct books whose sparse metadata collides on the same key (e.g. every +// volume carrying the series name as its title) stay separate items instead of +// silently merging. +func (s *Scanner) findEbookByContentGroupKey(ctx context.Context, folderID int, groupKey string, format string, filePath string) *models.MediaItem { + if s.fileRepo == nil || s.itemRepo == nil || strings.TrimSpace(groupKey) == "" { + return nil + } + var existingID string + err := s.fileRepo.Pool().QueryRow(ctx, ` + SELECT mf.content_id + FROM media_files mf + JOIN media_items mi ON mi.content_id = mf.content_id + WHERE mf.media_folder_id = $1 + AND mf.group_key_version = $2 + AND mf.content_group_key = $3 + AND mf.missing_since IS NULL + AND mi.type = 'ebook' + AND NOT EXISTS ( + SELECT 1 FROM media_files dup + WHERE dup.content_id = mf.content_id + AND dup.missing_since IS NULL + AND lower(dup.container) = lower($4) + AND dup.file_path <> $5 + ) + ORDER BY CASE WHEN lower(trim(mi.status)) = 'matched' THEN 0 ELSE 1 END, + mf.id ASC + LIMIT 1 + `, folderID, ebookGroupKeyVersion, groupKey, format, filePath).Scan(&existingID) + if err != nil || existingID == "" { + return nil + } + items, err := s.itemRepo.GetByIDs(ctx, []string{existingID}) + if err != nil || len(items) == 0 { + return nil + } + return items[0] +} + +// ebookGroupKeyVersion versions the ebookContentGroupKey scheme. Bump it +// whenever the key shape changes so rows keyed under an older scheme are +// reprocessed and re-keyed (see ebookFileShouldSkip) instead of silently never +// matching sibling-format lookups again. +const ebookGroupKeyVersion = 2 + +func (s *Scanner) upsertEbookMediaFile(ctx context.Context, folder *models.MediaFolder, contentID string, filePath string, size int64, modifiedAt time.Time, book *parsedEbook, groupKey string) error { + mf := buildEbookMediaFile(folder, contentID, filePath, size, modifiedAt, book, groupKey) + if _, err := s.fileRepo.Upsert(ctx, mf); err != nil { + return fmt.Errorf("upsert media file %s: %w", filePath, err) + } + return nil +} + +func buildEbookMediaFile(folder *models.MediaFolder, contentID string, filePath string, size int64, modifiedAt time.Time, book *parsedEbook, groupKey string) models.MediaFile { + return models.MediaFile{ + ContentID: contentID, + MediaFolderID: folder.ID, + CanonicalRootPath: filePath, + ObservedRootPath: filePath, + ContentGroupKey: groupKey, + GroupKeyVersion: ebookGroupKeyVersion, + BaseTitle: book.Title, + BaseYear: book.Year, + BaseType: "ebook", + IdentityConfidence: ebookIdentityConfidence(book), + FilePath: filePath, + FileSize: size, + FileModifiedAt: &modifiedAt, + Container: book.Format, + Duration: book.PageCount, + ProbeSource: "local", + } +} + +func ebookContentGroupKey(book *parsedEbook, filePath string) string { + if book != nil { + if isbn := normalizeEbookISBN(book.ISBN); isbn != "" { + return "ebook:isbn:" + isbn + } + } + + title := "" + authors := []string(nil) + if book != nil { + title = strings.TrimSpace(book.Title) + authors = book.Authors + } + if title == "" { + title = ebookTitleFromPath(filePath) + } + normalizedTitle := normalizeEbookIdentityPart(title) + if normalizedTitle == "" { + cleanPath := strings.TrimSpace(filepath.Clean(filePath)) + if cleanPath == "." { + return "" + } + return "ebook:path:" + cleanPath + } + + normalizedAuthors := make([]string, 0, len(authors)) + seenAuthors := make(map[string]struct{}, len(authors)) + for _, author := range authors { + normalized := normalizeEbookIdentityPart(author) + if normalized == "" { + continue + } + if _, ok := seenAuthors[normalized]; ok { + continue + } + seenAuthors[normalized] = struct{}{} + normalizedAuthors = append(normalizedAuthors, normalized) + } + sort.Strings(normalizedAuthors) + if len(normalizedAuthors) > 0 { + return "ebook:title_author:" + normalizedTitle + "|" + strings.Join(normalizedAuthors, ",") + } + + dir := strings.TrimSpace(filepath.Clean(filepath.Dir(filePath))) + if dir == "." { + dir = "" + } + return "ebook:title:" + normalizedTitle + "|dir:" + normalizeEbookIdentityPart(dir) +} + +func ebookTitleFromPath(filePath string) string { + base := filepath.Base(filePath) + if base == "." || base == string(filepath.Separator) { + return "" + } + // ".fb2.zip" is a double extension that filepath.Ext (and the + // normalized ".fbz" format token) would leave half-stripped. + if strings.HasSuffix(strings.ToLower(base), ".fb2.zip") { + return base[:len(base)-len(".fb2.zip")] + } + return strings.TrimSuffix(base, filepath.Ext(base)) +} + +func normalizeEbookIdentityPart(value string) string { + value = strings.ToLower(strings.TrimSpace(value)) + var b strings.Builder + previousSpace := false + for _, r := range value { + if unicode.IsLetter(r) || unicode.IsDigit(r) { + b.WriteRune(r) + previousSpace = false + continue + } + if unicode.IsSpace(r) || r == '&' || r == '-' || r == '_' || r == ':' || r == '/' || r == '\\' || r == ',' || r == '.' { + if b.Len() > 0 && !previousSpace { + b.WriteByte(' ') + previousSpace = true + } + } + } + return strings.TrimSpace(b.String()) +} + +type ebookGroupLocks struct { + mu sync.Mutex + locks map[string]*sync.Mutex +} + +func newEbookGroupLocks() *ebookGroupLocks { + return &ebookGroupLocks{locks: make(map[string]*sync.Mutex)} +} + +func (l *ebookGroupLocks) lock(key string) func() { + if l == nil || strings.TrimSpace(key) == "" { + return func() {} + } + l.mu.Lock() + groupLock := l.locks[key] + if groupLock == nil { + groupLock = &sync.Mutex{} + l.locks[key] = groupLock + } + l.mu.Unlock() + + groupLock.Lock() + return groupLock.Unlock +} + +// localEbookPosterPrefix mirrors the storage layout produced by +// imagecache.CacheEbookCover ("local/ebooks/{contentID}/poster/..."); it marks +// posters this pipeline owns and is therefore allowed to refresh. +const localEbookPosterPrefix = "local/ebooks/" + +type ebookCoverMetadataStore interface { + GetPoster(ctx context.Context, contentID string) (posterPath string, posterThumbhash string, err error) + SetLocalPoster(ctx context.Context, contentID, posterPath, thumbhash, localPrefix string) (bool, error) +} + +// applyEbookLocalCover records the best locally available cover for the file: +// a sidecar image that belongs to this book wins over the embedded cover, and +// exactly one cover is applied per reconcile. A sidecar discovery error does +// not block the embedded fallback. +func applyEbookLocalCover(ctx context.Context, store ebookCoverMetadataStore, cacher ebookCoverCacher, contentID string, ebookFilePath string, book *parsedEbook) error { + if store == nil || cacher == nil || contentID == "" { + return nil + } + var data []byte + var sidecarErr error + if ebookFilePath != "" { + cover, _, err := findSidecarBookCover(ebookFilePath) + if err != nil { + sidecarErr = err + } else if cover != nil { + data = cover.Bytes + } + } + if len(data) == 0 && book != nil && book.Cover != nil { + data = book.Cover.Bytes + } + if len(data) == 0 { + return sidecarErr + } + return errors.Join(sidecarErr, cacheEbookCoverBytes(ctx, store, cacher, contentID, data)) +} + +func cacheEbookCoverBytes(ctx context.Context, store ebookCoverMetadataStore, cacher ebookCoverCacher, contentID string, data []byte) error { + if len(data) == 0 { + return nil + } + existingPath, existingThumbhash, err := store.GetPoster(ctx, contentID) + if err != nil { + return fmt.Errorf("get ebook poster for cover: %w", err) + } + existingPath = strings.TrimSpace(existingPath) + if existingPath != "" { + // Provider or manually applied artwork always wins over scan covers. + if !strings.HasPrefix(existingPath, localEbookPosterPrefix) { + return nil + } + // Re-extracted bytes of an unchanged cover hash identically; skip + // the variant regeneration and upload churn. A replaced cover hashes + // differently and falls through to refresh the stale poster. + if thumbhash, err := imageutil.Thumbhash(data); err == nil && thumbhash == existingThumbhash { + return nil + } + } + basePath, ext, thumbhash, err := cacher.CacheEbookCover(ctx, data, contentID) + if err != nil { + return err + } + posterPath := strings.TrimRight(basePath, "/") + "/original" + ext + if _, err := store.SetLocalPoster(ctx, contentID, posterPath, thumbhash, localEbookPosterPrefix); err != nil { + return fmt.Errorf("set ebook local poster: %w", err) + } + return nil +} + +var sidecarCoverNames = []string{"cover", "folder", "front", "poster", "thumbnail"} +var sidecarCoverExtensions = []string{".jpg", ".jpeg", ".png", ".webp", ".avif", ".gif", ".bmp"} + +// findSidecarBookCover looks for cover art next to the ebook file. An image +// named after the book file always belongs to it; the generic artwork names +// (cover.jpg, folder.png, ...) are trusted only when this is the directory's +// sole ebook, so one cover.jpg in a flat multi-book folder is not applied to +// every book in it. +func findSidecarBookCover(ebookFilePath string) (*parsedEbookCover, string, error) { + if ebookFilePath == "" { + return nil, "", nil + } + entries, err := os.ReadDir(filepath.Dir(ebookFilePath)) + if err != nil { + return nil, "", err + } + byName := make(map[string]string, len(entries)) + ebookCount := 0 + for _, entry := range entries { + if entry.IsDir() { + continue + } + if SupportsEbookFile(entry.Name()) { + ebookCount++ + } + byName[strings.ToLower(entry.Name())] = filepath.Join(filepath.Dir(ebookFilePath), entry.Name()) + } + + var candidates []string + if base := strings.ToLower(ebookTitleFromPath(ebookFilePath)); base != "" { + for _, ext := range sidecarCoverExtensions { + candidates = append(candidates, base+ext) + } + } + if ebookCount <= 1 { + for _, name := range sidecarCoverNames { + for _, ext := range sidecarCoverExtensions { + candidates = append(candidates, name+ext) + } + } + } + for _, candidate := range candidates { + path := byName[candidate] + if path == "" { + continue + } + data, err := readSidecarCover(path) + if err != nil { + return nil, path, err + } + return &parsedEbookCover{ + ContentType: ebookImageContentType(path), + Bytes: data, + }, path, nil + } + return nil, "", nil +} + +func readSidecarCover(path string) ([]byte, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + info, err := file.Stat() + if err != nil { + return nil, err + } + if info.Size() > maxEPUBMetadataEntrySize { + return nil, fmt.Errorf("sidecar cover too large: %s", path) + } + data, err := io.ReadAll(io.LimitReader(file, maxEPUBMetadataEntrySize+1)) + if err != nil { + return nil, err + } + if len(data) > maxEPUBMetadataEntrySize { + return nil, fmt.Errorf("sidecar cover too large: %s", path) + } + if len(data) == 0 { + return nil, fmt.Errorf("sidecar cover empty: %s", path) + } + return data, nil +} + +func insertEbookLibraryMembership(ctx context.Context, exec ebookSQLExecutor, contentID string, folderID int) error { + _, err := exec.Exec(ctx, ` + INSERT INTO media_item_libraries (content_id, media_folder_id, first_seen_at) + VALUES ($1, $2, NOW()) + ON CONFLICT (content_id, media_folder_id) DO NOTHING + `, contentID, folderID) + return err +} + +func insertEbookISBNProviderID(ctx context.Context, exec ebookSQLExecutor, contentID string, isbn string) error { + _, err := exec.Exec(ctx, ` + INSERT INTO media_item_provider_ids (content_id, provider, provider_id, item_type) + VALUES ($1, 'isbn', $2, 'ebook') + ON CONFLICT DO NOTHING + `, contentID, isbn) + return err +} + +type ebookCredit struct { + Name string + Kind models.PersonKind +} + +func ebookPeopleCreditsEqual(existing []models.ItemPerson, desired []ebookCredit) bool { + existingAuthors := make([]models.ItemPerson, 0, len(existing)) + for _, p := range existing { + if p.Kind == models.PersonKindNarrator { + return false + } + if p.Kind == models.PersonKindAuthor { + existingAuthors = append(existingAuthors, p) + } + } + if len(existingAuthors) != len(desired) { + return false + } + type key struct { + name string + kind models.PersonKind + } + have := make(map[key]struct{}, len(existingAuthors)) + for _, p := range existingAuthors { + have[key{strings.ToLower(strings.TrimSpace(p.Person.Name)), p.Kind}] = struct{}{} + } + for _, d := range desired { + k := key{strings.ToLower(strings.TrimSpace(d.Name)), d.Kind} + if _, ok := have[k]; !ok { + return false + } + } + return true +} + +type ebookResolvedAuthor struct { + ID int64 + Name string +} + +func mergeEbookPeople(existing []models.ItemPerson, authors []ebookResolvedAuthor) []models.ItemPerson { + people := make([]models.ItemPerson, 0, len(existing)+len(authors)) + for _, p := range existing { + if p.Kind == models.PersonKindAuthor || p.Kind == models.PersonKindNarrator { + continue + } + p.SortOrder = len(people) + people = append(people, p) + } + for _, author := range authors { + people = append(people, models.ItemPerson{ + Person: models.Person{ID: author.ID, Name: author.Name}, + Kind: models.PersonKindAuthor, + SortOrder: len(people), + }) + } + return people +} + +func ebookPeopleForReplace(existing []models.ItemPerson, getErr error, authors []ebookResolvedAuthor) ([]models.ItemPerson, error) { + if getErr != nil { + return nil, fmt.Errorf("get ebook people: %w", getErr) + } + return mergeEbookPeople(existing, authors), nil +} + +// ebookPeopleWriteAllowed reports whether file-embedded authors may be written +// for the item. Curated (provider-matched) items are fill-empty only: file +// metadata may supply authors when the item has none, but must never replace +// provider-enriched author credits. +func ebookPeopleWriteAllowed(curated bool, existing []models.ItemPerson) bool { + if !curated { + return true + } + for _, p := range existing { + if p.Kind == models.PersonKindAuthor { + return false + } + } + return true +} + +func (s *Scanner) upsertEbookPeople(ctx context.Context, contentID string, book *parsedEbook, curated bool) error { + if s.personRepo == nil { + return fmt.Errorf("personRepo not configured on Scanner") + } + if s.itemRepo == nil { + return fmt.Errorf("itemRepo not configured on Scanner") + } + + var desired []ebookCredit + for _, author := range book.Authors { + if name := strings.TrimSpace(author); name != "" { + desired = append(desired, ebookCredit{Name: name, Kind: models.PersonKindAuthor}) + } + } + if len(desired) == 0 { + return nil + } + + existing, err := s.itemRepo.GetPeople(ctx, contentID) + if err != nil { + return fmt.Errorf("get ebook people: %w", err) + } + if !ebookPeopleWriteAllowed(curated, existing) { + return nil + } + if ebookPeopleCreditsEqual(existing, desired) { + return nil + } + + authors := make([]ebookResolvedAuthor, 0, len(desired)) + for _, c := range desired { + personID, err := s.personRepo.FindOrCreate(ctx, models.Person{Name: c.Name}) + if err != nil { + return fmt.Errorf("find-or-create person %q: %w", c.Name, err) + } + authors = append(authors, ebookResolvedAuthor{ID: personID, Name: c.Name}) + } + people, err := ebookPeopleForReplace(existing, nil, authors) + if err != nil { + return err + } + return s.itemRepo.ReplacePeople(ctx, contentID, people) +} + +func (s *Scanner) upsertEbookSeries(ctx context.Context, contentID string, book *parsedEbook, curated bool) error { + if s == nil { + return fmt.Errorf("Scanner not configured") + } + if s.fileRepo == nil { + return fmt.Errorf("fileRepo not configured on Scanner") + } + + var currentName *string + var currentIdx *float64 + err := s.fileRepo.Pool().QueryRow(ctx, ` + SELECT series_name, series_index FROM ebook_series WHERE content_id = $1 + `, contentID).Scan(¤tName, ¤tIdx) + + plan, err := planEbookSeriesWrite(book, currentName, currentIdx, err, curated) + if err != nil { + return err + } + + switch plan.Kind { + case ebookSeriesWriteNone: + return nil + case ebookSeriesWriteDelete: + if _, delErr := s.fileRepo.Pool().Exec(ctx, + `DELETE FROM ebook_series WHERE content_id = $1`, contentID); delErr != nil { + return fmt.Errorf("delete ebook_series row: %w", delErr) + } + return nil + case ebookSeriesWriteUpsert: + var idx any + if plan.Index != nil { + idx = *plan.Index + } + if _, err := s.fileRepo.Pool().Exec(ctx, ` + INSERT INTO ebook_series (content_id, series_name, series_index, updated_at) + VALUES ($1, $2, $3, NOW()) + ON CONFLICT (content_id) DO UPDATE SET + series_name = EXCLUDED.series_name, + series_index = EXCLUDED.series_index, + updated_at = NOW() + `, contentID, plan.Name, idx); err != nil { + return fmt.Errorf("upsert ebook_series row: %w", err) + } + return nil + default: + return fmt.Errorf("unknown ebook_series write kind: %d", plan.Kind) + } +} + +func ebookSeriesDesired(book *parsedEbook) (string, *float64) { + if book == nil { + return "", nil + } + return strings.TrimSpace(book.Series), parseSeriesIndex(book.SeriesIndex) +} + +type ebookSeriesWriteKind int + +const ( + ebookSeriesWriteNone ebookSeriesWriteKind = iota + ebookSeriesWriteDelete + ebookSeriesWriteUpsert +) + +type ebookSeriesWritePlan struct { + Kind ebookSeriesWriteKind + Name string + Index *float64 +} + +// planEbookSeriesWrite decides how the ebook_series row should change for +// file-embedded series metadata. fillOnly applies to curated +// (provider-matched) items: the file may supply a series when the item has +// none, but must never replace or delete an existing (provider-enriched) row. +func planEbookSeriesWrite(book *parsedEbook, currentName *string, currentIdx *float64, queryErr error, fillOnly bool) (ebookSeriesWritePlan, error) { + if queryErr != nil { + if !errors.Is(queryErr, pgx.ErrNoRows) { + return ebookSeriesWritePlan{}, fmt.Errorf("query ebook_series: %w", queryErr) + } + currentName = nil + currentIdx = nil + } + + desiredName, desiredIdx := ebookSeriesDesired(book) + if desiredName == "" { + if currentName == nil || fillOnly { + return ebookSeriesWritePlan{Kind: ebookSeriesWriteNone}, nil + } + return ebookSeriesWritePlan{Kind: ebookSeriesWriteDelete}, nil + } + + if currentName != nil { + if fillOnly { + return ebookSeriesWritePlan{Kind: ebookSeriesWriteNone}, nil + } + if *currentName == desiredName && floatPtrEqual(currentIdx, desiredIdx) { + return ebookSeriesWritePlan{Kind: ebookSeriesWriteNone}, nil + } + } + + return ebookSeriesWritePlan{ + Kind: ebookSeriesWriteUpsert, + Name: desiredName, + Index: desiredIdx, + }, nil +} + +func ebookIdentityConfidence(book *parsedEbook) string { + if book == nil { + return "low" + } + + score := 0 + if book.Title != "" { + score++ + } + if len(book.Authors) > 0 { + score++ + } + if book.Year > 0 { + score++ + } + if book.ISBN != "" { + score++ + } + + switch { + case score >= 4: + return "high" + case score > 0: + return "medium" + default: + return "low" + } +} diff --git a/internal/scanner/ebook_test.go b/internal/scanner/ebook_test.go new file mode 100644 index 00000000..38a998a5 --- /dev/null +++ b/internal/scanner/ebook_test.go @@ -0,0 +1,1896 @@ +package scanner + +import ( + "archive/zip" + "context" + "errors" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/Silo-Server/silo-server/internal/models" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type recordingEbookExecutor struct { + queries []string + args [][]any +} + +func (r *recordingEbookExecutor) Exec(_ context.Context, query string, args ...any) (pgconn.CommandTag, error) { + r.queries = append(r.queries, query) + r.args = append(r.args, append([]any(nil), args...)) + return pgconn.CommandTag{}, nil +} + +type fakeFilesystemItemReader struct { + items []*models.MediaItem + err error +} + +func (f *fakeFilesystemItemReader) GetByIDs(_ context.Context, _ []string) ([]*models.MediaItem, error) { + return f.items, f.err +} + +type fakeEbookCoverCacher struct { + calls int + data []byte + contentID string + err error +} + +func (f *fakeEbookCoverCacher) CacheEbookCover(_ context.Context, data []byte, contentID string) (string, string, string, error) { + f.calls++ + f.data = append([]byte(nil), data...) + f.contentID = contentID + if f.err != nil { + return "", "", "", f.err + } + return "local/ebooks/" + contentID + "/poster", ".webp", "thumb", nil +} + +type fakeEbookMetadataUpdater struct { + posterPath string + posterThumbhash string + getErr error + contentID string + setPosterPath string + setThumbhash string + setPrefix string + setCalls int + err error +} + +func (f *fakeEbookMetadataUpdater) GetPoster(_ context.Context, _ string) (string, string, error) { + return f.posterPath, f.posterThumbhash, f.getErr +} + +func (f *fakeEbookMetadataUpdater) SetLocalPoster(_ context.Context, contentID, posterPath, thumbhash, localPrefix string) (bool, error) { + f.setCalls++ + f.contentID = contentID + f.setPosterPath = posterPath + f.setThumbhash = thumbhash + f.setPrefix = localPrefix + return f.err == nil, f.err +} + +func TestSupportsEbookFile(t *testing.T) { + cases := []struct { + path string + want bool + }{ + {"book.epub", true}, + {"book.PDF", true}, + {"book.mobi", true}, + {"book.azw", true}, + {"book.azw3", true}, + {"book.FB2", true}, + {"book.fb2.zip", true}, + {"book.fbz", true}, + {"book.cbz", true}, + {"book.cbr", true}, + {"book.txt", false}, + {"book.md", false}, + {"README.md", false}, + {"book.mp3", false}, + {"movie.mkv", false}, + } + for _, tc := range cases { + if got := SupportsEbookFile(tc.path); got != tc.want { + t.Errorf("SupportsEbookFile(%q) = %v, want %v", tc.path, got, tc.want) + } + } +} + +func TestParseEbookFileSupportsReaderFormatsWithoutEmbeddedMetadata(t *testing.T) { + for _, tc := range []struct { + name string + wantFormat string + }{ + {"book.pdf", "pdf"}, + {"book.mobi", "mobi"}, + {"book.azw", "azw"}, + {"book.azw3", "azw3"}, + {"book.cbr", "cbr"}, + } { + t.Run(tc.name, func(t *testing.T) { + path := filepath.Join(t.TempDir(), tc.name) + if err := os.WriteFile(path, []byte("placeholder"), 0o644); err != nil { + t.Fatalf("write file: %v", err) + } + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + if got.Format != tc.wantFormat { + t.Fatalf("Format = %q, want %q", got.Format, tc.wantFormat) + } + }) + } +} + +func TestNormalizeEbookISBNHandlesCommonLabels(t *testing.T) { + cases := []struct { + in string + want string + }{ + {"ISBN-13: 978-0-306-40615-7", "9780306406157"}, + {"ISBN-10: 0-9752298-0-x", "097522980X"}, + } + for _, tc := range cases { + if got := normalizeEbookISBN(tc.in); got != tc.want { + t.Errorf("normalizeEbookISBN(%q) = %q, want %q", tc.in, got, tc.want) + } + } +} + +func TestParseEbookEPUBMetadata(t *testing.T) { + path := writeTestEPUB(t, []string{"ISBN: 978-0-306-40615-7"}) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Format != "epub" { + t.Fatalf("Format = %q, want epub", got.Format) + } + if got.Title != "The Test Ebook" { + t.Fatalf("Title = %q, want The Test Ebook", got.Title) + } + if strings.Join(got.Authors, ", ") != "Ada Writer, Ben Author" { + t.Fatalf("Authors = %v, want Ada Writer and Ben Author", got.Authors) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN", got.ISBN) + } + if got.Year != 2024 { + t.Fatalf("Year = %d, want 2024", got.Year) + } + if got.Publisher != "Silo Press" { + t.Fatalf("Publisher = %q, want Silo Press", got.Publisher) + } + wantPublishedAt := time.Date(2024, 3, 10, 0, 0, 0, 0, time.UTC) + if !got.PublishedAt.Equal(wantPublishedAt) { + t.Fatalf("PublishedAt = %v, want %v", got.PublishedAt, wantPublishedAt) + } + if got.Language != "en" { + t.Fatalf("Language = %q, want en", got.Language) + } + if strings.Join(got.Genres, ", ") != "Fiction, Adventure" { + t.Fatalf("Genres = %v, want Fiction and Adventure", got.Genres) + } + if got.Series != "Test Series" || got.SeriesIndex != "2" { + t.Fatalf("Series = %q/%q, want Test Series/2", got.Series, got.SeriesIndex) + } +} + +func TestParseEbookEPUBMetadataStripsHTMLDescription(t *testing.T) { + path := writeTestEPUBWithDescription(t, `<div><p><strong>Shanghai Dreams ...</strong> Magnus is stationed at Shanghai.<br>Published by The Electronic Book Company</p></div>`) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + want := "Shanghai Dreams ... Magnus is stationed at Shanghai. Published by The Electronic Book Company" + if got.Description != want { + t.Fatalf("Description = %q, want %q", got.Description, want) + } +} + +func TestParseEbookEPUBSkipsUUIDIdentifierBeforeISBN(t *testing.T) { + path := writeTestEPUB(t, []string{ + "550e8400-e29b-41d4-a716-446655440000", + "ISBN: 978-0-306-40615-7", + }) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN after skipping UUID", got.ISBN) + } +} + +func TestParseEbookEPUBMetadataReadsISBNFromMetaTags(t *testing.T) { + path := writeTestEPUBWithMeta(t, nil, ` `) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN from calibre meta tag", got.ISBN) + } +} + +func TestParseEbookEPUBMetadataHandlesLatin1OPF(t *testing.T) { + path := writeTestEPUBWithOPFBytes(t, []byte("\n"+ + ""+ + "Caf\xe9 Society"+ + "Fran\xe7ois Author"+ + "Cr\xe8me Press"+ + "")) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Café Society" || strings.Join(got.Authors, ", ") != "François Author" || got.Publisher != "Crème Press" { + t.Fatalf("parsed latin1 metadata = title %q authors %v publisher %q", got.Title, got.Authors, got.Publisher) + } +} + +func TestParseEbookEPUBMetadataHandlesWindows1251OPF(t *testing.T) { + path := writeTestEPUBWithOPFBytes(t, []byte("\n"+ + ""+ + "\xc2\xee\xe9\xed\xe0 \xe8 \xec\xe8\xf0"+ + "\xd2\xee\xeb\xf1\xf2\xee\xe9"+ + "")) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Война и мир" || strings.Join(got.Authors, ", ") != "Толстой" { + t.Fatalf("parsed windows-1251 metadata = title %q authors %v", got.Title, got.Authors) + } +} + +func TestParseEbookEPUBMetadataAllowsXMLVersion11(t *testing.T) { + path := writeTestEPUBWithOPFBytes(t, []byte(` + + Versioned Ebook + Ada Writer +`)) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Versioned Ebook" || strings.Join(got.Authors, ", ") != "Ada Writer" { + t.Fatalf("parsed XML 1.1 metadata = title %q authors %v", got.Title, got.Authors) + } +} + +func TestParseEbookEPUBExtractsManifestCover(t *testing.T) { + path := writeTestEPUBWithCover(t, "Images/cover.jpg", "image/jpeg", []byte("epub-cover-bytes")) + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Cover == nil { + t.Fatal("Cover = nil, want embedded EPUB cover") + } + if got.Cover.ContentType != "image/jpeg" { + t.Fatalf("Cover.ContentType = %q, want image/jpeg", got.Cover.ContentType) + } + if string(got.Cover.Bytes) != "epub-cover-bytes" { + t.Fatalf("Cover.Bytes = %q, want EPUB cover bytes", string(got.Cover.Bytes)) + } +} + +func TestParseEbookEPUBCoverSkipsXHTMLCoverPage(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.epub") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create epub: %v", err) + } + zw := zip.NewWriter(file) + add := func(name, body string) { + t.Helper() + w, err := zw.Create(name) + if err != nil { + t.Fatalf("create zip entry %s: %v", name, err) + } + if _, err := w.Write([]byte(body)); err != nil { + t.Fatalf("write zip entry %s: %v", name, err) + } + } + add("META-INF/container.xml", ` + + + + +`) + // EPUB2-style meta cover pointing at the XHTML cover *page*, with the + // real image declared later via properties="cover-image". + add("OPS/content.opf", ` + + + The Test Ebook + + + + + + +`) + add("OPS/cover.xhtml", "") + add("OPS/Images/cover.jpg", "real-cover-bytes") + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close epub: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Cover == nil { + t.Fatal("Cover = nil, want cover-image manifest item") + } + if got.Cover.ContentType != "image/jpeg" || string(got.Cover.Bytes) != "real-cover-bytes" { + t.Fatalf("Cover = %q/%q, want the image item, not the XHTML cover page", got.Cover.ContentType, string(got.Cover.Bytes)) + } +} + +func TestReadEPUBZipEntryRejectsOversizedEntry(t *testing.T) { + path := filepath.Join(t.TempDir(), "large.epub") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create epub: %v", err) + } + zw := zip.NewWriter(file) + w, err := zw.Create("OPS/content.opf") + if err != nil { + t.Fatalf("create zip entry: %v", err) + } + if _, err := w.Write([]byte(strings.Repeat("x", maxEPUBMetadataEntrySize+1))); err != nil { + t.Fatalf("write zip entry: %v", err) + } + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close file: %v", err) + } + + reader, err := zip.OpenReader(path) + if err != nil { + t.Fatalf("open zip: %v", err) + } + defer reader.Close() + + _, err = readEPUBZipEntry(&reader.Reader, "OPS/content.opf") + if err == nil || !strings.Contains(err.Error(), "epub entry too large") { + t.Fatalf("readEPUBZipEntry error = %v, want size limit error", err) + } +} + +func TestParseEbookFB2Metadata(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.fb2") + if err := os.WriteFile(path, []byte(` + + + + science fiction + AdaWriter + FB2 Test Ebook + 5 April 2022 + en + + + + FB2 Press + 2022 + 978-0-306-40615-7 + + +`), 0o644); err != nil { + t.Fatalf("write fb2: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Format != "fb2" || got.Title != "FB2 Test Ebook" { + t.Fatalf("Format/Title = %q/%q, want fb2/FB2 Test Ebook", got.Format, got.Title) + } + if strings.Join(got.Authors, ", ") != "Ada Writer" { + t.Fatalf("Authors = %v, want Ada Writer", got.Authors) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN", got.ISBN) + } + if got.Publisher != "FB2 Press" { + t.Fatalf("Publisher = %q, want FB2 Press", got.Publisher) + } + if got.Year != 2022 { + t.Fatalf("Year = %d, want 2022", got.Year) + } + wantPublishedAt := time.Date(2022, 4, 5, 0, 0, 0, 0, time.UTC) + if !got.PublishedAt.Equal(wantPublishedAt) { + t.Fatalf("PublishedAt = %v, want %v", got.PublishedAt, wantPublishedAt) + } + if got.Language != "en" { + t.Fatalf("Language = %q, want en", got.Language) + } + if strings.Join(got.Genres, ", ") != "science fiction" { + t.Fatalf("Genres = %v, want science fiction", got.Genres) + } + if got.Series != "FB2 Series" || got.SeriesIndex != "3" { + t.Fatalf("Series = %q/%q, want FB2 Series/3", got.Series, got.SeriesIndex) + } +} + +func TestParseEbookFBZMetadata(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.fb2.zip") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create fbz: %v", err) + } + zw := zip.NewWriter(file) + w, err := zw.Create("nested/book.fb2") + if err != nil { + t.Fatalf("create fb2 entry: %v", err) + } + if _, err := w.Write([]byte(` + + + + fantasy + AdaWriter + FBZ Test Ebook + + en + + + + Archive Press + 2021 + 978-0-306-40615-7 + + +`)); err != nil { + t.Fatalf("write fb2 entry: %v", err) + } + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close fbz: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Format != "fbz" || got.Title != "FBZ Test Ebook" { + t.Fatalf("Format/Title = %q/%q, want fbz/FBZ Test Ebook", got.Format, got.Title) + } + if strings.Join(got.Authors, ", ") != "Ada Writer" { + t.Fatalf("Authors = %v, want Ada Writer", got.Authors) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN", got.ISBN) + } + if got.Publisher != "Archive Press" || got.Year != 2021 { + t.Fatalf("Publisher/Year = %q/%d, want Archive Press/2021", got.Publisher, got.Year) + } + if got.Series != "Archive Series" || got.SeriesIndex != "4" { + t.Fatalf("Series = %q/%q, want Archive Series/4", got.Series, got.SeriesIndex) + } +} + +func TestParseEbookPDFInfoMetadata(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte(`%PDF-1.7 +1 0 obj +<< /Title (PDF Test Ebook) + /Author (Ada Writer; Ben Author) + /Subject (ISBN 978-0-306-40615-7) + /Keywords (science fiction, adventure) + /CreationDate (D:20240102030405Z) +>> +endobj +trailer +<< /Info 1 0 R >> +%%EOF`), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Format != "pdf" || got.Title != "PDF Test Ebook" { + t.Fatalf("Format/Title = %q/%q, want pdf/PDF Test Ebook", got.Format, got.Title) + } + if strings.Join(got.Authors, ", ") != "Ada Writer, Ben Author" { + t.Fatalf("Authors = %v, want Ada Writer and Ben Author", got.Authors) + } + if got.ISBN != "9780306406157" { + t.Fatalf("ISBN = %q, want normalized ISBN", got.ISBN) + } + if got.Year != 2024 { + t.Fatalf("Year = %d, want 2024", got.Year) + } + if strings.Join(got.Genres, ", ") != "science fiction, adventure" { + t.Fatalf("Genres = %v, want science fiction and adventure", got.Genres) + } +} + +func TestParseEbookPDFInfoMetadataDecodesUTF16BELiterals(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte("%PDF-1.7\n"+ + "1 0 obj\n"+ + "<< /Title (\xfe\xff\x00C\x00a\x00f\x00e)\n"+ + " /Author (\xfe\xff\x00T\x00h\x00o\x00m\x00a\x00s\x00 \x00D\x00 \x00S\x00e\x00e\x00l\x00e\x00y)\n"+ + ">>\nendobj\n%%EOF"), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Cafe" || strings.Join(got.Authors, ", ") != "Thomas D Seeley" { + t.Fatalf("PDF metadata = title %q authors %v, want decoded UTF-16BE", got.Title, got.Authors) + } +} + +func TestParseEbookPDFInfoMetadataPreservesUTF8Literals(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte("%PDF-1.7\n"+ + "1 0 obj\n"+ + "<< /Title (Caf\xc3\xa9 Society)\n"+ + " /Author (\xef\xbb\xbfFran\xc3\xa7ois Author)\n"+ + ">>\nendobj\n%%EOF"), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Café Society" { + t.Fatalf("Title = %q, want UTF-8 literal preserved without Windows-1252 mojibake", got.Title) + } + if strings.Join(got.Authors, ", ") != "François Author" { + t.Fatalf("Authors = %v, want UTF-8 BOM stripped and bytes preserved", got.Authors) + } +} + +func TestParseEbookPDFInfoMetadataFallsBackToWindows1252(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte("%PDF-1.7\n"+ + "1 0 obj\n"+ + "<< /Title (Caf\xe9 Society)\n"+ + ">>\nendobj\n%%EOF"), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Café Society" { + t.Fatalf("Title = %q, want Windows-1252 fallback for non-UTF-8 literal", got.Title) + } +} + +func TestParseEbookPDFInfoMetadataDecodesHexStrings(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte(`%PDF-1.7 +1 0 obj +<< /Title + /Author <41646120577269746572> + /CreationDate (0000-01-01) +>> +endobj +%%EOF`), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Title != "Hex Book" || strings.Join(got.Authors, ", ") != "Ada Writer" { + t.Fatalf("PDF hex metadata = title %q authors %v", got.Title, got.Authors) + } + if got.Year != 0 || !got.PublishedAt.IsZero() { + t.Fatalf("bad PDF date produced year/date = %d/%v, want ignored", got.Year, got.PublishedAt) + } +} + +func TestParseEbookCBZPageCount(t *testing.T) { + path := filepath.Join(t.TempDir(), "comic.cbz") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create cbz: %v", err) + } + zw := zip.NewWriter(file) + for _, name := range []string{ + "Comic/001.jpg", + "Comic/002.PNG", + "Comic/003.webp", + "Comic/notes.txt", + "__MACOSX/._001.jpg", + } { + w, err := zw.Create(name) + if err != nil { + t.Fatalf("create zip entry %s: %v", name, err) + } + if _, err := w.Write([]byte("placeholder")); err != nil { + t.Fatalf("write zip entry %s: %v", name, err) + } + } + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close cbz: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Format != "cbz" { + t.Fatalf("Format = %q, want cbz", got.Format) + } + if got.PageCount != 3 { + t.Fatalf("PageCount = %d, want 3", got.PageCount) + } +} + +func TestParseEbookCBZExtractsFirstReadablePageAsCover(t *testing.T) { + path := filepath.Join(t.TempDir(), "comic.cbz") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create cbz: %v", err) + } + zw := zip.NewWriter(file) + for _, entry := range []struct { + name string + body []byte + }{ + {name: "Comic/002.png", body: []byte("second-page")}, + {name: "Comic/001.jpg", body: []byte("first-page")}, + {name: "Comic/notes.txt", body: []byte("ignored")}, + } { + w, err := zw.Create(entry.name) + if err != nil { + t.Fatalf("create zip entry %s: %v", entry.name, err) + } + if _, err := w.Write(entry.body); err != nil { + t.Fatalf("write zip entry %s: %v", entry.name, err) + } + } + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close cbz: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Cover == nil { + t.Fatal("Cover = nil, want first CBZ page as cover") + } + if got.Cover.ContentType != "image/jpeg" { + t.Fatalf("Cover.ContentType = %q, want image/jpeg", got.Cover.ContentType) + } + if string(got.Cover.Bytes) != "first-page" { + t.Fatalf("Cover.Bytes = %q, want first page bytes", string(got.Cover.Bytes)) + } +} + +func TestParseEbookCBZPicksNaturallyFirstPageAsCover(t *testing.T) { + path := filepath.Join(t.TempDir(), "comic.cbz") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create cbz: %v", err) + } + zw := zip.NewWriter(file) + for _, entry := range []struct { + name string + body string + }{ + {name: "ch10/page10.jpg", body: "chapter-ten"}, + {name: "ch2/page2.jpg", body: "chapter-two"}, + } { + w, err := zw.Create(entry.name) + if err != nil { + t.Fatalf("create zip entry %s: %v", entry.name, err) + } + if _, err := w.Write([]byte(entry.body)); err != nil { + t.Fatalf("write zip entry %s: %v", entry.name, err) + } + } + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close cbz: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + + if got.Cover == nil { + t.Fatal("Cover = nil, want first page in natural order") + } + if string(got.Cover.Bytes) != "chapter-two" { + t.Fatalf("Cover.Bytes = %q, want ch2 before ch10 (natural order, not byte order)", string(got.Cover.Bytes)) + } +} + +func TestEbookTitleFromPathStripsCompoundFB2Extension(t *testing.T) { + cases := map[string]string{ + "/lib/Anna Karenina.fb2.zip": "Anna Karenina", + "/lib/Anna Karenina.FB2.ZIP": "Anna Karenina", + "/lib/Book.epub": "Book", + "/lib/vol.1.pdf": "vol.1", + } + for path, want := range cases { + if got := ebookTitleFromPath(path); got != want { + t.Errorf("ebookTitleFromPath(%q) = %q, want %q", path, got, want) + } + } +} + +func TestEbookSeriesDesiredParsesIndex(t *testing.T) { + name, idx := ebookSeriesDesired(&parsedEbook{ + Series: " The Expanse ", + SeriesIndex: "2 of 9", + }) + + if name != "The Expanse" { + t.Fatalf("series name = %q, want The Expanse", name) + } + if idx == nil || *idx != 2 { + t.Fatalf("series index = %v, want 2", idx) + } +} + +func TestUpsertEbookSeriesNilScannerReturnsError(t *testing.T) { + var s *Scanner + if err := s.upsertEbookSeries(context.Background(), "content-1", &parsedEbook{Series: "Series"}, false); err == nil { + t.Fatal("upsertEbookSeries nil scanner error = nil, want error") + } +} + +func TestUpsertEbookSeriesNilFileRepoReturnsError(t *testing.T) { + s := &Scanner{} + if err := s.upsertEbookSeries(context.Background(), "content-1", &parsedEbook{Series: "Series"}, false); err == nil { + t.Fatal("upsertEbookSeries nil fileRepo error = nil, want error") + } +} + +func TestPlanEbookSeriesWriteInsertsWhenRowAbsent(t *testing.T) { + plan, err := planEbookSeriesWrite(&parsedEbook{Series: " Series ", SeriesIndex: "2 of 9"}, nil, nil, pgx.ErrNoRows, false) + if err != nil { + t.Fatalf("planEbookSeriesWrite: %v", err) + } + if plan.Kind != ebookSeriesWriteUpsert || plan.Name != "Series" { + t.Fatalf("plan = %+v, want upsert Series", plan) + } + if plan.Index == nil || *plan.Index != 2 { + t.Fatalf("index = %v, want 2", plan.Index) + } +} + +func TestPlanEbookSeriesWriteBlankSeriesDeletesExistingAndSkipsAbsent(t *testing.T) { + currentName := "Series" + plan, err := planEbookSeriesWrite(&parsedEbook{Series: " "}, ¤tName, nil, nil, false) + if err != nil { + t.Fatalf("planEbookSeriesWrite delete: %v", err) + } + if plan.Kind != ebookSeriesWriteDelete { + t.Fatalf("blank existing plan = %+v, want delete", plan) + } + + plan, err = planEbookSeriesWrite(&parsedEbook{Series: ""}, nil, nil, pgx.ErrNoRows, false) + if err != nil { + t.Fatalf("planEbookSeriesWrite absent: %v", err) + } + if plan.Kind != ebookSeriesWriteNone { + t.Fatalf("blank absent plan = %+v, want none", plan) + } +} + +func TestPlanEbookSeriesWriteSkipsIdenticalRow(t *testing.T) { + currentName := "Series" + currentIdx := 3.5 + plan, err := planEbookSeriesWrite(&parsedEbook{Series: "Series", SeriesIndex: "3.5"}, ¤tName, ¤tIdx, nil, false) + if err != nil { + t.Fatalf("planEbookSeriesWrite: %v", err) + } + if plan.Kind != ebookSeriesWriteNone { + t.Fatalf("identical plan = %+v, want none", plan) + } +} + +func TestPlanEbookSeriesWriteAllowsNullNumericIndex(t *testing.T) { + plan, err := planEbookSeriesWrite(&parsedEbook{Series: "Series", SeriesIndex: "appendix"}, nil, nil, pgx.ErrNoRows, false) + if err != nil { + t.Fatalf("planEbookSeriesWrite: %v", err) + } + if plan.Kind != ebookSeriesWriteUpsert || plan.Index != nil { + t.Fatalf("plan = %+v, want upsert with nil index", plan) + } +} + +func TestPlanEbookSeriesWriteFillOnlyNeverReplacesOrDeletesExistingRow(t *testing.T) { + currentName := "Provider Series" + currentIdx := 1.0 + + // A curated item with an existing (provider-enriched) row must not be + // replaced by a differing file-embedded series... + plan, err := planEbookSeriesWrite(&parsedEbook{Series: "File Series", SeriesIndex: "4"}, ¤tName, ¤tIdx, nil, true) + if err != nil { + t.Fatalf("planEbookSeriesWrite replace: %v", err) + } + if plan.Kind != ebookSeriesWriteNone { + t.Fatalf("fill-only replace plan = %+v, want none", plan) + } + + // ...nor deleted when the file carries no series at all. + plan, err = planEbookSeriesWrite(&parsedEbook{Series: ""}, ¤tName, ¤tIdx, nil, true) + if err != nil { + t.Fatalf("planEbookSeriesWrite delete: %v", err) + } + if plan.Kind != ebookSeriesWriteNone { + t.Fatalf("fill-only delete plan = %+v, want none", plan) + } +} + +func TestPlanEbookSeriesWriteFillOnlyInsertsWhenRowAbsent(t *testing.T) { + plan, err := planEbookSeriesWrite(&parsedEbook{Series: "File Series", SeriesIndex: "2"}, nil, nil, pgx.ErrNoRows, true) + if err != nil { + t.Fatalf("planEbookSeriesWrite: %v", err) + } + if plan.Kind != ebookSeriesWriteUpsert || plan.Name != "File Series" { + t.Fatalf("plan = %+v, want fill-empty upsert", plan) + } +} + +func TestEbookPeopleWriteAllowedFillsEmptyOnlyWhenCurated(t *testing.T) { + providerAuthor := []models.ItemPerson{{Person: models.Person{Name: "Provider Author"}, Kind: models.PersonKindAuthor}} + nonAuthorOnly := []models.ItemPerson{{Person: models.Person{Name: "Manual Writer"}, Kind: models.PersonKindWriter}} + + cases := []struct { + name string + curated bool + existing []models.ItemPerson + want bool + }{ + {"pending item always writes", false, providerAuthor, true}, + {"curated with provider authors is read-only", true, providerAuthor, false}, + {"curated without author credits fills empty", true, nil, true}, + {"curated with only non-author credits fills empty", true, nonAuthorOnly, true}, + } + for _, tc := range cases { + if got := ebookPeopleWriteAllowed(tc.curated, tc.existing); got != tc.want { + t.Errorf("%s: ebookPeopleWriteAllowed = %v, want %v", tc.name, got, tc.want) + } + } +} + +func TestPlanEbookSeriesWriteReturnsQueryError(t *testing.T) { + queryErr := errors.New("query failed") + if _, err := planEbookSeriesWrite(&parsedEbook{Series: "Series"}, nil, nil, queryErr, false); !errors.Is(err, queryErr) { + t.Fatalf("planEbookSeriesWrite error = %v, want query error", err) + } +} + +func TestEbookIdentityConfidenceReflectsMetadataCompleteness(t *testing.T) { + book := &parsedEbook{Title: "Tagged Ebook", Authors: []string{"Author"}, Year: 2024, ISBN: "9780306406157"} + if got := ebookIdentityConfidence(book); got != "high" { + t.Fatalf("complete metadata confidence = %q, want high", got) + } + + book = &parsedEbook{Title: "Tagged Ebook", Authors: []string{"Author"}, Year: 2024} + if got := ebookIdentityConfidence(book); got != "medium" { + t.Fatalf("partial metadata confidence = %q, want medium", got) + } + + book = &parsedEbook{} + if got := ebookIdentityConfidence(book); got != "low" { + t.Fatalf("empty metadata confidence = %q, want low", got) + } +} + +func TestEbookContentGroupKeyGroupsMultipleSiblingFormatsByTitleAuthor(t *testing.T) { + want := ebookContentGroupKey(&parsedEbook{ + Format: "epub", + Title: " The Test Ebook ", + Authors: []string{"Ada Writer", "Ben Author"}, + }, "/library/Ada Writer/The Test Ebook.epub") + if want == "" { + t.Fatal("ebookContentGroupKey returned blank") + } + for _, tc := range []struct { + format string + path string + }{ + {format: "mobi", path: "/library/Ada Writer/The Test Ebook.mobi"}, + {format: "azw3", path: "/library/Ada Writer/The Test Ebook.azw3"}, + {format: "pdf", path: "/library/Ada Writer/The Test Ebook.pdf"}, + {format: "fb2", path: "/library/Ada Writer/The Test Ebook.fb2"}, + } { + got := ebookContentGroupKey(&parsedEbook{ + Format: tc.format, + Title: "The Test Ebook", + Authors: []string{"ben author", "ada writer"}, + }, tc.path) + if got != want { + t.Fatalf("%s content group key = %q, want %q", tc.format, got, want) + } + if strings.Contains(got, tc.format) { + t.Fatalf("content group key should not include file format %q: %q", tc.format, got) + } + } +} + +func TestEbookContentGroupKeyPrefersISBNAcrossTitleVariants(t *testing.T) { + first := ebookContentGroupKey(&parsedEbook{ + Format: "epub", + Title: "The Test Ebook", + Authors: []string{"Ada Writer"}, + ISBN: "9780306406157", + }, "/library/Ada Writer/The Test Ebook.epub") + second := ebookContentGroupKey(&parsedEbook{ + Format: "pdf", + Title: "The Test Ebook: Revised Edition", + Authors: []string{"Someone Else"}, + ISBN: "9780306406157", + }, "/library/Other Name.pdf") + + if first != second { + t.Fatalf("ISBN-backed content group keys differ: %q != %q", first, second) + } +} + +func TestResolveEbookMediaItemCreatesNewWhenRootHasNoClaim(t *testing.T) { + finder := &fakeRootContentFinder{} + writer := &fakeFilesystemItemWriter{} + + got, err := resolveEbookMediaItem(context.Background(), finder, writer, 7, "/library/Author/Book.epub", &parsedEbook{ + Title: "Book", Year: 2024, Authors: []string{"Author"}, Description: "Overview", Publisher: "Publisher", Genres: []string{"Fiction"}, Language: "en", + }) + if err != nil { + t.Fatalf("resolveEbookMediaItem: %v", err) + } + if got == "" || len(writer.upserts) != 1 { + t.Fatalf("contentID/upserts = %q/%d, want id and one upsert", got, len(writer.upserts)) + } + item := writer.upserts[0] + if item.Type != "ebook" || item.Title != "Book" || item.Year != 2024 || item.Overview != "Overview" || item.OriginalLanguage != "en" { + t.Fatalf("upserted ebook item = %+v", item) + } + if item.Status != "pending" { + t.Fatalf("Status = %q, want pending so enrichment can promote it to matched", item.Status) + } +} + +func TestResolveEbookMediaItemReusesRootScopedContentID(t *testing.T) { + finder := &fakeRootContentFinder{contentID: "ebook-root-id"} + writer := &fakeFilesystemItemWriter{} + + got, err := resolveEbookMediaItem(context.Background(), finder, writer, 7, "/library/Author/Book.epub", &parsedEbook{Title: "Book"}) + if err != nil { + t.Fatalf("resolveEbookMediaItem: %v", err) + } + if got != "ebook-root-id" { + t.Fatalf("contentID = %q, want root-scoped id", got) + } + if len(writer.upserts) != 0 { + t.Fatalf("unexpected item upsert for existing root: %d", len(writer.upserts)) + } +} + +func TestResolveEbookExistingRootAppliesParsedMetadata(t *testing.T) { + reader := &fakeFilesystemItemReader{items: []*models.MediaItem{{ + ContentID: "ebook-root-id", + Type: "ebook", + Title: "Old Title", + Year: 2020, + OriginalLanguage: "", + }}} + writer := &fakeFilesystemItemWriter{} + + curated, err := updateExistingEbookMediaItem(context.Background(), reader, writer, "ebook-root-id", &parsedEbook{ + Title: "New Title", + Year: 2026, + Publisher: "New Press", + Genres: []string{"Fiction"}, + Language: "en", + }) + if err != nil { + t.Fatalf("updateExistingEbookMediaItem: %v", err) + } + if curated { + t.Fatal("curated = true, want false for an unmatched item") + } + if len(writer.upserts) != 1 { + t.Fatalf("upserts = %d, want 1", len(writer.upserts)) + } + item := writer.upserts[0] + if item.ContentID != "ebook-root-id" || item.Type != "ebook" || item.Title != "New Title" || item.Year != 2026 || item.OriginalLanguage != "en" { + t.Fatalf("updated item = %+v", item) + } + if strings.Join(item.Studios, ",") != "New Press" || strings.Join(item.Genres, ",") != "Fiction" { + t.Fatalf("updated item studios/genres = %+v/%+v", item.Studios, item.Genres) + } +} + +func TestResolveEbookExistingRootReplacesHTMLOverview(t *testing.T) { + reader := &fakeFilesystemItemReader{items: []*models.MediaItem{{ + ContentID: "ebook-root-id", + Type: "ebook", + Title: "Old Title", + Overview: "

Raw overview

", + }}} + writer := &fakeFilesystemItemWriter{} + + _, err := updateExistingEbookMediaItem(context.Background(), reader, writer, "ebook-root-id", &parsedEbook{ + Title: "New Title", + Description: "Clean overview", + }) + if err != nil { + t.Fatalf("updateExistingEbookMediaItem: %v", err) + } + if len(writer.upserts) != 1 { + t.Fatalf("upserts = %d, want 1", len(writer.upserts)) + } + if writer.upserts[0].Overview != "Clean overview" { + t.Fatalf("Overview = %q, want Clean overview", writer.upserts[0].Overview) + } +} + +func TestApplyEbookToMediaItemPreservesExistingYearWhenParsedYearMissing(t *testing.T) { + item := &models.MediaItem{ + Type: "ebook", + Title: "Existing", + Year: 1999, + } + + applyEbookToMediaItem(item, &parsedEbook{Title: "Updated", Year: 0}) + + if item.Title != "Updated" { + t.Fatalf("Title = %q, want Updated", item.Title) + } + if item.Year != 1999 { + t.Fatalf("Year = %d, want preserved 1999", item.Year) + } +} + +func TestEbookPeopleCreditsEqualAuthorsOnly(t *testing.T) { + existing := []models.ItemPerson{ + {Person: models.Person{Name: "Ada Writer"}, Kind: models.PersonKindAuthor, SortOrder: 0}, + {Person: models.Person{Name: "Ben Author"}, Kind: models.PersonKindAuthor, SortOrder: 1}, + {Person: models.Person{Name: "Manual Contributor"}, Kind: models.PersonKindWriter, SortOrder: 2}, + } + desired := []ebookCredit{ + {Name: "Ada Writer", Kind: models.PersonKindAuthor}, + {Name: "Ben Author", Kind: models.PersonKindAuthor}, + } + if !ebookPeopleCreditsEqual(existing, desired) { + t.Fatal("expected matching author credits to compare equal while ignoring non-authors") + } + + existing[1] = models.ItemPerson{Person: models.Person{Name: "Other Author"}, Kind: models.PersonKindAuthor, SortOrder: 1} + if ebookPeopleCreditsEqual(existing, desired) { + t.Fatal("expected different author credit to make ebook author set differ") + } +} + +func TestEbookPeopleCreditsEqualRejectsStaleNarratorCredit(t *testing.T) { + existing := []models.ItemPerson{ + {Person: models.Person{Name: "Ada Writer"}, Kind: models.PersonKindAuthor, SortOrder: 0}, + {Person: models.Person{Name: "Legacy Narrator"}, Kind: models.PersonKindNarrator, SortOrder: 1}, + } + desired := []ebookCredit{ + {Name: "Ada Writer", Kind: models.PersonKindAuthor}, + } + + if ebookPeopleCreditsEqual(existing, desired) { + t.Fatal("expected stale narrator credit to force ebook people replacement") + } +} + +func TestEbookPeopleMergePreservesExistingNonAuthorCreditsExceptNarrators(t *testing.T) { + existing := []models.ItemPerson{ + {Person: models.Person{ID: 10, Name: "Old Author"}, Kind: models.PersonKindAuthor, SortOrder: 0}, + {Person: models.Person{ID: 20, Name: "Manual Writer"}, Kind: models.PersonKindWriter, SortOrder: 1, Character: "essay"}, + {Person: models.Person{ID: 30, Name: "Manual Narrator"}, Kind: models.PersonKindNarrator, SortOrder: 2}, + } + authors := []ebookResolvedAuthor{ + {ID: 40, Name: "New Author"}, + } + + got := mergeEbookPeople(existing, authors) + if len(got) != 2 { + t.Fatalf("merged people len = %d, want 2: %+v", len(got), got) + } + if got[0].Person.ID != 20 || got[0].Kind != models.PersonKindWriter || got[0].Character != "essay" { + t.Fatalf("first preserved non-author = %+v", got[0]) + } + if got[1].Person.ID != 40 || got[1].Kind != models.PersonKindAuthor || got[1].SortOrder != 1 { + t.Fatalf("new author credit = %+v", got[1]) + } +} + +func TestEbookPeopleReplacePlanReturnsGetPeopleError(t *testing.T) { + wantErr := errors.New("get people failed") + _, err := ebookPeopleForReplace(nil, wantErr, []ebookResolvedAuthor{{ID: 40, Name: "New Author"}}) + if !errors.Is(err, wantErr) { + t.Fatalf("error = %v, want %v", err, wantErr) + } +} + +func TestScanEbookBuildMediaFileSetsCorePersistenceFields(t *testing.T) { + modifiedAt := time.Date(2026, 6, 8, 12, 0, 0, 0, time.UTC) + book := &parsedEbook{Format: "epub", Title: "Book", Authors: []string{"Author"}, Year: 2024, ISBN: "9780306406157", PageCount: 321} + + got := buildEbookMediaFile(&models.MediaFolder{ID: 44}, "content-1", "/library/Book.epub", 1234, modifiedAt, book, ebookContentGroupKey(book, "/library/Book.epub")) + if got.ContentID != "content-1" || got.MediaFolderID != 44 { + t.Fatalf("ids = %q/%d, want content-1/44", got.ContentID, got.MediaFolderID) + } + if got.BaseType != "ebook" || got.BaseTitle != "Book" || got.BaseYear != 2024 || got.Container != "epub" || got.ProbeSource != "local" { + t.Fatalf("ebook file metadata = %+v", got) + } + if got.Duration != 321 { + t.Fatalf("Duration = %d, want ebook page count", got.Duration) + } + if got.CanonicalRootPath != "/library/Book.epub" || got.ObservedRootPath != "/library/Book.epub" || got.FilePath != "/library/Book.epub" { + t.Fatalf("ebook paths = canonical %q observed %q file %q", got.CanonicalRootPath, got.ObservedRootPath, got.FilePath) + } + if got.ContentGroupKey != "ebook:isbn:9780306406157" { + t.Fatalf("ContentGroupKey = %q, want ISBN-backed ebook group", got.ContentGroupKey) + } + if got.GroupKeyVersion != ebookGroupKeyVersion { + t.Fatalf("GroupKeyVersion = %d, want %d", got.GroupKeyVersion, ebookGroupKeyVersion) + } + if got.FileSize != 1234 || got.FileModifiedAt == nil || !got.FileModifiedAt.Equal(modifiedAt) { + t.Fatalf("file facts = size %d modified %v", got.FileSize, got.FileModifiedAt) + } +} + +func TestApplyEbookLocalCoverCachesEmbeddedAndSetsPoster(t *testing.T) { + cacher := &fakeEbookCoverCacher{} + updater := &fakeEbookMetadataUpdater{} + + err := applyEbookLocalCover(context.Background(), updater, cacher, "content-1", filepath.Join(t.TempDir(), "book.epub"), &parsedEbook{ + Cover: &parsedEbookCover{ + ContentType: "image/jpeg", + Bytes: []byte("cover-bytes"), + }, + }) + if err != nil { + t.Fatalf("applyEbookLocalCover: %v", err) + } + + if cacher.calls != 1 || cacher.contentID != "content-1" || string(cacher.data) != "cover-bytes" { + t.Fatalf("cache call = calls %d content %q data %q", cacher.calls, cacher.contentID, string(cacher.data)) + } + if updater.setCalls != 1 || updater.contentID != "content-1" { + t.Fatalf("set call = calls %d content %q", updater.setCalls, updater.contentID) + } + if updater.setPosterPath != "local/ebooks/content-1/poster/original.webp" { + t.Fatalf("poster path = %q", updater.setPosterPath) + } + if updater.setThumbhash != "thumb" { + t.Fatalf("poster thumbhash = %q", updater.setThumbhash) + } + if updater.setPrefix != localEbookPosterPrefix { + t.Fatalf("local prefix = %q, want %q", updater.setPrefix, localEbookPosterPrefix) + } +} + +func TestApplyEbookLocalCoverPreservesProviderPoster(t *testing.T) { + cacher := &fakeEbookCoverCacher{} + updater := &fakeEbookMetadataUpdater{posterPath: "ebook-metadata/ebooks/content-1/poster/original.webp"} + + err := applyEbookLocalCover(context.Background(), updater, cacher, "content-1", filepath.Join(t.TempDir(), "book.epub"), &parsedEbook{ + Cover: &parsedEbookCover{Bytes: []byte("cover-bytes")}, + }) + if err != nil { + t.Fatalf("applyEbookLocalCover: %v", err) + } + + if cacher.calls != 0 { + t.Fatalf("cache calls = %d, want 0", cacher.calls) + } + if updater.setCalls != 0 { + t.Fatalf("set calls = %d, want 0", updater.setCalls) + } +} + +func TestApplyEbookLocalCoverRefreshesStaleLocalPoster(t *testing.T) { + cacher := &fakeEbookCoverCacher{} + updater := &fakeEbookMetadataUpdater{ + posterPath: "local/ebooks/content-1/poster/original.webp", + posterThumbhash: "stale-thumb", + } + + err := applyEbookLocalCover(context.Background(), updater, cacher, "content-1", filepath.Join(t.TempDir(), "book.epub"), &parsedEbook{ + Cover: &parsedEbookCover{Bytes: []byte("replacement-cover-bytes")}, + }) + if err != nil { + t.Fatalf("applyEbookLocalCover: %v", err) + } + + if cacher.calls != 1 || string(cacher.data) != "replacement-cover-bytes" { + t.Fatalf("cache call = calls %d data %q, want refresh of locally owned poster", cacher.calls, string(cacher.data)) + } + if updater.setCalls != 1 { + t.Fatalf("set calls = %d, want 1", updater.setCalls) + } +} + +func TestApplyEbookLocalCoverPrefersSidecarOverEmbedded(t *testing.T) { + dir := t.TempDir() + if err := os.WriteFile(filepath.Join(dir, "book.epub"), []byte("book"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + if err := os.WriteFile(filepath.Join(dir, "cover.jpg"), []byte("ebook-sidecar-cover"), 0o644); err != nil { + t.Fatalf("write cover: %v", err) + } + cacher := &fakeEbookCoverCacher{} + updater := &fakeEbookMetadataUpdater{} + + err := applyEbookLocalCover(context.Background(), updater, cacher, "content-1", filepath.Join(dir, "book.epub"), &parsedEbook{ + Cover: &parsedEbookCover{Bytes: []byte("embedded-cover")}, + }) + if err != nil { + t.Fatalf("applyEbookLocalCover: %v", err) + } + + if cacher.calls != 1 || string(cacher.data) != "ebook-sidecar-cover" { + t.Fatalf("cache call = calls %d data %q, want sidecar bytes", cacher.calls, string(cacher.data)) + } + if updater.setCalls != 1 || updater.setPosterPath != "local/ebooks/content-1/poster/original.webp" { + t.Fatalf("poster update = calls %d path %q", updater.setCalls, updater.setPosterPath) + } +} + +func TestFindSidecarBookCoverIgnoresGenericNamesInMultiBookDirectories(t *testing.T) { + dir := t.TempDir() + for _, name := range []string{"alpha.epub", "beta.epub"} { + if err := os.WriteFile(filepath.Join(dir, name), []byte("book"), 0o644); err != nil { + t.Fatalf("write ebook %s: %v", name, err) + } + } + if err := os.WriteFile(filepath.Join(dir, "cover.jpg"), []byte("shared-cover"), 0o644); err != nil { + t.Fatalf("write cover: %v", err) + } + if err := os.WriteFile(filepath.Join(dir, "beta.jpg"), []byte("beta-cover"), 0o644); err != nil { + t.Fatalf("write cover: %v", err) + } + + cover, _, err := findSidecarBookCover(filepath.Join(dir, "alpha.epub")) + if err != nil { + t.Fatalf("findSidecarBookCover(alpha): %v", err) + } + if cover != nil { + t.Fatalf("alpha cover = %q, want none (generic cover.jpg must not claim every book)", string(cover.Bytes)) + } + + cover, _, err = findSidecarBookCover(filepath.Join(dir, "beta.epub")) + if err != nil { + t.Fatalf("findSidecarBookCover(beta): %v", err) + } + if cover == nil || string(cover.Bytes) != "beta-cover" { + t.Fatalf("beta cover = %v, want filename-matched beta.jpg", cover) + } +} + +func TestScanEbookPersistenceSQLWritesLibraryMembershipAndISBNOnly(t *testing.T) { + ctx := context.Background() + exec := &recordingEbookExecutor{} + + if err := insertEbookLibraryMembership(ctx, exec, "content-1", 44); err != nil { + t.Fatalf("insertEbookLibraryMembership: %v", err) + } + if err := insertEbookISBNProviderID(ctx, exec, "content-1", "9780306406157"); err != nil { + t.Fatalf("insertEbookISBNProviderID: %v", err) + } + if len(exec.queries) != 2 { + t.Fatalf("queries = %d, want 2", len(exec.queries)) + } + if !strings.Contains(exec.queries[0], "media_item_libraries") || exec.args[0][0] != "content-1" || exec.args[0][1] != 44 { + t.Fatalf("library membership write = query %q args %+v", exec.queries[0], exec.args[0]) + } + if !strings.Contains(exec.queries[1], "media_item_provider_ids") || !strings.Contains(exec.queries[1], "'isbn'") || !strings.Contains(exec.queries[1], "'ebook'") { + t.Fatalf("ISBN provider write query = %q", exec.queries[1]) + } + if strings.Contains(exec.queries[1], "asin") || exec.args[1][0] != "content-1" || exec.args[1][1] != "9780306406157" { + t.Fatalf("ISBN provider write args/query = query %q args %+v", exec.queries[1], exec.args[1]) + } +} + +func TestCollectEbookRootScansExcludesUnmountedRootFromReconciliation(t *testing.T) { + healthy := t.TempDir() + if err := os.WriteFile(filepath.Join(healthy, "book.epub"), []byte("x"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + unmounted := filepath.Join(t.TempDir(), "gone") + + scans, err := collectEbookRootScans(context.Background(), 44, []string{unmounted, healthy}) + if err != nil { + t.Fatalf("collectEbookRootScans: %v", err) + } + if len(scans) != 2 { + t.Fatalf("scans = %d, want 2", len(scans)) + } + if !scans[0].failed() || scans[0].rootErr == nil { + t.Fatalf("unmounted root scan = %+v, want failed with rootErr", scans[0]) + } + if scans[1].failed() || len(scans[1].files) != 1 { + t.Fatalf("healthy root scan = %+v, want 1 file and no failure", scans[1]) + } + + reconcileRoots, sawFiles := splitEbookReconcileRoots(scans) + if !sawFiles { + t.Fatal("sawFiles = false, want true for the healthy root") + } + if len(reconcileRoots) != 1 || reconcileRoots[0] != healthy { + t.Fatalf("reconcileRoots = %v, want only the healthy root: an unmounted root must never be reconciled (no mass-missing, no deletion)", reconcileRoots) + } +} + +func TestCollectEbookRootScansTreatsNonDirectoryRootAsFailed(t *testing.T) { + dir := t.TempDir() + fileRoot := filepath.Join(dir, "book.epub") + if err := os.WriteFile(fileRoot, []byte("x"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + + scans, err := collectEbookRootScans(context.Background(), 44, []string{fileRoot}) + if err != nil { + t.Fatalf("collectEbookRootScans: %v", err) + } + if len(scans) != 1 || !scans[0].failed() { + t.Fatalf("scans = %+v, want one failed scan for a non-directory root", scans) + } + // The file itself is still indexed; only reconciliation is withheld. + if len(scans[0].files) != 1 { + t.Fatalf("files = %v, want the ebook file root indexed", scans[0].files) + } + if roots, _ := splitEbookReconcileRoots(scans); len(roots) != 0 { + t.Fatalf("reconcileRoots = %v, want none", roots) + } +} + +func TestCollectEbookRootScansMidWalkSubtreeErrorExcludesRoot(t *testing.T) { + if os.Getuid() == 0 { + t.Skip("permission-based subtree failure cannot be simulated as root") + } + root := t.TempDir() + if err := os.WriteFile(filepath.Join(root, "readable.epub"), []byte("x"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + locked := filepath.Join(root, "zz-locked") + if err := os.Mkdir(locked, 0o755); err != nil { + t.Fatalf("mkdir: %v", err) + } + if err := os.WriteFile(filepath.Join(locked, "hidden.epub"), []byte("x"), 0o644); err != nil { + t.Fatalf("write hidden ebook: %v", err) + } + if err := os.Chmod(locked, 0o000); err != nil { + t.Fatalf("chmod: %v", err) + } + t.Cleanup(func() { _ = os.Chmod(locked, 0o755) }) + + scans, err := collectEbookRootScans(context.Background(), 44, []string{root}) + if err != nil { + t.Fatalf("collectEbookRootScans: %v", err) + } + if len(scans) != 1 { + t.Fatalf("scans = %d, want 1", len(scans)) + } + if scans[0].walkFailures == 0 || !scans[0].failed() { + t.Fatalf("scan = %+v, want walk failure recorded for unreadable subtree", scans[0]) + } + if len(scans[0].files) != 1 { + t.Fatalf("files = %v, want the readable ebook still indexed", scans[0].files) + } + // The unseen hidden.epub must not be marked missing: the whole root sits + // out of reconciliation. + if roots, _ := splitEbookReconcileRoots(scans); len(roots) != 0 { + t.Fatalf("reconcileRoots = %v, want none after a mid-walk subtree error", roots) + } +} + +func TestCollectEbookRootScansFollowsSymlinkedRoot(t *testing.T) { + target := t.TempDir() + if err := os.WriteFile(filepath.Join(target, "book.epub"), []byte("x"), 0o644); err != nil { + t.Fatalf("write ebook: %v", err) + } + link := filepath.Join(t.TempDir(), "library") + if err := os.Symlink(target, link); err != nil { + t.Fatalf("symlink: %v", err) + } + + scans, err := collectEbookRootScans(context.Background(), 44, []string{link}) + if err != nil { + t.Fatalf("collectEbookRootScans: %v", err) + } + if len(scans) != 1 || scans[0].failed() { + t.Fatalf("scans = %+v, want one clean scan through the symlinked root", scans) + } + want := filepath.Join(link, "book.epub") + if len(scans[0].files) != 1 || scans[0].files[0] != want { + t.Fatalf("files = %v, want %q recorded under the logical (symlink) path", scans[0].files, want) + } + if roots, sawFiles := splitEbookReconcileRoots(scans); !sawFiles || len(roots) != 1 { + t.Fatalf("reconcileRoots/sawFiles = %v/%v, want symlinked root reconcilable", roots, sawFiles) + } +} + +type fakeEbookCleanupGuard struct { + allowance bool + consumeCalls int + warnings []string + consumeErr error +} + +func (f *fakeEbookCleanupGuard) ConsumeEmptyCleanupAllowance(_ context.Context, _ int) (bool, error) { + f.consumeCalls++ + return f.allowance, f.consumeErr +} + +func (f *fakeEbookCleanupGuard) SetScanWarning(_ context.Context, _ int, code, _ string, _ time.Time) error { + f.warnings = append(f.warnings, code) + return nil +} + +func TestEbookEmptyCleanupAllowedRequiresExplicitAllowance(t *testing.T) { + guard := &fakeEbookCleanupGuard{allowance: false} + + allowed, err := ebookEmptyCleanupAllowed(context.Background(), guard, 44, true) + if err != nil { + t.Fatalf("ebookEmptyCleanupAllowed: %v", err) + } + if allowed { + t.Fatal("allowed = true, want false: an empty root must not reconcile without confirmation") + } + if guard.consumeCalls != 1 { + t.Fatalf("consumeCalls = %d, want 1", guard.consumeCalls) + } + if len(guard.warnings) != 1 || guard.warnings[0] != "empty_root" { + t.Fatalf("warnings = %v, want one empty_root scan warning", guard.warnings) + } +} + +func TestEbookEmptyCleanupAllowedConsumesAllowanceOnce(t *testing.T) { + guard := &fakeEbookCleanupGuard{allowance: true} + + allowed, err := ebookEmptyCleanupAllowed(context.Background(), guard, 44, true) + if err != nil { + t.Fatalf("ebookEmptyCleanupAllowed: %v", err) + } + if !allowed { + t.Fatal("allowed = false, want true once the operator confirmed cleanup") + } + if len(guard.warnings) != 0 { + t.Fatalf("warnings = %v, want none for a confirmed cleanup", guard.warnings) + } +} + +func TestEbookEmptyCleanupAllowedNeverConsumesForSubtreeScans(t *testing.T) { + guard := &fakeEbookCleanupGuard{allowance: true} + + allowed, err := ebookEmptyCleanupAllowed(context.Background(), guard, 44, false) + if err != nil { + t.Fatalf("ebookEmptyCleanupAllowed: %v", err) + } + if allowed || guard.consumeCalls != 0 { + t.Fatalf("allowed/consumeCalls = %v/%d, want subtree scans to skip cleanup without touching the folder allowance", allowed, guard.consumeCalls) + } +} + +func TestEbookEmptyCleanupAllowedNilGuardDeniesCleanup(t *testing.T) { + allowed, err := ebookEmptyCleanupAllowed(context.Background(), nil, 44, true) + if err != nil || allowed { + t.Fatalf("allowed/err = %v/%v, want denial when no guard repository is wired", allowed, err) + } +} + +func TestScanEbookFolderReturnsErrorWhenEveryReconcileFails(t *testing.T) { + root := t.TempDir() + if err := os.WriteFile(filepath.Join(root, "bad.epub"), []byte("not a real epub"), 0o644); err != nil { + t.Fatalf("write fake ebook: %v", err) + } + + s := &Scanner{} + err := s.ScanEbookFolder(context.Background(), &models.MediaFolder{ID: 44, Paths: []string{root}}) + if err == nil { + t.Fatal("ScanEbookFolder returned nil, want aggregate failure") + } + if !strings.Contains(err.Error(), "folder_id=44") { + t.Fatalf("error = %q, want folder id", err) + } +} + +func TestScanEbookFolderReturnsCanceledContext(t *testing.T) { + root := t.TempDir() + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + s := &Scanner{} + err := s.ScanEbookFolder(ctx, &models.MediaFolder{ID: 44, Paths: []string{root}}) + if !errors.Is(err, context.Canceled) { + t.Fatalf("ScanEbookFolder error = %v, want context.Canceled", err) + } +} + +func TestScanEbookFolderReportsProgress(t *testing.T) { + root := t.TempDir() + if err := os.WriteFile(filepath.Join(root, "broken.epub"), []byte("not a zip"), 0o644); err != nil { + t.Fatalf("write ebook fixture: %v", err) + } + var updates []ProgressUpdate + ctx := WithProgressReporter(context.Background(), func(update ProgressUpdate) { + updates = append(updates, update) + }) + + err := (&Scanner{}).ScanEbookFolder(ctx, &models.MediaFolder{ID: 44, Paths: []string{root}}) + if err == nil { + t.Fatal("ScanEbookFolder returned nil, want aggregate failure") + } + + if len(updates) == 0 { + t.Fatal("expected ebook scanner progress updates") + } + if updates[0].Phase != "ebook_scan" || updates[0].TotalFiles != 1 { + t.Fatalf("first progress update = %+v, want ebook_scan discovery total", updates[0]) + } + last := updates[len(updates)-1] + if last.FilesProcessed != 1 || last.Errors != 1 { + t.Fatalf("last progress update = %+v, want processed/error counts", last) + } +} + +func writeTestEPUB(t *testing.T, identifiers []string) string { + return writeTestEPUBWithMeta(t, identifiers, "") +} + +func writeTestEPUBWithMeta(t *testing.T, identifiers []string, extraMetaXML string) string { + return writeTestEPUBWithDescriptionAndMeta(t, identifiers, "Back cover copy", extraMetaXML) +} + +func writeTestEPUBWithDescription(t *testing.T, description string) string { + return writeTestEPUBWithDescriptionAndMeta(t, []string{"ISBN: 978-0-306-40615-7"}, description, "") +} + +func writeTestEPUBWithDescriptionAndMeta(t *testing.T, identifiers []string, description string, extraMetaXML string) string { + t.Helper() + + path := filepath.Join(t.TempDir(), "book.epub") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create epub: %v", err) + } + zw := zip.NewWriter(file) + add := func(name, body string) { + t.Helper() + w, err := zw.Create(name) + if err != nil { + t.Fatalf("create zip entry %s: %v", name, err) + } + if _, err := w.Write([]byte(body)); err != nil { + t.Fatalf("write zip entry %s: %v", name, err) + } + } + add("META-INF/container.xml", ` + + + + +`) + var identifierXML strings.Builder + for _, identifier := range identifiers { + identifierXML.WriteString(" ") + identifierXML.WriteString(identifier) + identifierXML.WriteString("\n") + } + add("OPS/content.opf", ` + + + The Test Ebook + Ada Writer + Ben Author +`+identifierXML.String()+` + Silo Press + 2024-03-10 + en + Fiction + Adventure + `+description+` + + +`+extraMetaXML+` + +`) + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close epub: %v", err) + } + return path +} + +func writeTestEPUBWithOPFBytes(t *testing.T, opf []byte) string { + t.Helper() + + path := filepath.Join(t.TempDir(), "book.epub") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create epub: %v", err) + } + zw := zip.NewWriter(file) + add := func(name string, body []byte) { + t.Helper() + w, err := zw.Create(name) + if err != nil { + t.Fatalf("create zip entry %s: %v", name, err) + } + if _, err := w.Write(body); err != nil { + t.Fatalf("write zip entry %s: %v", name, err) + } + } + add("META-INF/container.xml", []byte(` + + + + +`)) + add("OPS/content.opf", opf) + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close epub: %v", err) + } + return path +} + +func writeTestEPUBWithCover(t *testing.T, coverHref string, coverType string, coverBytes []byte) string { + t.Helper() + + path := filepath.Join(t.TempDir(), "book.epub") + file, err := os.Create(path) + if err != nil { + t.Fatalf("create epub: %v", err) + } + zw := zip.NewWriter(file) + add := func(name string, body []byte) { + t.Helper() + w, err := zw.Create(name) + if err != nil { + t.Fatalf("create zip entry %s: %v", name, err) + } + if _, err := w.Write(body); err != nil { + t.Fatalf("write zip entry %s: %v", name, err) + } + } + add("META-INF/container.xml", []byte(` + + + + +`)) + add("OPS/content.opf", []byte(` + + + The Test Ebook + + + + + +`)) + add("OPS/"+coverHref, coverBytes) + if err := zw.Close(); err != nil { + t.Fatalf("close zip: %v", err) + } + if err := file.Close(); err != nil { + t.Fatalf("close epub: %v", err) + } + return path +} + +func TestUpdateExistingEbookMediaItemPreservesCuratedMatchedItem(t *testing.T) { + reader := &fakeFilesystemItemReader{items: []*models.MediaItem{{ + ContentID: "ebook-root-id", + Type: "ebook", + Title: "Curated Title", + Year: 2020, + Status: "matched", + }}} + writer := &fakeFilesystemItemWriter{} + + curated, err := updateExistingEbookMediaItem(context.Background(), reader, writer, "ebook-root-id", &parsedEbook{ + Title: "Embedded File Title", + Year: 2026, + }) + if err != nil { + t.Fatalf("updateExistingEbookMediaItem: %v", err) + } + if !curated { + t.Fatal("curated = false, want true for a matched item") + } + if len(writer.upserts) != 0 { + t.Fatalf("upserts = %d, want 0: matched items must not be overwritten by file metadata", len(writer.upserts)) + } +} + +func TestEbookItemHasCuratedMetadata(t *testing.T) { + cases := []struct { + item *models.MediaItem + want bool + }{ + {nil, false}, + {&models.MediaItem{Status: "matched"}, true}, + {&models.MediaItem{Status: " Matched "}, true}, + {&models.MediaItem{Status: "pending"}, false}, + {&models.MediaItem{Status: "unmatched"}, false}, + {&models.MediaItem{}, false}, + } + for _, tc := range cases { + if got := ebookItemHasCuratedMetadata(tc.item); got != tc.want { + t.Errorf("ebookItemHasCuratedMetadata(%+v) = %v, want %v", tc.item, got, tc.want) + } + } +} + +func TestParseEbookPDFReadsInfoDictionaryFromFileTail(t *testing.T) { + // Non-linearized PDFs put the Info dictionary at the end of the file and + // typically have no Info keys in the head at all; the parser must find the + // trailing dictionary past the head scan window and use it to fill every + // key the head did not produce. + head := "%PDF-1.7\n" + + "1 0 obj\n" + + "<< /Author (Ada Writer)\n" + + ">>\nendobj\n" + tail := "2 0 obj\n" + + "<< /Title (Tail Info Title)\n" + + " /CreationDate (D:20240102030405Z)\n" + + ">>\nendobj\n" + + "trailer\n<< /Info 2 0 R >>\n%%EOF" + padding := strings.Repeat("x", maxPDFMetadataScanSize) + + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte(head+padding+tail), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + if got.Title != "Tail Info Title" { + t.Fatalf("Title = %q, want tail Info dictionary value", got.Title) + } + if strings.Join(got.Authors, ", ") != "Ada Writer" { + t.Fatalf("Authors = %v, want head-only value preserved", got.Authors) + } + if got.Year != 2024 { + t.Fatalf("Year = %d, want 2024 from tail CreationDate", got.Year) + } +} + +func TestParseEbookPDFHeadInfoWinsOverTailStreamGarbage(t *testing.T) { + // Linearized PDFs carry the real Info dictionary in the head; a + // "/Title"-shaped byte pattern inside a trailing compressed stream must + // not replace it. + head := "%PDF-1.7\n" + + "1 0 obj\n" + + "<< /Linearized 1 >>\nendobj\n" + + "2 0 obj\n" + + "<< /Title (Real Head Title)\n" + + " /Author (Ada Writer)\n" + + ">>\nendobj\n" + tail := "3 0 obj\n" + + "<< /Length 64 >>\nstream\n" + + "\x01\x02/Title (\xfe\xba\xad binary stream garbage)\x03\x04\n" + + "endstream\nendobj\n" + + "trailer\n<< /Info 2 0 R >>\n%%EOF" + padding := strings.Repeat("x", maxPDFMetadataScanSize) + + path := filepath.Join(t.TempDir(), "book.pdf") + if err := os.WriteFile(path, []byte(head+padding+tail), 0o644); err != nil { + t.Fatalf("write pdf: %v", err) + } + + got, err := parseEbookFile(path) + if err != nil { + t.Fatalf("parseEbookFile: %v", err) + } + if got.Title != "Real Head Title" { + t.Fatalf("Title = %q, want authoritative head value over tail stream garbage", got.Title) + } +} + +func TestFindPDFInfoValueRequiresProperKeyDelimiter(t *testing.T) { + // "/TitleSort" must not satisfy a "/Title" lookup, and the real key later + // in the window must still be found. + data := []byte(`<< /TitleSort (Adventures of, The) /Title (The Adventures) >>`) + value, ok := findPDFInfoValue(data, "Title") + if !ok || value != "The Adventures" { + t.Fatalf("findPDFInfoValue = %q, %v; want the properly delimited /Title", value, ok) + } +} + +func TestFindPDFInfoValueRetriesPastUnparseableOccurrences(t *testing.T) { + // A key match inside binary stream data whose "value" is not a PDF string + // must not end the search; the real key/value pair later in the window + // still wins. + data := []byte("stream\x00/Title \x07\x08garbage\x00endstream\n" + + "<< /Title (Recovered Title) >>") + value, ok := findPDFInfoValue(data, "Title") + if !ok || value != "Recovered Title" { + t.Fatalf("findPDFInfoValue = %q, %v; want recovery past unparseable match", value, ok) + } + + if _, ok := findPDFInfoValue([]byte("/Titled (Nope)"), "Title"); ok { + t.Fatal("findPDFInfoValue matched a longer key sharing the prefix") + } +} + +func TestParseEbookFB2RejectsOversizedFile(t *testing.T) { + path := filepath.Join(t.TempDir(), "book.fb2") + if err := os.WriteFile(path, make([]byte, maxEPUBMetadataEntrySize+1), 0o644); err != nil { + t.Fatalf("write fb2: %v", err) + } + + _, err := parseEbookFile(path) + if err == nil || !strings.Contains(err.Error(), "too large") { + t.Fatalf("parseEbookFile error = %v, want size-cap rejection", err) + } +} diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index 89040001..a084268c 100644 --- a/internal/scanner/scanner.go +++ b/internal/scanner/scanner.go @@ -97,9 +97,12 @@ func shouldSkipMovieSupplementalFile(path string) bool { } // Scanner discovers and indexes media files in media folders. -// scannerImageCacher is the slice of imagecache.Cacher the audiobook -// branch uses. Wired via SetImageCacher; nil-safe when absent. -type scannerImageCacher = audiobookCoverCacher +// scannerImageCacher is the slice of imagecache.Cacher the book scanners use. +// Wired via SetImageCacher; nil-safe when absent. +type scannerImageCacher interface { + audiobookCoverCacher + ebookCoverCacher +} type Scanner struct { fileRepo *FileRepository @@ -126,9 +129,9 @@ type Scanner struct { seriesQueueSyncer SeriesQueueSyncer } -// SetImageCacher installs the imagecache.Cacher used by the audiobook -// branch to push embedded M4B cover art into the public assets bucket. -// Optional; if unset, audiobook covers are not extracted. +// SetImageCacher installs the imagecache.Cacher used by book scanners to push +// embedded cover art into the public assets bucket. Optional; if unset, local +// covers are not extracted. func (s *Scanner) SetImageCacher(cacher scannerImageCacher) { if s == nil { return @@ -241,6 +244,13 @@ func (s *Scanner) ScanFolder(ctx context.Context, folder *models.MediaFolder) (* return &ScanResult{}, nil } + if isEbookLibraryType(folder.Type) { + if err := s.ScanEbookFolder(watchCtx, folder); err != nil { + return nil, err + } + return &ScanResult{}, nil + } + return s.scanPaths(watchCtx, folder, folder.Paths, folder.Paths, true) } @@ -263,6 +273,12 @@ func (s *Scanner) ScanSubtree(ctx context.Context, folder *models.MediaFolder, s } return &ScanResult{}, nil } + if isEbookLibraryType(folder.Type) { + if err := s.scanEbookPaths(watchCtx, folder, []string{cleanSubtree}, false); err != nil { + return nil, err + } + return &ScanResult{}, nil + } return s.scanPaths(watchCtx, folder, []string{cleanSubtree}, []string{cleanSubtree}, false) } @@ -309,6 +325,15 @@ func isPodcastLibraryType(libraryType string) bool { } } +func isEbookLibraryType(libraryType string) bool { + switch strings.ToLower(strings.TrimSpace(libraryType)) { + case "ebook", "ebooks": + return true + default: + return false + } +} + // walkMode tells walkLogicalTree which file extensions to surface and // which library-specific filename heuristics (sample/extra skipping) // to apply. @@ -319,6 +344,7 @@ const ( walkModeMovie // movie library: video extensions + sample/extra skipping walkModeAudiobook // audiobook library: audio extensions, no skipping walkModePodcast // podcast library: audio extensions, no skipping + walkModeEbook // ebook library: ebook extensions, no skipping ) // walkModeFor derives a walkMode from a media_folders.type string. @@ -332,6 +358,8 @@ func walkModeFor(folderType string) walkMode { return walkModeAudiobook case isPodcastLibraryType(folderType): return walkModePodcast + case isEbookLibraryType(folderType): + return walkModeEbook default: return walkModeVideo } @@ -343,6 +371,8 @@ func (m walkMode) acceptsExt(ext string) bool { switch m { case walkModeAudiobook, walkModePodcast: return audioExtensions[ext] + case walkModeEbook: + return ebookExtensions[ext] default: return videoExtensions[ext] } @@ -364,6 +394,16 @@ func isIgnoredDirectoryPath(path string) bool { return ignoredDirNames[strings.ToLower(filepath.Base(path))] } +// recordWalkFailure counts an entry the walk could not read or resolve. +// Callers that pass a non-nil counter (the book scanners) use it to exclude +// incompletely walked roots from missing-file reconciliation; the video walk +// passes nil and keeps its historical log-and-continue behavior. +func recordWalkFailure(failures *int) { + if failures != nil { + *failures++ + } +} + func walkLogicalTree( ctx context.Context, logicalPath string, @@ -371,6 +411,7 @@ func walkLogicalTree( mode walkMode, visitedPhysicalDirs map[string]struct{}, filePaths *[]string, + walkFailures *int, ) error { if ctx != nil { if err := ctx.Err(); err != nil { @@ -381,6 +422,7 @@ func walkLogicalTree( info, err := os.Lstat(physicalPath) if err != nil { slog.Warn("scanner: walk lstat failed", "path", logicalPath, "physical_path", physicalPath, "error", err) + recordWalkFailure(walkFailures) return nil } @@ -388,15 +430,17 @@ func walkLogicalTree( resolved, err := filepath.EvalSymlinks(physicalPath) if err != nil { slog.Warn("scanner: symlink resolve failed", "path", logicalPath, "physical_path", physicalPath, "error", err) + recordWalkFailure(walkFailures) return nil } targetInfo, err := os.Stat(resolved) if err != nil { slog.Warn("scanner: symlink stat failed", "path", logicalPath, "resolved_path", resolved, "error", err) + recordWalkFailure(walkFailures) return nil } if targetInfo.IsDir() { - return walkLogicalTree(ctx, logicalPath, resolved, mode, visitedPhysicalDirs, filePaths) + return walkLogicalTree(ctx, logicalPath, resolved, mode, visitedPhysicalDirs, filePaths, walkFailures) } if mode == walkModeMovie && shouldSkipMovieSupplementalFile(logicalPath) { return nil @@ -420,6 +464,7 @@ func walkLogicalTree( canonicalDir, err := canonicalWalkPath(physicalPath) if err != nil { slog.Warn("scanner: canonical path resolution failed", "path", logicalPath, "physical_path", physicalPath, "error", err) + recordWalkFailure(walkFailures) return nil } if _, seen := visitedPhysicalDirs[canonicalDir]; seen { @@ -437,6 +482,7 @@ func walkLogicalTree( entries, err := os.ReadDir(physicalPath) if err != nil { slog.Warn("scanner: directory read failed", "path", logicalPath, "physical_path", physicalPath, "error", err) + recordWalkFailure(walkFailures) return nil } for _, entry := range entries { @@ -453,15 +499,17 @@ func walkLogicalTree( resolved, err := filepath.EvalSymlinks(physicalChild) if err != nil { slog.Warn("scanner: symlink resolve failed", "path", logicalChild, "physical_path", physicalChild, "error", err) + recordWalkFailure(walkFailures) continue } targetInfo, err := os.Stat(resolved) if err != nil { slog.Warn("scanner: symlink stat failed", "path", logicalChild, "resolved_path", resolved, "error", err) + recordWalkFailure(walkFailures) continue } if targetInfo.IsDir() { - if err := walkLogicalTree(ctx, logicalChild, resolved, mode, visitedPhysicalDirs, filePaths); err != nil { + if err := walkLogicalTree(ctx, logicalChild, resolved, mode, visitedPhysicalDirs, filePaths, walkFailures); err != nil { return err } continue @@ -476,7 +524,7 @@ func walkLogicalTree( } if entry.IsDir() { - if err := walkLogicalTree(ctx, logicalChild, physicalChild, mode, visitedPhysicalDirs, filePaths); err != nil { + if err := walkLogicalTree(ctx, logicalChild, physicalChild, mode, visitedPhysicalDirs, filePaths, walkFailures); err != nil { return err } continue @@ -508,7 +556,7 @@ func collectLogicalFilePaths(ctx context.Context, walkRoots []string, libraryTyp if cleanRoot == "" || cleanRoot == "." { continue } - if err := walkLogicalTree(ctx, cleanRoot, cleanRoot, mode, visitedPhysicalDirs, &filePaths); err != nil { + if err := walkLogicalTree(ctx, cleanRoot, cleanRoot, mode, visitedPhysicalDirs, &filePaths, nil); err != nil { return nil, err } } diff --git a/internal/scanner/scanner_test.go b/internal/scanner/scanner_test.go index edde4348..d548c264 100644 --- a/internal/scanner/scanner_test.go +++ b/internal/scanner/scanner_test.go @@ -200,3 +200,76 @@ func TestIsPodcastLibraryType(t *testing.T) { } } } + +func TestIsEbookLibraryType(t *testing.T) { + cases := []struct { + in string + want bool + }{ + {"ebooks", true}, + {"ebook", true}, + {"Ebook", true}, + {" EBOOKS ", true}, + {"audiobooks", false}, + {"movies", false}, + {"", false}, + } + for _, tc := range cases { + if got := isEbookLibraryType(tc.in); got != tc.want { + t.Errorf("isEbookLibraryType(%q) = %v, want %v", tc.in, got, tc.want) + } + } +} + +func TestWalkModeForEbookLibraryTypes(t *testing.T) { + for _, libraryType := range []string{"ebook", "ebooks", " EBOOKS "} { + if got := walkModeFor(libraryType); got != walkModeEbook { + t.Fatalf("walkModeFor(%q) = %v, want %v", libraryType, got, walkModeEbook) + } + } +} + +func TestWalkModeEbookAcceptsEbookExtensionsOnly(t *testing.T) { + for _, ext := range []string{".epub", ".pdf", ".mobi", ".azw", ".azw3", ".fb2", ".fbz", ".cbz", ".cbr"} { + if !walkModeEbook.acceptsExt(ext) { + t.Fatalf("walkModeEbook should accept %s", ext) + } + } + for _, ext := range []string{".txt", ".md", ".mp4", ".mp3", ".mkv"} { + if walkModeEbook.acceptsExt(ext) { + t.Fatalf("walkModeEbook should reject %s", ext) + } + } +} + +func TestScanFolderEbookLibraryRoutesToEbookScanner(t *testing.T) { + scanner := &Scanner{} + result, err := scanner.ScanFolder(context.Background(), &models.MediaFolder{ + ID: 0, + Type: " ebooks ", + Paths: []string{t.TempDir()}, + }) + if err != nil { + t.Fatalf("ScanFolder ebook error = %v, want nil", err) + } + if result == nil { + t.Fatal("ScanFolder ebook result = nil, want empty result") + } +} + +func TestScanSubtreeEbookLibraryRoutesToEbookScanner(t *testing.T) { + subtree := t.TempDir() + + scanner := &Scanner{} + result, err := scanner.ScanSubtree(context.Background(), &models.MediaFolder{ + ID: 0, + Type: "ebook", + Paths: []string{subtree}, + }, subtree) + if err != nil { + t.Fatalf("ScanSubtree ebook error = %v, want nil", err) + } + if result == nil { + t.Fatal("ScanSubtree ebook result = nil, want empty result") + } +} diff --git a/internal/sections/defaults.go b/internal/sections/defaults.go index 1d27ec80..409546bc 100644 --- a/internal/sections/defaults.go +++ b/internal/sections/defaults.go @@ -199,6 +199,14 @@ func DefaultLibrarySectionsForType(libraryID *int, libraryType string) []*PageSe {ID: "default-recommended-for-you", Scope: "library", LibraryID: libraryID, Position: 4, SectionType: SectionRecommendedForYou, Title: "Recommended for You", ItemLimit: 20, Config: emptyCfg, Enabled: true}, {ID: "default-random-audiobooks", Scope: "library", LibraryID: libraryID, Position: 5, SectionType: SectionRandom, Title: "Random Picks", ItemLimit: 20, Config: defaultMediaScopeConfig("audiobook"), Enabled: true}, } + case "ebooks", "ebook": + return []*PageSection{ + {ID: "default-continue-reading", Scope: "library", LibraryID: libraryID, Position: 0, SectionType: SectionContinueWatching, Title: "Continue Reading", ItemLimit: 20, Config: ContinueTypeConfig(ContinueTypeReading), Enabled: true}, + {ID: "default-recently-added-ebooks", Scope: "library", LibraryID: libraryID, Position: 1, SectionType: SectionRecentlyAdded, Title: "Recently Added Ebooks", ItemLimit: 20, Config: defaultMediaScopeConfig("ebook"), Enabled: true}, + {ID: "default-recently-released-ebooks", Scope: "library", LibraryID: libraryID, Position: 2, SectionType: SectionRecentlyReleased, Title: "Recently Released Ebooks", ItemLimit: 20, Config: defaultMediaScopeConfig("ebook"), Enabled: true}, + {ID: "default-recommended-for-you", Scope: "library", LibraryID: libraryID, Position: 3, SectionType: SectionRecommendedForYou, Title: "Recommended for You", ItemLimit: 20, Config: emptyCfg, Enabled: true}, + {ID: "default-random-ebooks", Scope: "library", LibraryID: libraryID, Position: 4, SectionType: SectionRandom, Title: "Random Picks", ItemLimit: 20, Config: defaultMediaScopeConfig("ebook"), Enabled: true}, + } default: return DefaultLibrarySections(libraryID) } diff --git a/internal/sections/defaults_test.go b/internal/sections/defaults_test.go index af874e54..7b1b898e 100644 --- a/internal/sections/defaults_test.go +++ b/internal/sections/defaults_test.go @@ -323,6 +323,69 @@ func TestDefaultLibrarySectionsForTypeAudiobooks(t *testing.T) { }) } +func TestDefaultLibrarySectionsForTypeEbooks(t *testing.T) { + libraryID := 11 + got := DefaultLibrarySectionsForType(&libraryID, "ebooks") + + if len(got) != 5 { + t.Fatalf("expected 5 ebook default sections, got %d", len(got)) + } + + tests := []struct { + index int + id string + sectionType SectionType + title string + position int + }{ + {index: 0, id: "default-continue-reading", sectionType: SectionContinueWatching, title: "Continue Reading", position: 0}, + {index: 1, id: "default-recently-added-ebooks", sectionType: SectionRecentlyAdded, title: "Recently Added Ebooks", position: 1}, + {index: 2, id: "default-recently-released-ebooks", sectionType: SectionRecentlyReleased, title: "Recently Released Ebooks", position: 2}, + {index: 3, id: "default-recommended-for-you", sectionType: SectionRecommendedForYou, title: "Recommended for You", position: 3}, + {index: 4, id: "default-random-ebooks", sectionType: SectionRandom, title: "Random Picks", position: 4}, + } + + for _, tt := range tests { + section := got[tt.index] + if section.ID != tt.id { + t.Fatalf("section %d id = %q, want %q", tt.index, section.ID, tt.id) + } + if section.SectionType != tt.sectionType { + t.Fatalf("section %d type = %q, want %q", tt.index, section.SectionType, tt.sectionType) + } + if section.Title != tt.title { + t.Fatalf("section %d title = %q, want %q", tt.index, section.Title, tt.title) + } + if section.Position != tt.position { + t.Fatalf("section %d position = %d, want %d", tt.index, section.Position, tt.position) + } + if section.Featured { + t.Fatalf("section %d featured = true, want false", tt.index) + } + } + + assertContinueType(t, got[0].Config, ContinueTypeReading) + assertQueryDefinition(t, got[1].Config, catalog.QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []catalog.QueryGroup{}, + Sort: catalog.QuerySort{Field: "added_at", Order: "desc"}, + }) + assertQueryDefinition(t, got[2].Config, catalog.QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []catalog.QueryGroup{}, + Sort: catalog.QuerySort{Field: "added_at", Order: "desc"}, + }) + assertEmptyJSON(t, got[3].Config) + assertQueryDefinition(t, got[4].Config, catalog.QueryDefinition{ + MediaScope: "ebook", + Match: "all", + Groups: []catalog.QueryGroup{}, + Sort: catalog.QuerySort{Field: "added_at", Order: "desc"}, + }) +} + func TestDefaultLibrarySectionsForTypeMixed(t *testing.T) { libraryID := 99 got := DefaultLibrarySectionsForType(&libraryID, "mixed") diff --git a/internal/sections/fetcher.go b/internal/sections/fetcher.go index a220ee85..c28ee8dc 100644 --- a/internal/sections/fetcher.go +++ b/internal/sections/fetcher.go @@ -382,35 +382,39 @@ func (f *Fetcher) fetchContinueWatchingSection(ctx context.Context, resolved Res orderedItems := make([]*models.MediaItem, 0, limit) itemMeta := make(map[string]SectionItemMeta) - for offset := 0; len(orderedItems) < limit && offset < continueProgressMaxScanned; offset += continueProgressPageSize { - pageLimit := continueProgressPageSize - if remaining := continueProgressMaxScanned - offset; remaining < pageLimit { - pageLimit = remaining - } - progressEntries, err := store.ListProgress(ctx, profileID, "in_progress", pageLimit, offset) - if err != nil { - return SectionWithItems{}, fmt.Errorf("listing progress: %w", err) - } - if len(progressEntries) == 0 { - break - } - rawProgressCount := len(progressEntries) - progressEntries = dismissals.FilterProgress(progressEntries) - - pageItems, pageMeta, err := f.fetchContinueProgressItems(ctx, store, profileID, progressEntries, continueType, effectiveLibID, effectiveLibraryIDs, filter) + // Ebook resume points live in ebook_reader_progress rather than the + // watch-progress store, so reading sections pull from that table and skip + // the next-up handling below. + if continueType == ContinueTypeReading { + orderedItems, err = f.collectContinueProgressItems(ctx, store, profileID, dismissals, continueType, effectiveLibID, effectiveLibraryIDs, filter, limit, orderedItems, itemMeta, + func(pageLimit, offset int) ([]userstore.WatchProgress, error) { + entries, err := f.listEbookContinueWatchingProgress(ctx, userID, profileID, pageLimit, offset) + if err != nil { + return nil, fmt.Errorf("listing ebook reader progress: %w", err) + } + return entries, nil + }) if err != nil { return SectionWithItems{}, err } - for _, item := range pageItems { - if len(orderedItems) >= limit { - break + return SectionWithItems{ + ResolvedSection: resolved, + Items: orderedItems, + TotalCount: len(orderedItems), + ItemMeta: itemMeta, + }, nil + } + + orderedItems, err = f.collectContinueProgressItems(ctx, store, profileID, dismissals, continueType, effectiveLibID, effectiveLibraryIDs, filter, limit, orderedItems, itemMeta, + func(pageLimit, offset int) ([]userstore.WatchProgress, error) { + entries, err := store.ListProgress(ctx, profileID, "in_progress", pageLimit, offset) + if err != nil { + return nil, fmt.Errorf("listing progress: %w", err) } - orderedItems = append(orderedItems, item) - } - maps.Copy(itemMeta, pageMeta) - if rawProgressCount < pageLimit { - break - } + return entries, nil + }) + if err != nil { + return SectionWithItems{}, err } nextUpMode := "" @@ -454,6 +458,137 @@ func (f *Fetcher) fetchContinueWatchingSection(ctx context.Context, resolved Res }, nil } +// collectContinueProgressItems pages through in-progress entries from +// listPage, drops dismissed entries, resolves the remainder to media items, +// and appends them to orderedItems until limit is reached, the source is +// exhausted, or continueProgressMaxScanned entries have been scanned. Paging +// past the requested limit matters because dismissal filtering and +// library/access scoping happen after the source query: trimming at the +// source LIMIT would under-fill the section whenever dismissals exist. +func (f *Fetcher) collectContinueProgressItems( + ctx context.Context, + store userstore.UserStore, + profileID string, + dismissals catalog.HomeDismissalIndex, + continueType ContinueType, + libraryID *int, + libraryIDs []int, + filter catalog.AccessFilter, + limit int, + orderedItems []*models.MediaItem, + itemMeta map[string]SectionItemMeta, + listPage func(pageLimit, offset int) ([]userstore.WatchProgress, error), +) ([]*models.MediaItem, error) { + // LIMIT/OFFSET pages over a live, updated_at-ordered source: a progress + // write between page fetches shifts rows across page boundaries, so the + // same content_id can be returned on two consecutive pages. Track what has + // already been appended so a card never appears twice in one section. + seen := make(map[string]struct{}, limit) + for _, item := range orderedItems { + seen[item.ContentID] = struct{}{} + } + for offset := 0; len(orderedItems) < limit && offset < continueProgressMaxScanned; offset += continueProgressPageSize { + pageLimit := continueProgressPageSize + if remaining := continueProgressMaxScanned - offset; remaining < pageLimit { + pageLimit = remaining + } + progressEntries, err := listPage(pageLimit, offset) + if err != nil { + return nil, err + } + if len(progressEntries) == 0 { + break + } + rawProgressCount := len(progressEntries) + progressEntries = dismissals.FilterProgress(progressEntries) + + pageItems, pageMeta, err := f.fetchContinueProgressItems(ctx, store, profileID, progressEntries, continueType, libraryID, libraryIDs, filter) + if err != nil { + return nil, err + } + orderedItems = appendUniqueContinueItems(orderedItems, pageItems, seen, limit) + maps.Copy(itemMeta, pageMeta) + if rawProgressCount < pageLimit { + break + } + } + return orderedItems, nil +} + +// appendUniqueContinueItems appends pageItems to orderedItems up to limit, +// skipping content IDs already recorded in seen and recording every appended +// ID. Pages come from a live LIMIT/OFFSET scan, so without this guard an item +// shifted across a page boundary by a concurrent progress write would surface +// twice in the same section. +func appendUniqueContinueItems(orderedItems, pageItems []*models.MediaItem, seen map[string]struct{}, limit int) []*models.MediaItem { + for _, item := range pageItems { + if len(orderedItems) >= limit { + break + } + if _, dup := seen[item.ContentID]; dup { + continue + } + seen[item.ContentID] = struct{}{} + orderedItems = append(orderedItems, item) + } + return orderedItems +} + +// ebookContinueWatchingProgressQuery lists in-progress ebook resume points for +// Continue Reading. Like the video path (pgstore ListProgress "in_progress"), +// rows the user hid via user_history_hidden_items are excluded while reading +// activity after hidden_before counts again. +var ebookContinueWatchingProgressQuery = fmt.Sprintf(` + SELECT content_id, progress::double precision, updated_at + FROM ebook_reader_progress + WHERE user_id = $1 + AND profile_id = $2 + AND progress > 0 + AND progress < %s + AND NOT EXISTS ( + SELECT 1 + FROM user_history_hidden_items hhi + WHERE hhi.user_id = ebook_reader_progress.user_id + AND hhi.profile_id = ebook_reader_progress.profile_id + AND hhi.media_item_id = ebook_reader_progress.content_id + AND ebook_reader_progress.updated_at <= hhi.hidden_before + ) + ORDER BY updated_at DESC, content_id ASC + LIMIT $3 OFFSET $4 +`, catalog.EbookFinishedProgressThresholdSQL) + +func (f *Fetcher) listEbookContinueWatchingProgress(ctx context.Context, userID int, profileID string, limit, offset int) ([]userstore.WatchProgress, error) { + if f.pool == nil || userID <= 0 || profileID == "" || limit <= 0 { + return nil, nil + } + + rows, err := f.pool.Query(ctx, ebookContinueWatchingProgressQuery, userID, profileID, limit, offset) + if err != nil { + return nil, err + } + defer rows.Close() + + entries := make([]userstore.WatchProgress, 0) + for rows.Next() { + var contentID string + var progress float64 + var updatedAt time.Time + if err := rows.Scan(&contentID, &progress, &updatedAt); err != nil { + return nil, err + } + entries = append(entries, userstore.WatchProgress{ + MediaItemID: contentID, + PositionSeconds: progress, + DurationSeconds: 1, + UpdatedAt: updatedAt.UTC().Format(time.RFC3339), + }) + } + if err := rows.Err(); err != nil { + return nil, err + } + return entries, nil +} + const ( continueProgressPageSize = 100 continueProgressMaxScanned = 1000 diff --git a/internal/sections/fetcher_continue_watching_test.go b/internal/sections/fetcher_continue_watching_test.go index cd8a217d..6efaeaf6 100644 --- a/internal/sections/fetcher_continue_watching_test.go +++ b/internal/sections/fetcher_continue_watching_test.go @@ -1,6 +1,7 @@ package sections import ( + "strings" "testing" "time" @@ -148,6 +149,76 @@ func TestParseContinueTypeRejectsUnknownExplicitType(t *testing.T) { } } +func TestEbookContinueWatchingProgressQueryGatesHiddenHistory(t *testing.T) { + t.Parallel() + + query := strings.Join(strings.Fields(ebookContinueWatchingProgressQuery), " ") + + // Continue Reading must honor user_history_hidden_items with the same + // semantics as the video path (pgstore ListProgress "in_progress"): a row + // is hidden while updated_at <= hidden_before and counts again once new + // reading activity lands after hidden_before. + for _, term := range []string{ + "FROM ebook_reader_progress", + "NOT EXISTS", + "FROM user_history_hidden_items hhi", + "hhi.media_item_id = ebook_reader_progress.content_id", + "ebook_reader_progress.updated_at <= hhi.hidden_before", + } { + if !strings.Contains(query, term) { + t.Fatalf("ebook continue watching query missing %q:\n%s", term, query) + } + } +} + +func TestAppendUniqueContinueItemsDedupesAcrossPages(t *testing.T) { + t.Parallel() + + seen := make(map[string]struct{}) + limit := 4 + + pageOne := []*models.MediaItem{ + {ContentID: "book-a"}, + {ContentID: "book-b"}, + } + ordered := appendUniqueContinueItems(nil, pageOne, seen, limit) + + // A progress write between pages shifts rows across the LIMIT/OFFSET + // boundary, so page two re-serves book-b. + pageTwo := []*models.MediaItem{ + {ContentID: "book-b"}, + {ContentID: "book-c"}, + } + ordered = appendUniqueContinueItems(ordered, pageTwo, seen, limit) + + got := contentIDs(ordered) + want := []string{"book-a", "book-b", "book-c"} + if len(got) != len(want) { + t.Fatalf("ordered IDs = %v, want %v", got, want) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("ordered IDs = %v, want %v", got, want) + } + } +} + +func TestAppendUniqueContinueItemsRespectsLimit(t *testing.T) { + t.Parallel() + + seen := make(map[string]struct{}) + page := []*models.MediaItem{ + {ContentID: "a"}, + {ContentID: "b"}, + {ContentID: "c"}, + } + + ordered := appendUniqueContinueItems(nil, page, seen, 2) + if got := contentIDs(ordered); len(got) != 2 || got[0] != "a" || got[1] != "b" { + t.Fatalf("ordered IDs = %v, want [a b]", got) + } +} + func contentIDs(items []*models.MediaItem) []string { ids := make([]string, 0, len(items)) for _, item := range items { diff --git a/internal/server/frontend.go b/internal/server/frontend.go index 21df49bb..0e937f1e 100644 --- a/internal/server/frontend.go +++ b/internal/server/frontend.go @@ -10,6 +10,43 @@ import ( // When nil, FrontendHandler returns a placeholder response. var WebDistFS fs.FS +// frontendContentSecurityPolicy is served with every SPA HTML response. +// +// SECURITY: this policy is the primary mitigation for malicious ebook content. +// The in-app reader (foliate-js) renders book chapters in same-origin blob: +// iframes with allow-scripts (required to work around a WebKit bug), and +// blob:/srcdoc documents inherit the embedding document's CSP. With +// script-src 'self', scripts embedded in an EPUB (blob:/inline/data: sources) +// cannot execute, so a hostile book cannot read localStorage tokens or call +// the API. Do not add 'unsafe-inline', 'unsafe-eval', blob:, or data: to +// script-src without revisiting that threat model. +// +// Allowances beyond 'self' exist for concrete app needs: +// - script-src 'wasm-unsafe-eval': JASSUB (libass) subtitle rendering and +// node-unrar-js CBR extraction compile WebAssembly. +// - style-src blob: and 'unsafe-inline': foliate-js loads EPUB stylesheets +// via blob: URLs; the app uses inline style attributes. Google Fonts CSS +// is linked from index.html. +// - img-src/media-src http(s): artwork can come from TMDB/TVDB/S3 public +// URLs, and stream URLs may point at standalone proxy/transcode workers +// on another origin (proxy public_url, plain http on LANs). +// - connect-src http(s)/ws(s): realtime session hub WebSockets, browser-side +// Plex auth (plex.tv), and HLS fetches against standalone worker origins. +// - font-src blob: data: plus fonts.gstatic.com for Google Fonts; reader +// book fonts load from blob: URLs. +const frontendContentSecurityPolicy = "default-src 'self'; " + + "script-src 'self' 'wasm-unsafe-eval'; " + + "style-src 'self' 'unsafe-inline' blob: https://fonts.googleapis.com; " + + "img-src 'self' blob: data: http: https:; " + + "font-src 'self' blob: data: https://fonts.gstatic.com; " + + "media-src 'self' blob: http: https:; " + + "connect-src 'self' ws: wss: http: https:; " + + "worker-src 'self' blob:; " + + "frame-src 'self' blob:; " + + "object-src 'none'; " + + "base-uri 'self'; " + + "form-action 'self'" + // FrontendHandler returns an http.Handler that serves the embedded SPA. // It serves static files from WebDistFS and falls back to index.html for // SPA routing (any path that doesn't match a file). @@ -17,6 +54,7 @@ func FrontendHandler() http.Handler { if WebDistFS == nil { return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "text/plain") + w.Header().Set("X-Content-Type-Options", "nosniff") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("Frontend not built. Run: cd web && bun run build")) }) @@ -25,10 +63,12 @@ func FrontendHandler() http.Handler { fileServer := http.FileServer(http.FS(WebDistFS)) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Content-Type-Options", "nosniff") path := r.URL.Path - // Try to serve the file directly - if path != "/" && !strings.HasSuffix(path, "/") { + // Try to serve the file directly. index.html is excluded so the SPA + // HTML always goes through the fallback below and carries the CSP. + if path != "/" && path != "/index.html" && !strings.HasSuffix(path, "/") { if f, err := WebDistFS.Open(strings.TrimPrefix(path, "/")); err == nil { f.Close() fileServer.ServeHTTP(w, r) @@ -43,6 +83,7 @@ func FrontendHandler() http.Handler { return } w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("Content-Security-Policy", frontendContentSecurityPolicy) w.WriteHeader(http.StatusOK) _, _ = w.Write(indexBytes) }) diff --git a/internal/server/frontend_test.go b/internal/server/frontend_test.go new file mode 100644 index 00000000..fbb3570f --- /dev/null +++ b/internal/server/frontend_test.go @@ -0,0 +1,80 @@ +package server + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + "testing/fstest" +) + +func TestFrontendHandlerSetsSecurityHeadersOnSPAHTML(t *testing.T) { + prev := WebDistFS + WebDistFS = fstest.MapFS{ + "index.html": &fstest.MapFile{Data: []byte("
")}, + "assets/app.js": &fstest.MapFile{ + Data: []byte("console.log(1)"), + }, + } + t.Cleanup(func() { WebDistFS = prev }) + + handler := FrontendHandler() + + for _, path := range []string{"/", "/index.html", "/library/ebooks"} { + t.Run(path, func(t *testing.T) { + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, path, nil)) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d", rr.Code) + } + if got := rr.Header().Get("Content-Type"); got != "text/html; charset=utf-8" { + t.Fatalf("content-type = %q", got) + } + csp := rr.Header().Get("Content-Security-Policy") + if csp != frontendContentSecurityPolicy { + t.Fatalf("csp = %q", csp) + } + // The ebook-reader threat model depends on these directives; fail + // loudly if they are weakened. + for _, directive := range []string{ + "script-src 'self' 'wasm-unsafe-eval'", + "object-src 'none'", + "base-uri 'self'", + } { + if !strings.Contains(csp, directive) { + t.Fatalf("csp missing %q: %q", directive, csp) + } + } + if strings.Contains(csp, "script-src 'self' 'wasm-unsafe-eval' ") { + t.Fatalf("script-src must not carry extra sources: %q", csp) + } + if got := rr.Header().Get("X-Content-Type-Options"); got != "nosniff" { + t.Fatalf("x-content-type-options = %q", got) + } + }) + } +} + +func TestFrontendHandlerServesStaticAssetsWithoutCSP(t *testing.T) { + prev := WebDistFS + WebDistFS = fstest.MapFS{ + "index.html": &fstest.MapFile{Data: []byte("")}, + "assets/app.js": &fstest.MapFile{Data: []byte("console.log(1)")}, + } + t.Cleanup(func() { WebDistFS = prev }) + + handler := FrontendHandler() + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/assets/app.js", nil)) + + if rr.Code != http.StatusOK { + t.Fatalf("status = %d", rr.Code) + } + if got := rr.Header().Get("Content-Security-Policy"); got != "" { + t.Fatalf("static asset should not carry the SPA CSP, got %q", got) + } + if got := rr.Header().Get("X-Content-Type-Options"); got != "nosniff" { + t.Fatalf("x-content-type-options = %q", got) + } +} diff --git a/internal/taskmanager/tasks/sync_ebook_metadata.go b/internal/taskmanager/tasks/sync_ebook_metadata.go new file mode 100644 index 00000000..8656ab7d --- /dev/null +++ b/internal/taskmanager/tasks/sync_ebook_metadata.go @@ -0,0 +1,56 @@ +package tasks + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/Silo-Server/silo-server/internal/taskmanager" +) + +type ebookMetadataEnricher interface { + Run(ctx context.Context) (int, error) +} + +// SyncEbookMetadataTask runs the periodic ebook enrichment sweep. +// It calls ebooks.Enricher.Run() which selects unenriched ebook media_items, +// resolves the per-folder metadata-provider chain at content_level='ebook', +// and writes results back to the database. +type SyncEbookMetadataTask struct { + enricher ebookMetadataEnricher +} + +// NewSyncEbookMetadataTask constructs the task. +func NewSyncEbookMetadataTask(enricher ebookMetadataEnricher) *SyncEbookMetadataTask { + return &SyncEbookMetadataTask{enricher: enricher} +} + +func (t *SyncEbookMetadataTask) Key() string { return "sync_ebook_metadata" } +func (t *SyncEbookMetadataTask) Name() string { return "Sync Ebook Metadata" } +func (t *SyncEbookMetadataTask) Description() string { + return "Fetches metadata (cover art, overview, authors) for ebooks that have not yet been enriched" +} +func (t *SyncEbookMetadataTask) Category() taskmanager.TaskCategory { + return taskmanager.TaskCategoryMetadata +} +func (t *SyncEbookMetadataTask) IsHidden() bool { return false } + +func (t *SyncEbookMetadataTask) DefaultTriggers() []taskmanager.TriggerConfig { + return []taskmanager.TriggerConfig{ + {Type: taskmanager.TriggerTypeInterval, IntervalMs: 5 * 60 * 1000}, + } +} + +func (t *SyncEbookMetadataTask) Execute(ctx context.Context, progress taskmanager.ProgressReporter) error { + progress.Report(0, "Scanning for unenriched ebooks") + + enriched, err := t.enricher.Run(ctx) + if err != nil { + return fmt.Errorf("ebook metadata sync: %w", err) + } + + result, _ := json.Marshal(map[string]int{"items_enriched": enriched}) + progress.SetResultData(result) + progress.Report(100, fmt.Sprintf("Ebook metadata sync complete (%d items enriched)", enriched)) + return nil +} diff --git a/internal/taskmanager/tasks/sync_ebook_metadata_test.go b/internal/taskmanager/tasks/sync_ebook_metadata_test.go new file mode 100644 index 00000000..0adb8c9a --- /dev/null +++ b/internal/taskmanager/tasks/sync_ebook_metadata_test.go @@ -0,0 +1,92 @@ +package tasks + +import ( + "context" + "encoding/json" + "errors" + "strings" + "testing" + + "github.com/Silo-Server/silo-server/internal/taskmanager" +) + +type fakeEbookMetadataEnricher struct { + enriched int + err error + called bool +} + +func (f *fakeEbookMetadataEnricher) Run(context.Context) (int, error) { + f.called = true + return f.enriched, f.err +} + +type ebookMetadataProgressReporter struct { + messages []string + result json.RawMessage +} + +func (p *ebookMetadataProgressReporter) Report(_ float64, message string) { + p.messages = append(p.messages, message) +} + +func (p *ebookMetadataProgressReporter) SetResultData(data json.RawMessage) { + p.result = data +} + +func TestSyncEbookMetadataTaskProperties(t *testing.T) { + task := NewSyncEbookMetadataTask(&fakeEbookMetadataEnricher{}) + + if task.Key() != "sync_ebook_metadata" { + t.Fatalf("Key() = %q, want sync_ebook_metadata", task.Key()) + } + if task.Name() != "Sync Ebook Metadata" { + t.Fatalf("Name() = %q, want Sync Ebook Metadata", task.Name()) + } + if task.Category() != taskmanager.TaskCategoryMetadata { + t.Fatalf("Category() = %q, want %q", task.Category(), taskmanager.TaskCategoryMetadata) + } + if task.IsHidden() { + t.Fatal("IsHidden() = true, want false") + } + triggers := task.DefaultTriggers() + if len(triggers) != 1 || triggers[0].Type != taskmanager.TriggerTypeInterval || triggers[0].IntervalMs != 5*60*1000 { + t.Fatalf("DefaultTriggers() = %#v, want one 5 minute interval", triggers) + } + if strings.Contains(strings.ToLower(task.Description()), "narrator") { + t.Fatalf("Description() mentions narrator: %q", task.Description()) + } +} + +func TestSyncEbookMetadataTaskExecuteReportsResult(t *testing.T) { + enricher := &fakeEbookMetadataEnricher{enriched: 3} + task := NewSyncEbookMetadataTask(enricher) + progress := &ebookMetadataProgressReporter{} + + if err := task.Execute(context.Background(), progress); err != nil { + t.Fatalf("Execute() error = %v", err) + } + if !enricher.called { + t.Fatal("enricher was not called") + } + var result map[string]int + if err := json.Unmarshal(progress.result, &result); err != nil { + t.Fatalf("result data JSON error: %v", err) + } + if result["items_enriched"] != 3 { + t.Fatalf("items_enriched = %d, want 3", result["items_enriched"]) + } + if len(progress.messages) == 0 || !strings.Contains(progress.messages[len(progress.messages)-1], "3 items enriched") { + t.Fatalf("progress messages = %#v, want completion count", progress.messages) + } +} + +func TestSyncEbookMetadataTaskExecuteWrapsError(t *testing.T) { + enricher := &fakeEbookMetadataEnricher{err: errors.New("boom")} + task := NewSyncEbookMetadataTask(enricher) + + err := task.Execute(context.Background(), &ebookMetadataProgressReporter{}) + if err == nil || !strings.Contains(err.Error(), "ebook metadata sync") { + t.Fatalf("Execute() error = %v, want wrapped ebook metadata sync error", err) + } +} diff --git a/migrations/sql/20260608000100_ebook_series.sql b/migrations/sql/20260608000100_ebook_series.sql new file mode 100644 index 00000000..461b680e --- /dev/null +++ b/migrations/sql/20260608000100_ebook_series.sql @@ -0,0 +1,17 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE ebook_series ( + content_id TEXT PRIMARY KEY REFERENCES media_items(content_id) ON DELETE CASCADE, + series_name TEXT NOT NULL, + series_index NUMERIC, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX ebook_series_name_lower + ON ebook_series (LOWER(series_name), series_index NULLS LAST); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE IF EXISTS ebook_series; +-- +goose StatementEnd diff --git a/migrations/sql/20260608000200_ebook_reader_progress.sql b/migrations/sql/20260608000200_ebook_reader_progress.sql new file mode 100644 index 00000000..d89b68e5 --- /dev/null +++ b/migrations/sql/20260608000200_ebook_reader_progress.sql @@ -0,0 +1,22 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE ebook_reader_progress ( + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + profile_id TEXT NOT NULL, + content_id TEXT NOT NULL REFERENCES media_items(content_id) ON DELETE CASCADE, + file_id INTEGER NOT NULL REFERENCES media_files(id) ON DELETE CASCADE, + location TEXT NOT NULL, + progress DOUBLE PRECISION NOT NULL DEFAULT 0, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, profile_id, content_id), + CHECK (progress >= 0 AND progress <= 1) +); + +CREATE INDEX ebook_reader_progress_profile_updated + ON ebook_reader_progress (user_id, profile_id, updated_at DESC); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE IF EXISTS ebook_reader_progress; +-- +goose StatementEnd diff --git a/migrations/sql/20260608000300_ebook_reader_state.sql b/migrations/sql/20260608000300_ebook_reader_state.sql new file mode 100644 index 00000000..a44ff0b2 --- /dev/null +++ b/migrations/sql/20260608000300_ebook_reader_state.sql @@ -0,0 +1,41 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE ebook_reader_config ( + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + profile_id TEXT NOT NULL, + content_id TEXT NOT NULL REFERENCES media_items(content_id) ON DELETE CASCADE, + config JSONB NOT NULL DEFAULT '{}'::jsonb, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, profile_id, content_id) +); + +CREATE INDEX ebook_reader_config_profile_updated + ON ebook_reader_config (user_id, profile_id, updated_at DESC); + +CREATE TABLE ebook_reader_annotations ( + id TEXT PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + profile_id TEXT NOT NULL, + content_id TEXT NOT NULL REFERENCES media_items(content_id) ON DELETE CASCADE, + kind TEXT NOT NULL CHECK (kind IN ('highlight', 'note', 'bookmark')), + cfi_range TEXT, + location TEXT, + selected_text TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + style TEXT NOT NULL DEFAULT 'highlight', + color TEXT NOT NULL DEFAULT '#facc15', + metadata JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + CHECK ((kind = 'bookmark' AND location IS NOT NULL) OR (kind <> 'bookmark' AND cfi_range IS NOT NULL)) +); + +CREATE INDEX ebook_reader_annotations_book + ON ebook_reader_annotations (user_id, profile_id, content_id, updated_at DESC); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE IF EXISTS ebook_reader_annotations; +DROP TABLE IF EXISTS ebook_reader_config; +-- +goose StatementEnd diff --git a/migrations/sql/20260610071424_add_ebook_reader_fk_indexes.sql b/migrations/sql/20260610071424_add_ebook_reader_fk_indexes.sql new file mode 100644 index 00000000..23a17218 --- /dev/null +++ b/migrations/sql/20260610071424_add_ebook_reader_fk_indexes.sql @@ -0,0 +1,26 @@ +-- +goose Up +-- +goose StatementBegin +-- The ebook reader tables carry ON DELETE CASCADE foreign keys on content_id +-- (and file_id for progress), but every existing index leads with user_id, so +-- media_items/media_files deletes had to seq-scan them. Plain btree indexes on +-- the FK columns let those cascades use index scans. +CREATE INDEX IF NOT EXISTS ebook_reader_progress_content_id + ON ebook_reader_progress (content_id); + +CREATE INDEX IF NOT EXISTS ebook_reader_progress_file_id + ON ebook_reader_progress (file_id); + +CREATE INDEX IF NOT EXISTS ebook_reader_config_content_id + ON ebook_reader_config (content_id); + +CREATE INDEX IF NOT EXISTS ebook_reader_annotations_content_id + ON ebook_reader_annotations (content_id); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP INDEX IF EXISTS ebook_reader_annotations_content_id; +DROP INDEX IF EXISTS ebook_reader_config_content_id; +DROP INDEX IF EXISTS ebook_reader_progress_file_id; +DROP INDEX IF EXISTS ebook_reader_progress_content_id; +-- +goose StatementEnd diff --git a/migrations/sql/20260610080326_backfill_ebook_item_status.sql b/migrations/sql/20260610080326_backfill_ebook_item_status.sql new file mode 100644 index 00000000..9fd3ef18 --- /dev/null +++ b/migrations/sql/20260610080326_backfill_ebook_item_status.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- Ebook items created by the scanner before status handling was fixed were +-- written with status = '' (the upsert bypasses the column default), which +-- disabled the pending -> matched promotion in enrichment and the curated- +-- metadata guard. Rows enrichment already processed become 'matched'; the +-- rest become 'pending' so the next enrichment sweep promotes them normally. +UPDATE media_items +SET status = CASE + WHEN matched_at IS NOT NULL OR last_refreshed IS NOT NULL THEN 'matched' + ELSE 'pending' + END +WHERE type = 'ebook' + AND status = ''; + +-- +goose Down +-- Irreversible data backfill: the pre-migration status ('') carried no +-- information, so there is nothing meaningful to restore. +SELECT 1; diff --git a/migrations/sql/20260610080327_ebook_enrichment_state.sql b/migrations/sql/20260610080327_ebook_enrichment_state.sql new file mode 100644 index 00000000..8f8b1aa3 --- /dev/null +++ b/migrations/sql/20260610080327_ebook_enrichment_state.sql @@ -0,0 +1,13 @@ +-- +goose Up +-- Dedicated failure accounting for the ebook enrichment sweep. Enrichment +-- previously incremented media_items.refresh_failures, which the metadata +-- refresh-debt system also owns (increments on refresh failure, resets on +-- success, reads for debt scoring); the two systems fought over one counter. +CREATE TABLE ebook_enrichment_state ( + content_id text PRIMARY KEY REFERENCES media_items(content_id) ON DELETE CASCADE, + failures integer NOT NULL DEFAULT 0, + updated_at timestamptz NOT NULL DEFAULT now() +); + +-- +goose Down +DROP TABLE ebook_enrichment_state; diff --git a/web/package.json b/web/package.json index d450f60c..c811d9e0 100644 --- a/web/package.json +++ b/web/package.json @@ -23,15 +23,19 @@ "@fontsource/noto-sans-thai": "^5.2.8", "@tanstack/react-query": "^5.90.21", "@tanstack/react-virtual": "^3.13.19", + "@zip.js/zip.js": "^2.8.26", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "embla-carousel": "^8.6.0", "embla-carousel-react": "^8.6.0", "embla-carousel-wheel-gestures": "^8.1.0", + "foliate-js": "file:vendor/foliate-js", "framer-motion": "^12.38.0", "hls.js": "^1.6.15", "jassub": "^2.4.2", "lucide-react": "^0.576.0", + "node-unrar-js": "^2.0.2", + "pdfjs-dist": "^5.7.284", "radix-ui": "^1.4.3", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index a6af9a64..563158f1 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -37,6 +37,9 @@ importers: '@tanstack/react-virtual': specifier: ^3.13.19 version: 3.13.22(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@zip.js/zip.js': + specifier: ^2.8.26 + version: 2.8.26 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -52,6 +55,9 @@ importers: embla-carousel-wheel-gestures: specifier: ^8.1.0 version: 8.1.0(embla-carousel@8.6.0) + foliate-js: + specifier: file:vendor/foliate-js + version: file:vendor/foliate-js framer-motion: specifier: ^12.38.0 version: 12.38.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -64,6 +70,12 @@ importers: lucide-react: specifier: ^0.576.0 version: 0.576.0(react@19.2.4) + node-unrar-js: + specifier: ^2.0.2 + version: 2.0.2 + pdfjs-dist: + specifier: ^5.7.284 + version: 5.7.284 radix-ui: specifier: ^1.4.3 version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -586,6 +598,81 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/canvas-android-arm64@0.1.100': + resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.100': + resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.100': + resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': + resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': + resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-arm64-musl@0.1.100': + resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': + resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-gnu@0.1.100': + resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-musl@0.1.100': + resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': + resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@0.1.100': + resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.100': + resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} + engines: {node: '>= 10'} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -1695,6 +1782,10 @@ packages: '@vitest/utils@4.1.0': resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@zip.js/zip.js@2.8.26': + resolution: {integrity: sha512-RQ4h9F6DOiHxpdocUDrOl6xBM+yOtz+LkUol47AVWcfebGBDpZ7w7Xvz9PS24JgXvLGiXXzSAfdCdVy1tPlaFA==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + abslink@1.1.6: resolution: {integrity: sha512-8fQgnUoVSgc1IhOrYzdDY+wTDPktbuYjds2LKf9kWYWKwDnHgXU168gdV3sPei7vevFf5m2fPZ6IQSKZkSjHVg==} @@ -1800,6 +1891,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + construct-style-sheets-polyfill@3.1.0: + resolution: {integrity: sha512-HBLKP0chz8BAY6rBdzda11c3wAZeCZ+kIG4weVC2NM3AXzxx09nhe8t0SQNdloAvg5GLuHwq/0SPOOSPvtCcKw==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2006,6 +2100,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + foliate-js@file:vendor/foliate-js: + resolution: {directory: vendor/foliate-js, type: directory} + framer-motion@12.38.0: resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} peerDependencies: @@ -2359,6 +2456,10 @@ packages: node-releases@2.0.36: resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-unrar-js@2.0.2: + resolution: {integrity: sha512-hLNmoJzqaKJnod8yiTVGe9hnlNRHotUi0CreSv/8HtfRi/3JnRC8DvsmKfeGGguRjTEulhZK6zXX5PXoVuDZ2w==} + engines: {node: '>=10.0.0'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2396,6 +2497,10 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pdfjs-dist@5.7.284: + resolution: {integrity: sha512-h4EdYQczmGhbOlqc3PPZwxevn7ApdWPbovAuWXOB/DjIyigSnwfy2oze7c6mRcSr9XgLp3eN3EeL4DyySTPMFw==} + engines: {node: '>=22.13.0 || >=24'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3271,6 +3376,54 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@napi-rs/canvas-android-arm64@0.1.100': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.100': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.100': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.100': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.100': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.100': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.100': + optional: true + + '@napi-rs/canvas@0.1.100': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.100 + '@napi-rs/canvas-darwin-arm64': 0.1.100 + '@napi-rs/canvas-darwin-x64': 0.1.100 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 + '@napi-rs/canvas-linux-arm64-musl': 0.1.100 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-musl': 0.1.100 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 + '@napi-rs/canvas-win32-x64-msvc': 0.1.100 + optional: true + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -4406,6 +4559,8 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@zip.js/zip.js@2.8.26': {} + abslink@1.1.6: {} acorn-jsx@5.3.2(acorn@8.16.0): @@ -4495,6 +4650,8 @@ snapshots: concat-map@0.0.1: {} + construct-style-sheets-polyfill@3.1.0: {} + convert-source-map@2.0.0: {} cookie@1.1.1: {} @@ -4721,6 +4878,10 @@ snapshots: flatted@3.4.2: {} + foliate-js@file:vendor/foliate-js: + dependencies: + construct-style-sheets-polyfill: 3.1.0 + framer-motion@12.38.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: motion-dom: 12.38.0 @@ -4997,6 +5158,8 @@ snapshots: node-releases@2.0.36: {} + node-unrar-js@2.0.2: {} + object-assign@4.1.1: {} obug@2.1.1: {} @@ -5032,6 +5195,10 @@ snapshots: pathe@2.0.3: {} + pdfjs-dist@5.7.284: + optionalDependencies: + '@napi-rs/canvas': 0.1.100 + picocolors@1.1.1: {} picomatch@4.0.4: {} diff --git a/web/public/vendor/pdfjs/annotation_layer_builder.css b/web/public/vendor/pdfjs/annotation_layer_builder.css new file mode 100644 index 00000000..c1c2a8d5 --- /dev/null +++ b/web/public/vendor/pdfjs/annotation_layer_builder.css @@ -0,0 +1,407 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.annotationLayer { + color-scheme: only light; + + --annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,"); + --input-focus-border-color: Highlight; + --input-focus-outline: 1px solid Canvas; + --input-unfocused-border-color: transparent; + --input-disabled-border-color: transparent; + --input-hover-border-color: black; + --link-outline: none; + + @media screen and (forced-colors: active) { + --input-focus-border-color: CanvasText; + --input-unfocused-border-color: ActiveText; + --input-disabled-border-color: GrayText; + --input-hover-border-color: Highlight; + --link-outline: 1.5px solid LinkText; + + .textWidgetAnnotation :is(input, textarea):required, + .choiceWidgetAnnotation select:required, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required { + outline: 1.5px solid selectedItem; + } + + .linkAnnotation { + outline: var(--link-outline); + + &:hover { + backdrop-filter: var(--hcm-highlight-filter); + } + + & > a:hover { + opacity: 0 !important; + background: none !important; + box-shadow: none; + } + } + + .popupAnnotation .popup { + outline: calc(1.5px * var(--total-scale-factor)) solid CanvasText !important; + background-color: ButtonFace !important; + color: ButtonText !important; + } + + .highlightArea:hover::after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + backdrop-filter: var(--hcm-highlight-filter); + content: ""; + pointer-events: none; + } + + .popupAnnotation.focused .popup { + outline: calc(3px * var(--total-scale-factor)) solid Highlight !important; + } + } + + position: absolute; + top: 0; + left: 0; + pointer-events: none; + transform-origin: 0 0; + + &[data-main-rotation="90"] .norotate { + transform: rotate(270deg) translateX(-100%); + } + &[data-main-rotation="180"] .norotate { + transform: rotate(180deg) translate(-100%, -100%); + } + &[data-main-rotation="270"] .norotate { + transform: rotate(90deg) translateY(-100%); + } + + &.disabled { + section, + .popup { + pointer-events: none; + } + } + + .annotationContent { + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; + + &.freetext { + background: transparent; + border: none; + inset: 0; + overflow: visible; + white-space: nowrap; + font: 10px sans-serif; + line-height: 1.35; + } + } + + section { + position: absolute; + text-align: initial; + pointer-events: auto; + box-sizing: border-box; + transform-origin: 0 0; + user-select: none; + + &:has(div.annotationContent) { + canvas.annotationContent { + display: none; + } + } + + .overlaidText { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + display: inline-block; + overflow: hidden; + } + } + + .textLayer.selecting ~ & section { + pointer-events: none; + } + + :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a { + position: absolute; + font-size: 1em; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) + > a:hover { + opacity: 0.2; + background-color: rgb(255 255 0); + } + + .linkAnnotation.hasBorder:hover { + background-color: rgb(255 255 0 / 0.2); + } + + .hasBorder { + background-size: 100% 100%; + } + + .textAnnotation img { + position: absolute; + cursor: pointer; + width: 100%; + height: 100%; + top: 0; + left: 0; + } + + .textWidgetAnnotation :is(input, textarea), + .choiceWidgetAnnotation select, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { + background-image: var(--annotation-unfocused-field-background); + border: 2px solid var(--input-unfocused-border-color); + box-sizing: border-box; + font: calc(9px * var(--total-scale-factor)) sans-serif; + height: 100%; + margin: 0; + vertical-align: top; + width: 100%; + } + + .textWidgetAnnotation :is(input, textarea):required, + .choiceWidgetAnnotation select:required, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required { + outline: 1.5px solid red; + } + + .choiceWidgetAnnotation select option { + padding: 0; + } + + .buttonWidgetAnnotation.radioButton input { + border-radius: 50%; + } + + .textWidgetAnnotation textarea { + resize: none; + } + + .textWidgetAnnotation :is(input, textarea)[disabled], + .choiceWidgetAnnotation select[disabled], + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled] { + background: none; + border: 2px solid var(--input-disabled-border-color); + cursor: not-allowed; + } + + .textWidgetAnnotation :is(input, textarea):hover, + .choiceWidgetAnnotation select:hover, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover { + border: 2px solid var(--input-hover-border-color); + } + .textWidgetAnnotation :is(input, textarea):hover, + .choiceWidgetAnnotation select:hover, + .buttonWidgetAnnotation.checkBox input:hover { + border-radius: 2px; + } + + .textWidgetAnnotation :is(input, textarea):focus, + .choiceWidgetAnnotation select:focus { + background: none; + border: 2px solid var(--input-focus-border-color); + border-radius: 2px; + outline: var(--input-focus-outline); + } + + .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus { + background-image: none; + background-color: transparent; + } + + .buttonWidgetAnnotation.checkBox :focus { + border: 2px solid var(--input-focus-border-color); + border-radius: 2px; + outline: var(--input-focus-outline); + } + + .buttonWidgetAnnotation.radioButton :focus { + border: 2px solid var(--input-focus-border-color); + outline: var(--input-focus-outline); + } + + .buttonWidgetAnnotation.checkBox input:checked::before, + .buttonWidgetAnnotation.checkBox input:checked::after, + .buttonWidgetAnnotation.radioButton input:checked::before { + background-color: CanvasText; + content: ""; + display: block; + position: absolute; + } + + .buttonWidgetAnnotation.checkBox input:checked::before, + .buttonWidgetAnnotation.checkBox input:checked::after { + height: 80%; + left: 45%; + width: 1px; + } + + .buttonWidgetAnnotation.checkBox input:checked::before { + transform: rotate(45deg); + } + + .buttonWidgetAnnotation.checkBox input:checked::after { + transform: rotate(-45deg); + } + + .buttonWidgetAnnotation.radioButton input:checked::before { + border-radius: 50%; + height: 50%; + left: 25%; + top: 25%; + width: 50%; + } + + .textWidgetAnnotation input.comb { + font-family: monospace; + padding-left: 2px; + padding-right: 0; + } + + .textWidgetAnnotation input.comb:focus { + /* + * Letter spacing is placed on the right side of each character. Hence, the + * letter spacing of the last character may be placed outside the visible + * area, causing horizontal scrolling. We avoid this by extending the width + * when the element has focus and revert this when it loses focus. + */ + width: 103%; + } + + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { + appearance: none; + } + + .fileAttachmentAnnotation .popupTriggerArea { + height: 100%; + width: 100%; + } + + .popupAnnotation { + position: absolute; + font-size: calc(9px * var(--total-scale-factor)); + pointer-events: none; + width: max-content; + max-width: 45%; + height: auto; + } + + .popup { + background-color: rgb(255 255 153); + color: black; + box-shadow: 0 calc(2px * var(--total-scale-factor)) + calc(5px * var(--total-scale-factor)) rgb(136 136 136); + border-radius: calc(2px * var(--total-scale-factor)); + outline: 1.5px solid rgb(255 255 74); + padding: calc(6px * var(--total-scale-factor)); + cursor: pointer; + font: message-box; + white-space: normal; + word-wrap: break-word; + pointer-events: auto; + user-select: text; + } + + .popupAnnotation.focused .popup { + outline-width: 3px; + } + + .popup * { + font-size: calc(9px * var(--total-scale-factor)); + } + + .popup > .header { + display: inline-block; + } + + .popup > .header > .title { + display: inline; + font-weight: bold; + } + + .popup > .header .popupDate { + display: inline-block; + margin-left: calc(5px * var(--total-scale-factor)); + width: fit-content; + } + + .popupContent { + border-top: 1px solid rgb(51 51 51); + margin-top: calc(2px * var(--total-scale-factor)); + padding-top: calc(2px * var(--total-scale-factor)); + } + + .richText > * { + white-space: pre-wrap; + font-size: calc(9px * var(--total-scale-factor)); + } + + .popupTriggerArea { + cursor: pointer; + + &:hover { + backdrop-filter: var(--hcm-highlight-filter); + } + } + + section svg { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + } + + .annotationTextContent { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + color: transparent; + user-select: none; + pointer-events: none; + + span { + width: 100%; + display: inline-block; + } + } + + svg.quadrilateralsContainer { + contain: strict; + width: 0; + height: 0; + position: absolute; + top: 0; + left: 0; + z-index: -1; + } +} diff --git a/web/public/vendor/pdfjs/cmaps/78-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/78-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2655fc70ae706c7ba52a5d647cbfdfad6072c697 GIT binary patch literal 2404 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWa?XBztpjDSF8dfgM4Fp z0;57)V|pS_-vaw4x22A;EtQQ*yshC)jGS#e?2>I_Y?5sTjcP${UX8k;?Xrzp;_by8 z;vL+L9ts`G{0bc|g#sHEGIXRe><(n@NM|_U#om#}uuqaH@fC7!TFBO=$gn$>VW%g_#NKPqusctt*MnhqK5K6p!|nps-du*=g$%tV z47-aMddmvMwl8GrEoazWEZAGku)Bn(kB?z@DSMv`!|pPsK2?U@<&1rr47)2>`g9m} z@Ur(AG3>77?z3jtUB%Yt!LYlUxi5fWcTFPej)g*fp$rVWYZu zT*%pP%&@zjtKW`c4+Cev7sDP#iT+TAwXyvD`3!rQSSK(r>|th}z|OFTg=GRyBKxj| zh7$xC81}F-2u*NdVA#XPz&#;?fng6j1LuU)LeAX_StsN(?BQUXP{y!_lVL(7!yYc~ z3DpdHxLqc4By#Los5a4;fng6X1H&dw2A+v!3=Dht7+5B;Ffi`nXON%7UC6n2A?GA* zhCPCulgt?Q2$@WBWZWanJgI_lk0{rqx2>P{|X*dxa}MS)?DJo^-NhCK=*Qw$2Z z4=iMu;>xf`QErMm!yYB2Dd`M*lsTtzGwxAgohr__M~!)^d?DY#g{)JR8TM!}Y{}!F zs?D%RQ*f#c!yYZhss0RmwE3n6G3?Rdn3}|}M^|KOP9guHh0@a)8TRP$O_O8Tqt81{ zk717i>oi-2J%(J@j1Qmd3cpoN-zv z;~q=iX}Ju0tPQ8tFzm5mp03ZZ$Ch=v3Bw*c#_86D{6`i_Pq$^*W6wD~ieZlf!}L^! zJ&ugi(;4WD4CfB411#aX7MrXiDB5x z$*?DuX_f-Ro;ZP7Duui!7BbB;W!MwXG0T!+PXfa%XNEnAO0!%U_9XGl%4FD+EI6y2 zVNVLjY_39qlM5MU3p4IX<(e(VuqT~ig*C%$WrjT&jI&i4_GEI-)?nC^#WUNOVNW*W zY)6JYIXbgl3OP?LRGeMNuqT&ejtIk^JnlJi414lr=V&wRDPWo7RmgXGA;TPhhCPL> za{?Lm6e-M!VAxYEJEw|amodv+NrpWoY;)xq_USMz&}W&eQOJL0q4r!|hCQWRbE6pc zl(EcBW7t#9I5&r3Plf2*e1=V?40|dW=CL#EsbZMN$*`xoko)XHfqC2vdun9n$ujJz zWtwNru&0h?o;|}Z6W)2Q414ND=7l73om;3mFOyMsz6cZ3e3wRLzWE-E%=04{8Ry3` zO3qJc^fj4Z#lSFEok4wpK_cV%Z4B$m6IsulX4uQ1$GDfVQI%mYGe5Iucctc9Ex z7fLUPVA#vXv7nS;FFVtMdWO9m3=5eV_Hr65WKCqev@mv|Ss~};g?x)d81`~;EK*_E z%dNCXk6|w__o5(%y?jE8;u9Hf{$S`L^C@)d`HE zYa|)j*BCS^ajvmoWM1RU;zk?r0EhP|@Qp$vQFEg1GHh%xLkZ8TxntH{E*SE-Qm z(L&C(Vhnp#tk)_s^ye|GjboS*$h@^eF%*(LX++edZ z!(I!%&7p;yuNMkzPGQ(C(|*{Z-Ov(=B0VQUT}|JJ-lCHAd#j6&Pk86~z!GpcPfZB&Zg z7L&;F<|V^k8!m>uwvCYtd+lTy_S!Qt>~(0gV%X~_%&^x&L*b%MbtqZvsXD literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/78-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f1ed8538287499647d923d7d8f517a00cdac4e3a GIT binary patch literal 173 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVQ!)88tSa;k;uAm5#wHeUdFwF yoJ@OznOOFQu?X&sb`)LsaBps_Jp&^YN;1fUS!@iAMqma=0wI{lxb!RIJ|+NB4lWh| literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78-H.bcmap b/web/public/vendor/pdfjs/cmaps/78-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..39e89d3339c74cbe06e7e4f76d60bf3556b0d4b6 GIT binary patch literal 2379 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`RPds2JN)*{H<(e?v|!jB%Gl{x$ZM#`(do>vJB+i_ zmtl7}Q)dLj?g*yN7>3C$*?=lq)VG& zcf3SbBE#+k#;$6H-H8lcb%lb)iVR)#47-!$x)~WZC9-xaGAx&u>egV`oy^kh!mvAq zt=o%XcPe9d5W_k{rtVON-D%9-k%e3)iVEGa47<}ARuysdFfi=SVD8~!*rFiV!_Tlg zQ=&&Hk=0a@v&Wi&VRsgTaE}`U!|rSb+n(q`K{G{$UP*@CIc&Ys47+osdX*V=8L{`; zGwjZj>GfdPozL2v#<079wKtbxcOgS>3B&FphTgJ5F>^(x-g1WB#e%)n47*Es`uG@j zm$LWCFzha4>QiOdUC!92$*{YErB8=p2QPb{5yS3E?mlaV-BoOT9t^vynfn45cGo1b zS||$jg)%Vgu4Ulv%Vc2KUB_V4S60YxsmR%H%&@zjtKW`c4+Cev7sDP#iT+TAwXyvD z`3!rQSSK(r>|th}z|OFTg=GRyBDL4FcJMut!p4vIfH*DUQi@411)RCwnmLk&&G2TgYjz$T2ycVUMit z8& zIO85Q=Be_9e2$8&QYYrBcZ2p~y7LlwnUi$1F>RJqZl6 zoEi2cD$R0b*ptLFE0bYQvf!+8hCL}9v$+ZdJQW#c3p4IX<(e(VuqT~ig*C%$WrjT& zjI&i4_GEI-)?nC^#WUNOVNW*WY)6JYIXbgl3OT(L6=xSR?8)VrBf_vJk9&?B!=8NE zIob?+3RvcN74ms2GR*O3*i*+H-Xo_LOqXjbhkS#xggJVNW^Z+#H5I6{2(V88(?R?5Sj!$Ih^)ieVln z!=CCwZeK-#dE5+pYGmfgGVG~knrF?hr;cTwJ;N>&-g&MJd+J5zg(PzMDQeEkWYnE6 z!o)P+rBRu0z6T@o{0K(I`LT?W^Aj3$mnmzu&z9j)z6z@FM}TA zUdBdMhP}-E40~DF8TPUkat10&FNk2+%f_*wlwmJB(}H@2y&Mb+nHlzS8Z2Z@WDHV_ zU1(Ow8LY^+NQ7Z87snzMhP~WMi}V=w@^UWPL)*ele+$go$W z$(muWC^y4iu|^+;z2d?QdnF2aqZO4`urTbEWL}}kuvdy_g&xCfCBYRo411*+R`@f_ z$Y5O&$go$2b45fVQ=BEkj9hDm?)pT&7{%BXNsUUeD;*k@#8=5NimozeR9@xB$g!%p zQ7Lv+O`{Ua>L^C@)d`HEYa|)j*BCS^ajvmoWM1RU;zku5HOVXtg+D8pWP3x>T4 zVhp=X8%-GYDzY%{RVw66Qsi7K#;{k#daWWue;&iyIEER4%xe=E_Nwx&O-*D^R@7Kq z!oaXsje%pG90S8%bq0=g8Vn5GAq?{Cj0!nZ6vfvCG3?dgUYE@yDltqfHD~BnNMy{^W0=R9D3huvzTSX=VXrm=!+K8!hP^rroa?Rt*Qg}4(Tjm$ zuMq?5#yAFsy~YgY8&eq=_L?woZjx(MV%Vg?$hAp}QEQVKqw=PtLe4Bjrp;^&v*Z{z zb202S6WPqmu-DvRvogb83%<>vg`C-n0-IA9_F8IgE@SB7W8b34u-A%jix$IPYxXTx ziHteE3{$ldd2U9MZOLck+{(?!xmB!DNoT79qs&%6Mux39jQm^k8kN|$)-eig zV`r4uCe5g}&9qS|c3Vs$M@}ZgUK=iky|#^!414Wl8TQ&UGVFC|v|`xnD9o_eNs?i& zb0JrOqVjethP`fF+v6Gby0dK0X4vZ?y}gj3&yZoSC&v!{M8-nJ*c}puTt$l9JIWaL zdhzaLX4vb^zf*{zqnu%{kIGIJhAvIconDEo#fthnLl_wL`Z8$kVr5|1>&L*b%Mbvo CSHIc- literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e4167cb51f66c60ef7d9500b450303b5da175574 GIT binary patch literal 2398 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z1x5z>#`FY6g}BD_MBYXRyOv5uomPuRCC)Y;cF8s|cF8samY_B-Kf88WMzQu74)OM4 z4)G4|Ooa|*e!dPDM!}BYLV=F?3>~Qqy8~G}(iskTv3KM#?2}~Jsl?V%!LU2Xu#WpF79mU+4z_2@7 zrZcsWx3ht(i-}=(jAR!d!|qsyot_N4<4n4=8Ft4@bR{zEPGIb+X4sv`&{dbn-sQm1 zRnNe%JBdNAn~{NGQz8Rvw;}_>a(M>PZjC~bt_GHFJBHoKEZr^)yHnV@y%=_xnKD>~4_nsbbij!`3U!usc_(SD9g#5qqya!|ptpUJr)d`K-NZ47&?h zdvh6f7c%sgFzha3=q)Sc?{Q%2EoazWEZAGku)Bn(kB?z@DSMv`!|pPsK2?U@<&1rr z47)2>`g9m}@G|!q74r5pF!z};?5^bQvu4;`#n$J+u)CVMFMwfpjZj}G!|qz{zD$PQ zbvAuvg`B+(oc+cOyX(37?HKkjaQ1sK>|vDX4`o;z%haD=$lKe%(_h4}hlzCp1H&F> z<_YW!dsxgS@G$IQ6`J6}u!oI%LIlGecFqZ@g`9m3tP}DX_HZyxC}Y^e$uOakVGkGg zgldL8+^Q2f650D2Tqo)=@k}gZWSPXmBtMDUnRAjhBj+SDMvY01iHv>688&Gqvi2Qg z*u%@mu!oP8aSwkk!yZ8{hCM=sg8dELld>512s2NrVB90hH>r+ck2ud{K88IKT$5!O z_DG6M)?nBp#WC5AVUINPWDkZtGLn;h6ImxXa7<2TVAvzepgXycfnkpv1M3upLcR$N z4146+r>HaRQ4pPCz_3SAZi+j@9wntI=?r_6Ij3?n?onZ#D$ck^jd`kkA@@WF)~U)2 zdo&ofj~3%pe}+BUd{cuM_UIG}PHftsE z^m(W0G3+s5oo36h$B=893&S2GmT3WudyHA9g){6iWtbLM$T`V@by_^b9y5k%X^eZ! z8K-43?y=;ZmdmimT5(!Uq3EOr{^@cIdu*7e>oe@JWu0!qu*Xhzx;4Wdd(P=m40{|H zrl&IOab%pH&alUcVR{zB9%tt1ISdE9S*I5=EH+h|UQsAK*@0n(G{YVj<{7dKdt6y( zC^77DW1FGLu*aQ!h9Scq5B3>W40}8oXE-zL@nV_b#<<6ud4?~;+IaREL4}f&8<=NA zG3@c>m=VvgB7k{DCc`Q-<{5bmd;FAU6f^AcXPPO_uqQxZrZnT8K$e+$jC+EaXPPqX z31yyX#kePoai#;qo(Qg)&J0^~*=PDEvQKefpBc`;uqTp%Z)O4m!=5MxnVAI)411y( z*k|z-3QuWZnVZzz*Gl@*}{x_Qn_Y}G3-faSYgdDTbW@`2IFj1hCP{_vo#p@ zWbw>4X4sR>INOn7PY&;FmqN~|4Gyz|8203H%n@POlgB+rj$u!}>>O=|Jq0Xtyb{@` zIWWxeXJFV<$iO-$kbz-O5re{<2nL2d#SFr8stU!XHE_=5W7uWPGFOsePYK&xd4_#D z3=8xP=4vqPDdn0Q#jvN0Wo{b7o^r;yIShL$MCax+Y%*ooQ^_!ooncQE!#qxgJ=KMr z(;WonaWm|xk(npUu&0)3o;AasI+l6%47*HN=D8+vPjBFu=f!9@FN9Hdz6cZ3d>0qK z`5uhS^CK7;=f^Ti&QH)WnP0`gFjt*HeStwD)d{(>odV)Y~)cWzb{X%jm|i zmzkeoFAF=vUe-d+nGVtmA{h3vaV#ih*vrnepq^nb2g5>UhP|AE3t1BxXFXz=UY;m4 zv!Q08xHI1(5k`(hDvU~t^cWcy1u=3h3T8B26wfHPSd39}v6-{<;s8d)#kq`3OZXY3 zmk2XPFEMboTgte8HT+=O^ghCMGCp*HZbfJ|cX|iP4E1ST$z`n^X zk>i1b-KrW!<<-`V=BpDJMb}6&vad04=3HaJ$h^jxNq3EBBIAQE47*GdSspB5*eh?r zuva06VXqfTazO|`|?2jBY)|N0Z z>{VmnSSQE8uveXdW1R*ALw5)R!#blv&PNSq>x>!pYH+X1W|$u%v#x?+uO`QOF^0Wb z{Oc7GxgR@-uQy;|*sIOJu-=n_VXqDY=X!4jhP}EB66?blo!93xFznT1FyCO}Y_}n& zkoQRg^G0okz52`>4H)(sux~VF*lQ@a(T-uS5$nb{hP}q-8&etfns9ECOJslQz_3Y! zfnj1P1J@=k28Ma83|gDa7#O-07+5wX6>>gpP~4QxFiVbcGZ({NGm*`_413KDHY+pi zwcy(vn#lUhL11$V1H)cR2F=Z73=BPd42)Y83%Q>)ux?Ri*lWeNMT=ptwec1!hN)Uo zTk;w9+Hh{=X4q@Xxm7HY`MHD6Rs{xzy><)&Tm1^TpEq!Cjc3?v&#*OzVXuSu);xy2 zjzZhm8TL9!Y?Ef#>#VlTG?DRzgWa~6LarALPTQp!_PTLxk7wBH&ayq5VXueu_Ckg} zLx#Pc96R_E8DBcs?T{$sdfA}0Bb;Hc7w=AHhP~eWJB1iJ${F_hsO(f>=+fle>6OU# e%0Yi;2m`}jUk2V?tc)_dgc%t2`Y|x8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TX>Oq#ygOX=*YO&pOu% literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78-V.bcmap b/web/public/vendor/pdfjs/cmaps/78-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d7af99b5e2ae9a21d534f1965c35a2b572143322 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVs4@9k;tm3#JJa=mvL_(C)3_w tCYHTnEP{KZ9Yqxr_vW_RGcZD-B!fJd#m3NR1ZIFF5Q2$}s-=wkm;nC#DhL1o literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..37077d01e26f9ee2427592f6deebb145d628e731 GIT binary patch literal 2651 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 Zga1J<28Mo525qozH^!R7tj^p=m;jipEFb^? literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap b/web/public/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..acf23231aea22e1a95761f7eafd35f1d42ea6b84 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZElfUtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)t^HWV@PCdp31n7DNvzh{w_;aIX+H7J3%=^yJA)) zK2AY5K{-P|OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cD TWf=DfG8~jmWNdF>+$RD6ERIW@ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2359bc529d160857cce4c1d1bfca1322290205c1 GIT binary patch literal 905 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z2FAZk3XBZ$j0sE%ag2-%iHSmu4t6b-j5@6r-0ZEX9Bi$*+I_?2>H;EJ1Bves=A$jAHFE9OCW89O50^nF<}s{CpiQjDj7(feJ12cbPK@vGH;8 z$qCBwl{1O4@o|dD3ChWZ%kazaxvGe(2qp5iI@mR4Ffuf=F~~M)FxWM@GsrcwJKHs@ zF$y-PGB7l$GjKPTHx@FqRxvQNRx&WOF|sqXF(m4D%#ZCzb++qtW~}LAa<=QLXRPVA zbGGZTW~}L{a<=O&XRPTnbGGX@W~}Kia<-e0&sZ~2&)II0He=1CEN8pP>5Mf~)ST_6 zDl^thO>(xI7SC8SUC!BVhBRZ%j3{Tjnc<8zv&5Y3W(zac%now4o8!+|GndcVZXP#d z%{(t>qxtSSvGc2(?G{8Z)+`ivwp%2^ShFbD*=}(FW6ctNXS=05j5SNWo$Z!+FxD(* zceY!>!dSDy+1YNT17pp~`b4(2Mc%v2gJgFzGm7n2+_xMHsmnYY}9tP+oZu* zvnk!#ZgUD_%@$>6yR8b0HCyAI?Y6}*)@+w{w%Z}WShFMC*=}bDqtY(nM8;Q(84tu1 za=&(9XsKk}>(A3t!?-t)qm`R!Z!lx4ILqEJ=2khuz0u6ACW+jy8yH$G7#Q~EGHA70 z5lR(-oNwmu&3otm&h4G+JC}FP@0{K_zH=z#ezQWNEtp|%v0Pg&!`>2xc3y_Pr3~%- z413F1+XWf+mb0`=1aiK0*jw?|^sUKT-h$CSwSc0M#YHd>-58`gIYvb&iD n*>)T9@b0#Pg?S>=yLkS6EP{;tL=u?)GBipsFf^txFw_75zKR+M literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..af8293829c90ce63cc4c5eda0318003785ffcba1 GIT binary patch literal 721 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z1x5z>#`FXxh1kY)28NdMM4?6pyOv5uomLBO_SRGmw$@y3zSa_U_BLh~hBodX&Nd!) z$u==|$ubO;_+|K9Rm4?<5*gbaWOp+c^0vn_?p9>jm&UMLg<)R?!)`T( zeOZjVH5m5gFz(i7*q6@m2>U3WoWHpXsu*u zV`SUy!O+IQxZ6LGxnq88N2;@3r!!+s7gM5EmxEnbJ!4I`owHq!HDgUrm9t%MIb%(q znX_HLF=I`Ck+a=|e8!rIdd_x}v>9tAWjWhTPG_u{qULNjRhhA7YLc_vw0Opv>2l6? zGo%@7W<)vL%?xL(nI-0IH(QvoW_FOX-5h_$nz?+=cJsIyYvy@58_jpuiJf2NY_}kS zv1XyTv)v*Q#+pUJ&UT9f7;BdBJKHVgVXRr|?QFNqgRy2gyR+R27RH(t&WTL(9qd** zFxITBPhebN-{h9a`0gh|Yknf*+bsc8I2F7F}fd;a<)5^#F%qfk%@D^3?tJ%*Fw%; z4xIaCICqOPwB|GIb7k1=#IW0nVP82z8-vn8^+dK`4gLqc7#R9J8MMK=-56^QvpRDh GVFCcxUE^>7 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap b/web/public/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..780549de19de05b6cbea4ccd4737351bc9ff6104 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZE28OtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)t^HWV@PCdp31n7DNvzh{w_;aIX+H7J3%=^yJA)) zK2AY5K{-P|OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cD TWf=DfG8~jmWNdF>+$RD6C)7)p literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bfd3119c62d9976dde9b1e59c572c678cf5811a0 GIT binary patch literal 715 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z1x5yW#so%%IL1VwMhCl=N=BVl3vTw-R1UV*TyDPB5_a}BW)_Av?jX)K9(Kt#F?Pu| z1D2pRFF(6>Sw^w;7!L9FVh-^R?o5RaWq!U67e>L3;6R0z`Mb=SgxL5v`Q!xU_{y2Y z*!Vcb*;Uk1Z&HHLjzjJq`$ z_T@0{)@In3&A3~SVP8JmZo@>z_Bw`x%!Qoo4a~bO81|KO?Y3oTtzu}cWN2e#+wH;7 z#=yASKasg(er!jovt6e%V@(%RqE?rKT~|G0O}Cx1U5_}xn6YMdkh9$!f5w`*e9m_BxEX8ac{v-+ch`xXU*&AKAcC=Gp}4c% zA`!-#MZwN?ivt*Imhd~&oat|ErR@E@pthRQxTVugkv!>kHZfyx;%{pUeyY&W) zHS6=8?Kb2v)@;;vw%eq^ShFeJ*=}8FxG6BcDCCg!C12+ z+}Unt2&2+2VFtznF|E>e2h|yk52i7?AChvmJCwwjb6AmybH5BD(>~Wi&R-6k`(-$H zi!-$5GwpL_*zLry+lpadIYS$R(n0k^wqFhY2fY{=`aK!6!MfcTYYwwIb01*>0CK|M ArvLx| literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap b/web/public/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..25ef14ab4af42f4b70ccac76cddac8f3b22d8813 GIT binary patch literal 291 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TV`-3ET%a4|9qgs+k;vS*f}u5; zfuS{tfw46qk*(2@aj!owG3?DvWNLI~IN-y;a3IK0v~kS= zzs90gM@9w+lw^69KH^V^*#(jJY U2W1%d2{Ig%O=N6uVB9AH0G^~w2LJ#7 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..02f713bb838a8cd46f5b262c934d0edc8c6e8fe9 GIT binary patch literal 982 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z2FAZk3XBZ$j0sE%ag2-%iHSmu4t6b-j5@6r-0ZEX9Bi$*+I_?2>H;EJ1Bves=A$jAHFE9OCW89O50^nF<}s{CpiQjDj7(feJ12cbPK@vGH;8 z$qCBwl{1O4@o|dD3ChWZ%kazaxvGe(2qiMLItcG(_U7Czp2*S~C%m6so^xNV1m}Jk zIm!J7iL9+POb6l^Sq~&CGagW6U^XPZ-- zb5~g+N1G4hZc_$^eW?s=`yv<^4iqvl>`P%_+?T|_v@f24;XqL#XWMM1-Bt_-iW&9= zG42as*cZ%jK$zixD8m5}h67@W+-;i~_Ej-3?5kj4I8Y+Ud_bCk`9LWH!#+O-hJC&a z4EuZ-81{KHFdyK{WIMnb$lvb1KP;=9zk|0!r9-gENt(J&bX`Hv_|d zKMTeKwG1q~Z3B7RXY7v>X)v8Id3*{-Xe zv8LP3*{;W$v8JcW*{-*ov8K<=*{gEeW{a}3-Btz0nyvB9cH3eYYqm=} z+wG8Gtl1InY_~InQE8WOBI|2M#=ZW$jC%t)nf3-VvFr_F5!@S{$oOh8P8YLJQ8dDe;Y5-?%B{Bd2 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap b/web/public/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d08e0cc5d98b2d933ab848c69dd6c504fbf1787d GIT binary patch literal 260 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZD~+YrW@oP?4|3G$lB=0xYwVT zac>|e)81evmc3ytf_tMKMH?IU<~GSPFhZdugFKkU#t;mqLE@4O3Sc%HLn34IRK|Tw zg+lG~8TPR-9OPu!$Ih^imEj;4<3V1=gMtkExET)$GwkDJ*vG@LPl)lLIKw_Z#)Hxf p`}i3S$};Q|Ok``{%WzPRf#IMc1H(ZT28M%b3=9WVEtn3n005=TM3Ddh literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Add-H.bcmap b/web/public/vendor/pdfjs/cmaps/Add-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..59442acafb613b0c090314379f9f4c2fa134a1a1 GIT binary patch literal 2419 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 PP=$rzAWLfv!$DpE<+x4a literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Add-V.bcmap b/web/public/vendor/pdfjs/cmaps/Add-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2f816d320f08b8671498299c4d00e4564d2ece6c GIT binary patch literal 282 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>X?$E>ygNGCU*(T7&&(YRR)HGiVO?~Rah7fvUJxl H9OMN6VI@cM literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..88ec04af49d1e8ab6038e3b36dd28daf4dcf0119 GIT binary patch literal 317 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMFt-UueO=&{)sVSl`6ZSl`0X zSl`CbSl_|WSl`9aSl`3YSl`FcSU-WGv3?RmWBn9{#`rXK>)}LW$tUt%lSbu?` zvHlW6WBnC|#`8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7)uP=0AU}&soXsmByXsmBx zXsmBzXsqvGXsqvIXsqvHXsqvJXsn;W&{#i-p|O4nLu36khQ|6C42|`(7#i#6Ff`WB zV`!{jz|dH~h@r852}5K3GKR+b6%38_s~8&V*Dy5JuVZMe-@wpVzlou-ehWim{WgZi z`W+07^}84v>-R7;*6(9ztUtieSbvD2vHl1{WBoCP#`+TsjrFG(8tcz6G}fPEXso}$ z&{%(op|So7Lu36lhQ|6E42|`-7#i#EFf`WRV`!{@z|dI#h@r9m2}5K3Gls_c7YvQ{ zuNWHZ-!L@Rzhh{u|G>~#|B0co{tH86{Wpfj`X3C9^}iSz>;Et`*8gK@tZ!@p5ugxg K1O-838v_6fLY3P9 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2aa95141f9f5802818e34b0aa626e34e7cfee805 GIT binary patch literal 376 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF9QtS@wBU}&soXsmByXsmBx zXsmBzXsqvGXsqvIXsqvHXsqvJXsn;W&{#i-p|O4nLu36khQ|6C42|`(7#i#6Ff`WB zV`!{jz|dH~h@r852}5K3GKR+b6%38_s~8&V*Dy5JuVZMe-@wpVzlou-ehWim{WgZi z`W+07^}84v>-R7;*6(9ztUtieSbvD2vHl1{WBoCP#`+TsjrFG(8tcz6G}fPEXso}$ z&{%(op|So7Lu36lhQ|6E42|`-7#i#EFf`WRV`!{@z|dI#h@r9m2}5K3Gls_c7YvQ{ zuNWHZ-!L@Rzhh{u|G>~#|B0co{tH86{Wpfj`X3C9^}iSz>;Et`*8gK@tZ!@p5ugxg P1O-838$+W*V+R8O0wtHI literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..86d8b8c79cfa3907281aa3f25a46f178b87aedfa GIT binary patch literal 401 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF8VTwmzLz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ g2nvEmP#83V0-+HU3XPy(Xat2r;{=9A*~Uo>0CZiU-v9sr literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f50fc6c14e67a228c4ba9a61b1357c16410e8228 GIT binary patch literal 405 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF8VT3_hRz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ j2nvEmP#83V0-+HU3XPy(Xat2rBPbvmCozaLPGJB51;3+h literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6caf4a83146a60a2db652647b9cfed5fb71bd97c GIT binary patch literal 406 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF8VT3_hRz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ k2nvEmP#83V0-+HU3XPy(Xat2rBPbvmCowegH%?&y0IGDO=>Px# literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b77fb0705c28d647d0bf7b25246af566a791b2ec GIT binary patch literal 406 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF8VT3_hRz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ k2nvEmP#83V0-+HU3XPy(Xat2rBPbvmCowbzH%?&y0IP(gEdT%j literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..69d79a2c2c2b00207ab27b68ebf4404aa17c6f2c GIT binary patch literal 41193 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 F763yL)d2ti literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..36101083fa8fd22399728ccf533c48e830781de0 GIT binary patch literal 217 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMJ4^UntMO&{)sVSl`6ZSl`0X zSl`CbSl_|WSl`9aSl`3YSl`FcSU-WGv3?RmWBn9{#`8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMDX3U#QN&&{)sVSl`6ZSl`0X zSl`CbSl_|WSl`9aSl`3YSl`FcSU-WGv3?RmWBn9{#`rXK>YMfyJ04sxCrT_o{ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f7648cc3ff02c44e9594ccbd71deec742e253c2f GIT binary patch literal 465 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7qTVEK?z|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujiBIY1cgT8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7qUtbu(z|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujiBIY1cgT8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7~Twhqkz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujiBIY1cgTZRo(+CQhMo`!^f&!-z6grKd;AsSfPa`OR z8bKk{2nwP`P#86W0;v%cN{ygkY6OK-BPgI6K_S%$3aUm>ST%wIs}U4hjiBIa1cg`Q L1BOQS#zzbQlt=ra literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d7623b500232b6e62f29c2c232e6c2469a527314 GIT binary patch literal 625 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7~TVGhtz|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujiBIY1cgTZRo(+CQhMo`!^f&!-z6grKd;AsSfPa`OR z8bKk{2nwP`P#86W0;v%cN{ygkY6OK-BPgI6K_S%$3aUm>ST%wIs}U4hjiBIa1cg^4 bD8L#)A=U^AvPMvtHG%@I@fCx2;~NG5>wX81 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7586525936cc5398b86d3752a4eb45b15825b25c GIT binary patch literal 33974 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5b4b65cc6292a5ba7d89e976565bf08814bb88b6 GIT binary patch literal 430 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF8VUtbu&z|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujdK`c8s{+p0IJ%q AO8@`> literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e77d699ab6a1bfd1e3eab6db428222e108342aec GIT binary patch literal 485 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF9AT3;B=z|dIF&{*HZ&{*HX z&{*Hb&{*HW&{*Ha&{*HY&{*Hc&{#i#p|O4vLu36EhQ|7742|_O7#izmF*MfCVQ8$M z$Iw{6fT6K|5kq7B5{Ab5Wekn=D;OHvu6U*6(3xtl!7bSbu<_vHlQ4WBn0^#`g{u4uE{TGJD`fm)4^*whsc*8gE>tpCT*Sl`$HB0wR~ z2nvEmP#83V0-+HU3XPy(Xat2rBPbvmK_Sry3W`QhSTuqHqY)GujiBIY1cgTY|u2sUnE008|H#rgmM literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..128a14107750da2939d920c3e0802798c36f2e18 GIT binary patch literal 40951 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cef1a9985191f53c4a8a35811d1caeecdd1a1820 GIT binary patch literal 241 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMDX1U#QB!&{)sVSl`6ZSl`0X zSl`CbSl_|WSl`9aSl`3YSl`FcSU-WGv3?RmWBn9{#`8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF9QtuJ(EU}&soXsmByXsmBx zXsmBzXsqvGXsqvIXsqvHXsqvJXsn;W&{#i-p|O4nLu36khQ|6C42|`(7#i#6Ff`WB zV`!{jz|dH~h@r852}5K3GKR+b6%38_s~8&V*Dy5JuVZMe-@wpVzlou-ehWim{WgZi z`W+07^}84v>-R7;*6(9ztUtieSbvD2vHl1{WBoCP#`+TsjrFG(8tcz6G}fPEXso}$ z&{%(op|So7Lu36lhQ|6E42|`-7#i#EFf`WRV`!{@z|dI#h@r9m2}5K3Gls_c7YvQ{ zuNWHZ-!L@Rzhh{u|G>~#|B0co{tH86{Wpfj`X3C9^}iSz>;Et`*8gK@tZ!@p5ugxg W1O-7OC=41wfza5+(3sWO!vFvgf}8LF literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3172308c79d57147cdbe05930228043faa48ca54 GIT binary patch literal 391 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF9QuP^jqU}&soXsmByXsmBx zXsmBzXsqvGXsqvIXsqvHXsqvJXsn;W&{#i-p|O4nLu36khQ|6C42|`(7#i#6Ff`WB zV`!{jz|dH~h@r852}5K3GKR+b6%38_s~8&V*Dy5JuVZMe-@wpVzlou-ehWim{WgZi z`W+07^}84v>-R7;*6(9ztUtieSbvD2vHl1{WBoCP#`+TsjrFG(8tcz6G}fPEXso}$ z&{%(op|So7Lu36lhQ|6E42|`-7#i#EFf`WRV`!{@z|dI#h@r9m2}5K3Gls_c7YvQ{ zuNWHZ-!L@Rzhh{u|G>~#|B0co{tH86{Wpfj`X3C9^}iSz>;Et`*8gK@tZ!@p5ugxg Z1O-7OC=41wfzSvFg~lF+M*YS<1^_33oyPzG literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap b/web/public/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f3371c0cbd14c89a7d2b5a72e4e4f9cdc6d6017e GIT binary patch literal 23293 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 F3IKnzFJb@y literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..beb4d228104cd985130e6eed7ccabdb63e94ce27 GIT binary patch literal 1086 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL)UbxZ6&FkwN}dKmwye z+^c}Z#^Qwz63GnAuk{%e8yS>B8kHCr8Y>tW8p|2j8Y>;`ni!N~o9rF!nq`%wnqwH5 zn#&s*>{^1AVq1kA?OF?zV%zi`?b>;jV%vQj?K-rSVmmS&?K<6+V!PNJ?YdHwV!M?c z?RprMVtX7M?Rw>uVtZp9?fR^hV*08W7$(&_+VzJk#ZC}&w3|?(6g$z_(QcBUlHQ~M z2EEA)j&_svm0~C7IoeI}QHq_)?PxbOQz>?uhNIndHl^6?)<$IhKxgbH$Zn=Y~1j%`;JoomcE=H$PA*c7cGS-GV$NwS~G2 zW(z|d?H2JU#V+!8v|FsH6uUUXQE-VH1H-})2JIygO0i2>9PO4SDa9^RbhKMmuN1r7 z&e3j#j1uRHXolbwX^wU)t&}uZRx&WGNM$furR=D%DvUvPRfUrHYB2_e)%pw!tMwS1 zR~tBrt}bCY<&Jh6IF&*-crY-mFJoZaDCcOmQB^5+V~V5QCMTuX&5VwAo8y&Y zx5zo#ZK+X;-D>S=Mh1qXmJG}Xtd(L9*gM)C zlvRp77~^Pn$Vw^pP^F{Y;cz9}BVr5;`~4W?j)Xee9Vt;_J!;Gle$>j*?wF8L?6E*c zyW{#wQOENb7>+YCFrM&qv^(Lg6nm1((e7l1QtT;pN4wLkO0lP19PQ31DaD>ibhJBb zuM~T>&e85%j8g1*X-B*Bl}fP}EFA4FiYdij40W`-WULf>smRgpa)46o6@Ev%E4fOH zS9KVouj)IRUgKuqxaOo3d(GR??z*N@?DY&ssT*z#$~Tgf{BN=`FkIDR;JF#*Xm>MN z$>x?41H&~(2Kig@j&`@|l{jwOF@)UqaJ0K4tK@knhJoRM2!qgFHAlO;c-5L z=tDCl#fLr&)(`U?O&)18a6U>@ihY#rsQTEGLE>?NlJFBw28M@u3~o8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;$*7pk;t>qo8groAH!>XMuyjh o42+FTOpJ|eOpJ|OOpJ|uOpJ{}OpJ|UOpJ|EOpJ|k84R!d0k~2rGynhq literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/B5pc-H.bcmap b/web/public/vendor/pdfjs/cmaps/B5pc-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce0013167f852a873b639e301088c094d468a750 GIT binary patch literal 1099 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL)UbxZRF{@h_7CBZE9+ z0+T`|`=GXcRij53PA&p8542=~G42|UsY>kzUc1;XQu}$`lcFnR% zQq3`pOwHvC3N1$Qb}hk5v8_UmcC7_Uv2FT}cI~`MvF$#Nb{$$uu^pL?cAf4@v0ZGA zc3mk-vE9m!c0G(ru{{oscD-^+vAwa5c74`LF@04G43p{|?fS!&Vkd|>+D#}?ik)ce zXg5hvNpDgBgWhBYN4v@TO0kpk9POs~D8)|YcC?$CsT4a+!_jU!n^Np_S4X=U%1W^_ zk{s=3Iw-}?tar4V6{{3GTgK6Dc9l}>97{*Lx#CK(bHg0%=9wtP&MS7bn;)nYyFkFv zZb6=s+Cp6hvxT9Kc8hqFVi$Qk+AY>pid~%HD7eIpfni|?gZ7dLrP!q`j&@6vlwy}D zI@&F(SBhP3=V-S=Mu~GpG(+%;G)KFYR!W*HD;XG8q%s(-Qg&2W6~-XDszOP8wHO1# zYJCQV)p`uhs|_4QSC=p_tSV{@?EyLGy)j-2aq7#Lbg7!=l( zF$k@fP?A}%&A_l;oI!WJ2ZP}Ha!0!joJye^JQx_(moczylykJ(sHzmZF~!ktlao^H zW=2Q5&GAaHTjU(=w$v!aZnbu_+a{?LyDh@eZo8RM?DkSeyB)zwu{(tv?RFL@#qQE~ zwA;>ce6$|}VkjB&I(WTg~)sM68yaJZ7~5itga{eBE`M?xL#j+7{|9yMkNKWgP@ zcT7kr_E?~!-En=TsN;DI496K67*BXQ+MV!Liap8YXm>J0DfX1Qqups%rP$Lhj&^61 zlw!{$I@+DJSBgDb=V*5>Mk)5Zw4>emN~PEf7LIlo#gt+%hC13^GFFPcROD!PIY24) z3csV>m0Tspt2zwPSM?oDuW>VQTys*2z2@y`cU@B{_Iie+)D1TV^-iJ}_`p zf5^wc@Hn4A^r4xO;zJ(>>xcP{CXcikI3Fb{#Xib*RDJBpAn~|BN%#pT1H;2S2Dc}& z42(}w9qpc^E5$xlb5wf9!oct(g+c0>x>D>jCr7*I3QDoh;~ni@*eb=osBtuV8O6Z< kN=QlRl@tTRD?tW^SGEicuRIyJUfD4)zw%08{L7R802X3ttpET3 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/B5pc-V.bcmap b/web/public/vendor/pdfjs/cmaps/B5pc-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..73b99ff2fbca40e7ca5501f61e3f2f29c1fc1af6 GIT binary patch literal 144 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=44ustm~1;v(TI2l^-9&YkfwB q*M8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyX6{?KaAD)F*ruaOaFUS` zETq85Apa^Lfl(puRX{R3NL_4lqf%_6W22I8lYC=PY?E)Jl6SKv>pOQyJFtGPhzevJNOwk zNV0ZuFl@i`S zT**2;k!iLy!?6U0GeS)Bsu>qCFf8R{TyDg0k2krIw{PL0g$gZ3&GE4t%i+C zv2FYyBDYZ~w%xl?DYiqiQ7N{Q9YmxyD#dm=H!8(;D}spnMy1%E*hZz;Uh77s*gi=R zQQoK&+aKDf6g$DVQ7Lw!Ac)9sREnMC+o%*fS-Vjwb_yqmNN-e%o$A`C6gy41Q7Lvh zBZ!D^REnKp+o%*fQyN56HY&x=3U5@3oo(8v6gx*4L=-kE#m@C_REnLa+o%*fpBqGE zHY&v~aBozKU8vfq6uXESL?kvU#V)pQREk|93nHo;m137hHY&v~GjCLiT`meDiW`+; zR|GaH#jezEREk~23nH=`m10+WHY&xgQEya=UCRn0k{gw@);TsE4~<=y)2I}?-m6h5 zc7sNvQtU=H5RuZT6uZf(Q7Lw_0*I(D z6nlyZL?kpS#h$inREj+#10t##m156EG%CfOGiy|eJudK5jBlUu{WX`m11vNG%Cg35(5z> zjY_e%gBq1$?-(>H#opxu5uot92MWLYpzwPD3cm-S@Ouafzek|(djtx<$Dr_g0t&yU zpzwPN3cqKd@OuslzZanJdjSf+mp+Y3%CEE%*%vM(P!bdx4c2m?P?`p%Kp`*DWk90! KXaPV}0RRBp2ya6G literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1a393a51e079d1b5e7898423463fac5e87170da2 GIT binary patch literal 1920 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyX6{?KaAD)F*ruaOaFUS` zETq85Apa^Lfl(puRY0*ANF7%)!z(}De1;l^I)*yNMkX*~V{Bw&Y~%tXKE_5q#zrA9 z5@T!>V{DWHBRQo;xnz#Mg^Ly{H99gdyz*zTY)oxb(ruD&42o^?ZB+7Z)@EdCE^joD zZLTUd>RY&cAwx?rQ;P&cO9(@YG($@iLyHV^OEgo9EJI5?!@4|%mIQ{DB!(6RhL&W8 zb@>b}ii|BO3@u6w>k1fJlo?vm7+NYB)|E20R57%uFt^k&w5T$-GBKG6nqQl%8#?Ye6)*8jIo{PCPkzqX#OKU2_dS2$% zEQYqQV(GqxD;Bc0g)_9pF|;Kyw&=09B{QryVrt7~ZZBilAjH&O#nN8K(ZR~FL6~8K z1ak*J!v;y#E)Ir`>Fiy63@ru>UD8Zl3e3G?3@wJtz4BZW)R-oh7W4KkT)B{8k1@mK z3Whxv9^E zV%K{$D#dQlXjF>b$Oa-(8kJ%iIag9o` z2W%RZVh>7zh>Av~*h68BO0kDc8kJ&?2!V)#My1%JevL}8$8;K%Vvloyh>S+1*b{Dz zO0g$Z8kJ&CF@cDLMy1%(c8yB0XJkM`Rijeu*@#A^*mGu$O0nlfKtxfaQtX9*My1$` zdW}l4mv}%#R-;nvWsgRs*ehy{O0id2KtxibQtUN{My1&6av-9nQ7QIDRHIVtO^ZgQ z*jr*CqNGtN_I6OCQtTarMy1%hd>{f8e)mA(cOMjf4?yAf02F=?LE-lZ6n>9D;rAF6 zeosK*_Y@R1FPLE-lT6n-y2;rG&~QAzogR-xF!g%lMii5x@~Cxu3XwJ<4^ Vra@6s$V+rVl4w0ziV#(b001=lk23%O literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/CNS1-H.bcmap b/web/public/vendor/pdfjs/cmaps/CNS1-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f738e218ae2b4e9c33a1833a49fe20027e869aa1 GIT binary patch literal 706 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`RPes2H2vs1)1i*r=r2 zB;Obm+vMA*4WvGq(mXw1zUY=rFg2F|_EiwMH?l z=VES6WLVF`(wfS!o|m~bi=i#7P+CKgwJn^XEsmiriLphGy)Btxy%AGeHgkI!!v-Oy z_9~Y4I*txjh7H0D8zh)J_!%}xvUYJWY)ohG;$vtrVCa%&>QZ3t6=P^IWbT#cnxMus zxwMd1Q;}hhF~j5vhCL>XlPg)LCo;{pW;m9>a7Kt}UNz$)28N}ajLVG}?(rsCJ1Hu( z7&XVowgfjS#kLwYD#f<(gNWQlrPy}wMy1#e%|@lzPIeHH+Nc!U<=m(g+pP#9>Km0} zdtw`vVtcI{m16rOK}30@Qfz-{qf+by<3^>}iGm;^zfmc6l5e9@>}2gmrPwK)AR@g{ zDR!!Bqf+cN5L#EzELT5hHax#>`ZA8QQ4>zJ1e|VDR#DLqf+b~VGvQ+s1!Tb zzfmc6o^GR3?0jwzk=dveyTH9sDR!Z1qf+c5W)P9ss1&={zELT5i7beyZd8h08ri56 zyUe^%DR#Lih$wDUid_-ds1&wod5s; literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/CNS1-V.bcmap b/web/public/vendor/pdfjs/cmaps/CNS1-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..9c3169f0d9a083b462427bf4e46a25296ebbd862 GIT binary patch literal 143 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=Ij@2sOyo)qo~91%8!qshLNF; pfw7T^iLsH5iLsH3iLsH7iLp_LiLp_PiLp_NiLp_xF@xciKLD(bD0%<@ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/CNS2-H.bcmap b/web/public/vendor/pdfjs/cmaps/CNS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c89b3527fe57ad3b32061f36b73c756ead3fb071 GIT binary patch literal 504 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`L5Os2IC0r%@?(y;q}B z>;{cSrPz&ZAR?tvDRz@nqf+c<1rSl!s1&;;rco(&t5u^?>^2DyQP!vwyFH{)DRzfZ zqf+cn0T7Ybs1&=)r%@?(w^pN4>>dsfk=CdbyVs>rDR!Syqf+dC1`rX~s1$p^rco*O zpcIIxXjFXjF5qSmMsdzA%5BsD6D#hNkXjF>5B?cl& z8kJ&i2Q@0i-Z5xYioMGRB0%AH4-|g)LE-lR6n+mt;r9>}evd%m_Xrezk3r%01QdQx gLE-ll6n@V@;rARAelI}b_W~4tFMS%7lwWB90L%NvCIA2c literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/CNS2-V.bcmap b/web/public/vendor/pdfjs/cmaps/CNS2-V.bcmap new file mode 100644 index 00000000..7588cec8 --- /dev/null +++ b/web/public/vendor/pdfjs/cmaps/CNS2-V.bcmap @@ -0,0 +1,3 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSEáCNS2-H \ No newline at end of file diff --git a/web/public/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cb29415de4f5a669c1b47e34ab889b5fdee6e428 GIT binary patch literal 4426 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 F5CB)4FB|{> literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/ETen-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/ETen-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c2d77462d298cdb261f5e2eed5218fcba35cbe4e GIT binary patch literal 1125 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL)UbxZ6&FkwN}dKmwye z+^c}Z#@dAr63GnAuk{%e8yS>B8kHCr8Y>tW8p|2j8Y>;`ni!N~o9rF!nq`%wnqwH5 zn#&s*>{^1AVq1kA?OF?zV%zi`?b>;jV%vQj?K-rSVmmS&?K<6+V!PNJ?YdHwV!M?c z?RprMVtX7M?Rw>uVtZp9?fR^hV*08W7$(&_+VzJk#ZC}&w3|?(6g$z_(QcBUlHQ~M z2EEA)j&_svm0~C7IoeI}QHq_)?PxbOQz>?uhNIndHl^6?)<$IhKxgbH$Zn=Y~1j%`;JoomcE=H$PA*c7cGS-GV$NwS~G2 zW(z|d?H2JU#V+!8v|FsH6uUUXQE-VH1H-})2JIygO0i2>9PO4SDa9^RbhKMmuN1r7 z&e3j#j1uRHXolbwX^wU)t&}uZRx&WGNM$furR=D%DvUvPRfUrHYB2_e)%pw!tMwS1 zR~tBrt}bC>ce6$|}VkjB&I(WTg~)sM68y zaJZ7~5itga{eBE`M?xL#j+7{|9yMkNKWgP@cT7kr_E?~!-En=TsN;DI496K67*BXQ z+MV!Liap8YXm>J0DfX1Qqups%rP$Lhj&^61lw!{$I@+DJSBgDb=V*5>Mk)5Zw4>em zN~PEf7LIlo#gt+%hC13^GFFPcROD!PIY24)3csV>m0Tspt2zwPSM?oDuW>VQTys*2 zz2@y`cU@B{_Iie+)D1TV^-iJ}_`pf5^wc@Hn4A^r4xO;zJ(>>xcP{CXcik zI3Fb{#Xib*RDJBpAn~|BN%#pT1H;2S2Dc}&42(}w9qpc^E5$xlb5wf9!oct(g+c0> zx>D>jCr7*I3QDoh;~ni@*eb=osBtuV8O6Z8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^B!nr|V>@>ygN@FqW~AiHWh1 zjft_5i;1z3kBPBSh>5XLjES*PiixpNE|F!SH^VDGK8Dx&j0~?08`&6M`6n_Sd&2lm F5CCYoFI)fs literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap new file mode 100644 index 00000000..a7d69db5 --- /dev/null +++ b/web/public/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap @@ -0,0 +1,3 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSEá ETen-B5-H` ^ \ No newline at end of file diff --git a/web/public/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap b/web/public/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..adc5d618d6912cb3a67e4745b63764120f93d17f GIT binary patch literal 172 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?HZDrms_msWUA}o$hOe?l^;Xn zWoOQ25yqxk#>Oidj7*6<3u74@nV1+G*_ap`xtJIm`Is0Rg_sx{#h4fyrI;8S<(L>7 TnUokC*%%lbxlY+Lz7qrhrJ^y= literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e92ea5b3b99b1f20d31c9760481de0472e72685b GIT binary patch literal 578 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWa?XBztpjDSF8dfgM4Fp z0;57)V|t=s-vaw4x22A;EtQQ*yshEf?5(LBY^}N6e61zy>}|{}3~k(vhMa9Y?2>I_ zY?5sTjcP${UX8k;?Xrzp;_by8;vL+L9ts`G{0bc|feI@Y?lNZ*V&miFlM|HVD`yg8 zg<#r9Y?D#i9n zf{5})rP#jEMy1$(<3^>}34$OZzfmc6qHm*8>?G|*rP#@wAR@g{DRzo$qf+ctzJ2SjdDR!1=qf+c_VGvQ+s1!TLzfmc6u5P1J>^yD| zk=dwZG~d0^H+Ftiqf+dGh(@K@g=URPv5Q1NL{Xzs?Bak%rPw8UjY_dgc|b%~qf+cL zk4B}~`I45rPx(+Afl#GDRy;Kqf+b|i${bO3QP-#xyDg?sDR#S6 aqf+b+2@p}%s1&<1q)~}^mk|TwffxYwiNogr literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a7c183228dfdc5c236b7914ca68298520ac60a1 GIT binary patch literal 170 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>Kf{->ygO1a1rBPe_qDDft*Zx vgPB8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`LrbsOa8O$tcq5)TqSU z8s5an*~Y^z*(Sy&*=EqF7S!g|s2kcY+o&bpUd$oh!QJSg(4ow)(BaaoZ`YW?z|hRb zAlszTsASjV&LG#!-l!DNtj565q|U(IT;5#B&|1a7&|1mB(8kEl(8iF+u9(TN%WSHZ z_b&5BL)qQTjAFYLIr(>6FthFUU}W6wpU9{i&v1~rkk>$wp(B-HcOZX9I>SySwvGyh z-9d((3=F%2nLCXcc89QcS}^PmW$bh;!7#MbEF!yjVY*7&G;b+*LDbb^p$ZD#{*<;PXuse%E zxW|owVRtrzZBKNepqU~=uO!3n9JXF*hTXYRy~+%`jM#ha8FuH%^m;Jt&S&jSW7u85 z+MCO;yO5!`gkg6PLvLB3n7JZTZ#l#6V!_^OhTSDReS8eNOWFHm7)-i(wC=M1Ls5+F1Vne1<(ttP>a*_AoO~U}xCF z!ZLv;k=;tsaDpHM!yZ-!p$RSw413rZxFetR{3Px| zPFqFJN!kp11UV;}G3*gCndHd0N0@n11>+u3u1R%;ympGrlQ|joi1SS5W7s3XHCcvX zkEF4Pw}%!!b39VUMoJ)SND* z?9u0)rpK_yfOVQJ!yZGfX)X+Vj98`xFzzvCofgip$CP1OTp_=+BI~qxhCOBs)6y9C zm@`hxWZYxPJ1v)CkG0{n8iqYK%+vK5_SmvcH(}Ug$2i@(kk>^~db%yc9(&H|Q4D(= z7^bH(>~UnAp3bnxiD7yc!yad@={XFGO_ios6iT})GR%->*yF-HLzZEWE9(p;hCOa< zGc+0YxU0n9Tp z8CIDw&&Xrgo%u*@j^-yG*Wy-K8o@16J!=40&SnU%?~Cs}Y-Im4b5 zj@ev=0-lNtvxOP=q;ky`W7w0;Qwlc$>493~240|#;XKOI*$>N!9%&;e$akeAF zo*bRoE`^+4ii)!f8TRCI%n@POlgB+rj$u!}>>O=|Jq0Xtyb5`}6&dFEGwdm3ofF8g zr$}K=1jC+U**R4VyNp@pN;2#zVV^6{ut1+>u0|ohkD~TmU4}iSTyvus_LQ;AO=H+o z&Nw%RVNZqV+3=9}-q$UHxSk#T-3qvZUAMqiWp zRSXPs)fv}GVFzl6PSmDnwBZGBCAj4i6&J_`f zOmUVBGjgpNy6Y49V-#aoBsD6|9D7wm=QF)agBgd-ZMy0@2HH=)V{Tr27 zR!1?KuTEeTT_efJzQ&+YiF1twBl8+(CZ9E)iR^I!40~mplo{VyrSf|0j&>g}czs{(TGeuE+T@b@w4eoW>4D(}T)>Sa<)#O+&#;{k5 zf4xGYM5?0rdIJWAz1j>6>pdA5_UbTjuJ>kO*sIH6zCNr`No4~c1H)cD2J;OjjY>`% zau^u)>N7BJ1nDqfVBcuUz_8blfqSD}qms}@F9wFaMhvVQ;}{tB8Z(%0Ol4r$Yr?>} zNv@DHQ;}hl2E)Wsu1#7D^H_N{nKA4&mD%LN(5;}nDXEY%OOa_a8^bI)#?4#|d(A{P z^D^u;H`uJqu-Afbb7&!FwxYo16o$Q)nw!fQdidD4C^GD|;@hIdu-BS>i&Y|HjxWPh ztwg>YMeQw4j8a?j89BFdGjeVfYgE$Ns=z3-)sK;3YYrp-*1Sd~_N{e{LfhCGCALX3 zs%~$1o*y|+8u-CbX zmtn6#hxGPBhCV}vy`CI9_!Aim6=Qcu z6mk_Qa_=Z(*z3i+lbKN3m4RWe9|OZK!)~S6gX)b+B8ONR-497MD#ad3YE<$)?7+miUxtxs GpDO_OIPMSt literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap b/web/public/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ea4d2d97b8bc1df2abebce0d4f8c58789f723eb1 GIT binary patch literal 2542 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z1x5z>#`FY6g}BD_MCnEcyOv5uj#djsrBu)=CD3Hb!=aHiks@#!iM^W?d5AyUc@RcQZ4J?N;RC-)+Inw%db| zakqaWV|yLLLFPi^rvpc)GsEsM&Q4#3-Qi4~5e&N{7&~JacSkaJCNS)dmg!6_SAKp9V6Mr z$FMt=VW%g`r2k>tS&DGVD%g zSXIQ)!@#gRgSm%`VT*!b4?n~1Oo<+)MAmKx&K_$9hTT~V!aZ&b47;-#Q!dgWyIcV&#*gBrq_dEcRp)x8pG}a*4|u(-GvOjB@DZZ7<$VJ z`Fk9gddnGh7Yp`QGwd$m>EmPAUCQ1k!?3%IsZW(*cR6F9Cd2LumOdSZ9lXqaMuogR z4a|LJ47)42`>YvuSF!bZFzl{o?h9bpT_e;N%CNhZyDyVrcb!dNSs`by182W6!|r;n zemjOe44nO540{+Q`a>Dk#xnKi7xMNt@bnik>|tV^z`(GFnRx;`!yXp12|NsYScN9I zFzjLDo)E#Xhn;gmY9VKz1M7r*hCLjN6UrF&a57A&WZ1*SJ)xRm54Y+>jzX@!2Gfap z410L^CZ;m%;bqvQ$uqHxVGke6Bo@X!{PL5y6IuHmI45Z{FzgXz;GAT}z_3S%L1U6* zpc7%=Qnl$+wt zut!O0N;<~t>Z<-v#9(~?vdJKCESf|-C>@nn;=EAVY zh-F#;;~rzyY2gfeOc|!d6>?5;V4W7vu*ZyHS{maXbH-_zjC(A3r{yy2u~wW`Qz$&C zfq%Lj!yX&v>G}+NY+0w9Fzm6Doo>yr$DVU~6vG||hUuvcdmI_3r!(wvVwj%Au*aEe zdJe;4Q>Ez@g~F2^7-mQ_>~Ue9A{S=br&vKDgAbdX*U!LXN&V?imyUUsGh z^$dGC7#1=!?Bx_($ePGFv!Q08cp>L32fjrj412ja7O61okofRTGC zgR|XI9!ABb-i(n;^PKILc_gyW>Sox>XU4FXzfqE5uYelEUO^d#y+ZyBdxaYf8TN`4 za?NdE*elAloP%Mn7}s(UhHiD)fSf(KV6`yG+^F7$mYjbl_ZL!N9Ork%4)QGXvvZB?jF!o`swb z8#LCGGwfBdUaQE^pU1E^j$uY1^V$T4y{dd`Qxn-AIcTgcVPM#+#=x;oj)7sXIs?Z# z4F-np5C(>IMunV@8qC%iGwjviUYE@@{HDXv(nHP;R3g!(JoSjd2Wnjm=q!qBb2vMH&M^J#{j7m?i!#GrE50pS412AOw^%Vu)soth&#>2qb1OH)UR%zs zVu{Sp9dx!TFfi=3V-VQtSIGUmfqQE_!(MxatvL*P9mKchG3<2|+Q!bX*GXcVG{atJ zwQZ(}j4vGQw#5|ky=Y+BF3qslMQghv!(LZ`?Y<0q-MF^LGwgL|*`Cd?*F$=HAw!=b z!(LC09sG%mFCFZ5NEC9tY|z>f&al^ucPBH$UT^-LLJS?{410Z4cB(LRX>#uLN@RTZ zlc6;~k@4*ohJMdP-d7I#J3|;4_WCmL?qX$>*(J=tu-A`)VV7a6qTNAtM&pBNjP8e| Vob3)JG3FdrWa8W}!^pJH6#%7;4(R{@ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap b/web/public/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3457c2770913963731993654c838df133deabbb3 GIT binary patch literal 218 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T!*Pnsm zfDZ%1fgo0f0|5*S2mJY&_69St>Pmn xgyf_fi&`BS86Z%SK_1LvV+aP*AW=yM1u&b9A(6RxD&sz;b`So2EP{;tL;yL)IGO+e literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Ext-V.bcmap b/web/public/vendor/pdfjs/cmaps/Ext-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..4999ca40412b66e87c56870c80cff32212483ee8 GIT binary patch literal 215 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>RM5v>ygN#sKmI}pMl|k4+F!2 zAXbJ00SpWW{P~&o1~akj4P#(95Xr!BAcTS8KsW=#fiMQaz0r;mirEKz8Q2(v8XcsY qi&`BS86Z%SK_1LvV`wx2GeE)!!9-@&QpSBu{hs{$SOggNi2wi~o;JMz literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GB-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/GB-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e39908b9844939a3c6d6baccced5771b8c1b1b2d GIT binary patch literal 549 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL&tgaaXJYBZK@Nl>{aQ zhCM0_v2A*Z5epZ_CNvruHrg?9HWn~(H&!*O#5S=tDg`yAH0p*nn>T8SxA1b9w5T>} zE3`!ME3{NM>dUvvu&B1$G+KJMCN&zyw&^u0$+z=#Cd9VuG%Ce*aDj-7My1$Jw??Jd zE|o^5*ls2ek3O0iSb8kJ(Fv4DuAMy1&44vk8&Gvq)-O`}rm%&11C*jW~hO0l!W zKtxHSQtX_dMy1%f28~Lw^Y}nSPNP!ne6L2O*aaGmO0f&sKtxKTQtTq9My1%r3XMt; zi|ZQIW0!mwVLVmFvKD#dOT1rf!KO0k;)8o+RJZs7$H u*^NrETRj_r%7cj7My1$Y(Tz&6yDb4yLc)9i literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GB-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GB-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5be5446aa40898742183202ce0624b8acee5234 GIT binary patch literal 179 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;qIjC8tSa;ktnio5kreT14D}) z8$(MN1LGbE28Nb!7Ty*&JBB?{%}NX{PHc=VE=&w9wu}sWq`4Ve92gn)$S^XrI7>6^ ak!57qBge?l5+Tjd62i#P63W1^M;-u^sWO!S literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GB-H.bcmap b/web/public/vendor/pdfjs/cmaps/GB-H.bcmap new file mode 100644 index 00000000..39189c54 --- /dev/null +++ b/web/public/vendor/pdfjs/cmaps/GB-H.bcmap @@ -0,0 +1,4 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE!!�º]aX!!]`�21�> �p �z�$]‚�"R‚d�-Uƒ7�*„ 4„%�+ „Z „{�/…%…<�9K…b�1]†.�"‡ ‰`]‡,�"]ˆ +�"]ˆh�"]‰F�"]Š$�"]‹�"]‹`�"]Œ>�"]��"]�z�"]ŽX�"]�6�"]��"]�r�"]‘P�"]’.�"]“ �"]“j�"]”H�"]•&�"]–�"]–b�"]—@�"]˜�"]˜|�"]™Z�"]š8�"]›�"]›t�"]œR�"]�0�"]ž�"]žl�"]ŸJ�"] (�"]¡�"]¡d�"]¢B�"]£ �"X£~�']¤W�"]¥5�"]¦�"]¦q�"]§O�"]¨-�"]© �"]©i�"]ªG�"]«%�"]¬�"]¬a�"]­?�"]®�"]®{�"]¯Y�"]°7�"]±�"]±s�"]²Q�"]³/�"]´ �"]´k�"]µI�"]¶'�"]·�"]·c�"]¸A�"]¹�"]¹}�"]º[�"]»9 \ No newline at end of file diff --git a/web/public/vendor/pdfjs/cmaps/GB-V.bcmap b/web/public/vendor/pdfjs/cmaps/GB-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..310834512ffe49cbb7ca903abc2dc1aaa934e6f4 GIT binary patch literal 175 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;_jsDktm|5#L!~Tz|dmH#?TVR zz_>?(fuSXwg}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2S$cHGK>r@&e9BfWEmOu W$T2dsL`XBVgfKF+gfcMfkp}>6>M(}@ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..05fff7e8254c995031783fb3b4892d58a6b176ac GIT binary patch literal 14692 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..0cdf6bed6d450473f92e691e9015e4028113607e GIT binary patch literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>F(sM>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2?mCia2DPcH#>$sQq4*XElzBVEiOz9Ew+pdd!)G;TO1e}_Q)_Yv^YyM b?2%<;*dxct&=Mid&=SJP&=ShPuty#M%y2T{ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBK2K-H.bcmap b/web/public/vendor/pdfjs/cmaps/GBK2K-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46f6ba5967cdfb381f001eb1193f17b43d943962 GIT binary patch literal 19662 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 Gg?s@0=Qhm% literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5cb0af687ee20a10ecc367892ae49d7b1e74acd1 GIT binary patch literal 14686 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 m#x)!aQaU{q*a;|BmZ+bU=P literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bca93b8efbb18a13e15025ad41d23db8267d2577 GIT binary patch literal 181 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..38f706699f395dcdad5c6ad93d1a9b6fe9f66c78 GIT binary patch literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>FyMw>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2?mCia2DPcH#>$sQq4*XElzBVEiOz9Ew+pdd!)G;TO1e}_Q)_Yv^YyM b?2%<;*dxct&=Mid&=SJP&=ShPuty#M&!aNx literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBT-H.bcmap b/web/public/vendor/pdfjs/cmaps/GBT-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8437ac33771536813228e3f9c1cb6c35af3acc72 GIT binary patch literal 7269 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 X_Q)|Zv_wcVw1hA+w1hG+?2!imsEjb& literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f6e50e89363483070b25106b94f729ae38587d28 GIT binary patch literal 7298 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6c0d71a2d04473870c60dc59342400fe1b4ccc48 GIT binary patch literal 182 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?d}v(kgV$(>a6RLD6()7LyJ8F zLyH|7LrWL~;~ohHhL&&^-WE4IhCNcvN(?PdY>X`~Objiyj0}6Exfxp=7#a4+Ffz0_ dOEc_|Wn|bR$H>qUA8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL&tgaa$|{<6kBPMh1Dt z1SW+zMn;A`3W*U57se(u8W}d)F>y8)FmX3lHLAomu{A0MHKjD_hBliwYKgb-a+tKJ zHfk%hMDZ)MR5$9&x5}`nw%RmWdbcJu8pgKiH7d!s^K>S}w(B%1#ddIkh>S+1*iN@b zrPwZ&My1$pCJ>R(s1(~{*QgZRD+3~`8kJ)EA{v!q`^_4aVkd}zh@wWN*ogs+O0kpl z8kJ%v^MHt~My1#(9*s(|Q`H)kVyCfyh@?iP*y#?9O0hHKKtxTWQtZsAMy1$U7L7`= zv&BF}NuyHioS;Uf*trIcO0o0!KtxWXQtW)MMy1#V8jVV^3)w(KN~2QjBBw^B*u@Hs zN)e0e8r5T$gf}Y1E;Vgbid`lQA_^OoVwd|jD#fnQZB&X~$qgbh8Lxi>1su2yYS zie1ADA`%;wV%OR?D#fmo1rgPaO0nxB8?$O0l~w6Bz$8?NI~( DBIm>* literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..31450c97f640ff40bd79677cd3e97f4485453d9b GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`Lras2JN)*{H~Rd#@%Sh*~Y^z*(Sy&*=EqF7S!g|s2kcY+o&bpUd$oh!QJSg z(4ow)(BTrOprN?SoJoj{kCRVMP>!#hNsNt;Q%p`!PA*)AUxv?BMO;NF(ak_Hwj;Gs zDYnzOQ7N`d5k%BCD#dokHY&yTST`!g_DX_?@{R7OrPyhVAR@j|DR#PTqf+b)X%JD_s1!RhyiqB3 zmT99>>}+8WQP`*yJIB9KDR!=Iqf+cVZV-{#sAM$Xz0o&zepRDV?1G3!rPzgLjY_eL zL_kDQqf+eRfJUX*C3=lYu}gVCL{_6x>@tr=rP$?ajY_dASU^Nlqf+cjheoB?RdOJr zrco(&byTBL>>7(krP#G%AflvEDRx~@qf+d8gGQy;4SXOXr%@?(qgSI+>?VyyrP$4E zAR?tvDRzrfqf+cv1rSl!s1&;`rco(&yH%r7><$SKQP!vwyECLwiFub11LJ`h0K+%A AiU0rr literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7d30c0500520d563d0e5891c8f4781c61ddcca5e GIT binary patch literal 2654 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap b/web/public/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d353ca256b54236a4acefafdbc08e5b719892014 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctrCoLsEyWUA|t$g|L!;gugB v!)tv;hS!D+jEzi8jE!tejE!7OjE#IujEzD}jE!PUjEz!EjE!;`46pnF60<9t literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..576dc01112bd7f28c30804661f546ece203c53d8 GIT binary patch literal 1772 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL)UbxZ6&FkwKm@fl(oj zF)@CjgG4d|^J{$u#YP6DkVYj2hQspc3)rsncS z2D_GErPx*>N4wSnrPwxoN4s`jrPy{KN4pL!rPz*4N4rjUrPwYuN4u^RrPyv|N4p+I zrPv+^N4s7*rP$tBN4q|2rI@}d28K!Xj&}XwO0g5f9PK8QD8)`RcC?!$sH8V3fI)9E zgQMMKeWlpRd5(5de3W9Ray!~h%~Xn=rr~HeolPlrx~rqz3}vO*8A*NH@iwHc8;Z^-CS{{*tubjcJoY>V&@e*+RYDCid`V!Xty9wNo}DngW1AR zN4rHlO0kQ)9qkrtD#b3&a1>nP#=x*Jgh6{rgi`EM7Dv0KNlLNH6dmoB)hop=w{x^x zA)~~(BAOw1MVh1CN-HJJm6Z$(D^eMZRw+9wtO{e0T~(nZzFLfdVYNO3!)iSS=hX&| zqN__77*>@tsITEtid|#mXt!2CDR!;Dqun~)K>p(nzjFJ6mupPZoMYZ?)g->ss<*he zq&K)XWO5}-TSy|~aev0f29H3+7H)db2OU-*|%MVVuY%M{ZoCQ}mGWC9fwr*f<}pIb7~VM=00Ri|;MQFl^z zVFzPYV@0#}RO#NjM8@O$7#rIS1I3RYXl(T931m*lrUjbNuFCz8Ut5)mT_Lrg=_F5?YzPvZ^((jjdg> zF|?_)JFQ)~BXvg76z9gQ#^UabIgt~xBzq(h8IONuY;1ROh%6=7i!nwUSaZc_N98fK=p($aaN6XhDyCMV5P z@6PMjouSp~#@gxL>fLX!M0ANltK5XdX75Di6KRZ%?cNLw|BV=!8e6#ng-_&sjh`Pd z!F-Ctg!&0}Q?2u+1T?3wN}uO9nR!Cw2EK{ulNfl`iwDY_SoqFOtkHX-1@|J2$(3_c znRRCS^qBSwZ`9bRzEN$8{G8mCSu3*p47#+NE7fdfSS}&m_vtFBlVZAtm?s^Xf!S&^ib{jaALN|CY zFsv_QVB09?Xtz;SDRyIuqunMarP$4kj&_^lm14KZIofThQHtGa?P#}6QYm&@grnVd zGo{$=rH*zxf|X)-3OU;CEKrKwrSE9Bn^!4zw~wRU9xbKVJ(-Snd)<{{_pv$J?MqS8 z+ON#Oa3qAmaKFE!!vN14R)nnkf8RlqrGg-;zmJ$QQHAe>dTk(!|x9XKRZrd@0 z-1cy^yCbXQc_)T};eiN)&|Ni0yStW3v3DyRMel_%Fx+-$P`{U>qIJ;HdtPkAdNFK7;5(GbP1`J`C0m^BqkdX)|y>N>qw{ zl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkY-pnEWUA|t$g|L!;gugB v!)tv;hS!D+jEzi8jE!tejE!7OjE#IujEzD}jE!PUjEz!EjE!;`46pnF@1ZLI literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..11d170c75ed8696f0705f9fb9f5afcf3b0aff4c9 GIT binary patch literal 2171 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL)UbxZ6&FkwKm@fl(oj zF|o0Dp@T#+1M_Qr2E|4OrI1D?28PB828PCR2DZjZN4q8lrPwBWN4sWOC8_2ZMyBTS zMh3fy;ccs`aHb=Xz6s6d1WkYJIi=X%SVy})Yo(aJDh7s0^^SJ^;YzU+#2oD=lqkhcGmP0dt_ou=VvH=Ru>cDk#h-3(==*cnNVb~7E6VrSMn z+Rchpik&UvXg9k`DRz#fqupF_rP#S)j&}1*lw#)PydCWpYbwPq&Ttf5;>N(RFoZ#SNrY1DQWi(MrAbP$%M=~$meni8F1K^E zTOp&wxgwe&ctx6{-AXGZ&6Sl53@cI@j8-W-Dy#})kX==wB)(dVfnl{i1H)=P2ItiV zj-sne7#LQSGpMiOQi@$;26Kq+>uzoXqc-Bw4=bvX&h5})=MbKtk-5> zSTD|?yWWFAaDBO>-3Csj&J+HF)-irtvvXt&8pDRwiXquu6srPwWU zj&@sWlw!A9JKAlNREpge;b^zrOeuDIsiWPFV5QidLXLJj3zTAa={wr(=2eQ_?c->- zM@uPoPo|^YUU#L~eQb_)`%;v&_A4_m90_4C-0$ybd4Q3D;ix48^8st6*aP;Cb_ZpZ zVh_eR+8we|iak{6Xm>bV$@YjC1H*nl2Du}lj&?^%lvs}%GlU;(%)yNhB$sT6xX!%^yn8-wzVBqjfwYzz!n^%!_=hB?~ZOjfeF zrNqE+&5=R=R=lI#t$HPn+ja~gw>=!~?#L>6-icvgcp$Uap|M?-p|Qb)v9Vo_;jc2oUp0otb_IsUhCs%~1`meD25*MO27iXeh7g9v zrV56CT#SwFiVTenQ4D`o7=GI_G`1@<{I+LkY=~iOY=~!QY)EEkY*%4yY^Vwp`jy+* zP|MMxJt42hw8vy(bgL0dk3x@phjE8sM_jL2PiiB-R3P`Sg@1WEG(h7QxZF>I*mJxx|1fdH>S5$bueZ%R!rwyAvDE&s&sE% zBIB<+OpWb^fil1DH#Yio@^&&!lx3Nd)9v1C-|I9fc1rp37-rL++TJ*siRE+RmKk;g zw(!qQ=*nsHXtV6n>9S2^{Pml$vEAH}>DS-JCS?ZZK!e{7jZNxZN?nRw3e&w?j9R^C zBrH>0rqIRN#W5v*qHR0#Vl@_4j%l9Lk~)1ltygBRtm^metZHLxmz==SU)q@6R5~T7 zBez|+BXvg76z9gQ#^UY-wmFd#vL>fYuJ4gZWc*#g*x2qA$o0FZu`O&}?D8yb)o$#F41n+uiEZ1NqL=7qwPu}aH^p~~&xF82uHWyN8ry>y8e1b6{ueVewk9xq zV_;}(6KD9K%kZa|;eRM&V|%D0%kSUcL>MMSGHeiInC}~C^2edEHHU3t`c$K4W1gPy z_TX8yGlgcFY_jEIViTJ$F{x;CV!9K+Zp9e+{N2^=Hp_oaNN) zGPjar9*-mApM@V}5*hz2V*DT%DDY>=U&F?={*8wW`b+yu`olYYXDUsToF=g@ey&ps zV|iC-cTOVPpDm1y?dc2*AL1Ao8rw4&7=GI^F#Kg@VEm9ADEDX2ubj!{Gh?O*t&Lq9 zGbMdS?hJ#e3Tr+4xcVI%!{mDlrkJl+o1NGbJEdkO`-Hq6&*^^CnP=L})Sjy`mphU9 z&n?Er_FM*r@3jn!KLi6s|J-kE&)*o@S~1yZhT25lS@tueW{8Wd)|;2z8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkVs5DGWUA|t$g|L!;gugB v!)tv;hS!D+jEzi8jE!tejE!7OjE#IujEzD}jE!PUjEz!EjE!;`46pnF@Qo`3 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap b/web/public/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ef7857ad17cefc4ab714d209716002317c23baa GIT binary patch literal 4437 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 GP7na4XfMqG literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Hankaku.bcmap b/web/public/vendor/pdfjs/cmaps/Hankaku.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..4b8ec7fcef466bc4090dc13c8edb354cb94d0b67 GIT binary patch literal 132 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55U;8L(}OlM$dOlOd7(qLj~ ea%bRdVPRls3S;1F;bXLGa%Yfjk!4_PW&r^5awXIN literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/Hiragana.bcmap b/web/public/vendor/pdfjs/cmaps/Hiragana.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..17e983e77264c62ee149d1c8ec576a23e8f90eda GIT binary patch literal 124 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55U;80*_VP;@ya%bRdVPRls W3S-b|;bUNIW?^7zv1XQNu>%0E(j#{O literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap b/web/public/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a45c65f008e7d6ff34edaf53af15ea471d4f6d90 GIT binary patch literal 1848 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWL&tgaaXJYBZK^YxdcXq zxczd8_6rxrrZy_MG&(n0$2M^^Dj7AUF={qTHY#y8JF{{&`?8BShjWNG=QnCNx3D+b z__cU98Zx&^F*3BuF|xPHGy1lwH!8)pmNqH{wFNiohPJCUYALkW@GEr4w(G}s*flD} zcFKT=sz#;Qu82mZ*lx2%rPv-35K+{q6x$ons1)0$*QgZR&jTW|8kJ%vcr+@-PE>1D zik-v)B9a=FVkbK^D#cEb0}(ZiO0iR;8kJ(FSu`reP8S0aC5=k4GlCkGVrLpOD#gy? zYgUS#mD8xCH`|MWVSxw(%j`-9hBL`Wm&Aouvmv-fgj^yUDm}0OpDDK7WgwRwq;rnz_{3vVL>p%VrPcMZVU@T7#4>x zFAif|9L=yefq6kF^WqxDC5#LUA{m!3vo45Aw7a}8c0od;lFLFn28M-k3?hq|85kC5 zFfcBXXjEceB*nn6R)c|MksJfV0&NDyMam2e3lbRo7pXQXi7hH+U|8VJAiS7|fnk9U zgTZ2jMkUR~feZ|*4H(21S2Id35pGn9U838l6uXogL}WH9DKB$pU|1o~AiFG^fnk{y zgXD6~MkVIu%8U`q)f<(VS1>RzEDvYUTfxG>u)LH(c7-t`=Ze5arKlCr3=FFS7#LQX zF)*wwZ&VUoY0jv#(vyK=q1+UR$Td9xkEcI^&FhHZ(B+6+6r3dNr;7}jwzEDB{>$HlNHTxlIIX&06q-F- z$gn7$ah)N`EJ|fqXT`KAonf6d!=fyvbvBHPvYFP|Gc3wyTj#{E zz=2_%C*z_*#&uo{3mn%!EUIBxm%zBFj$xBNZG8>HVo!zzAuJo185VmpY~TQ; z!3~@Yi+vb3a4{_QE#!Q;kaYtO!{Pwu4MGfy1LZb|F)R+&++fPE&xCD5d?C-Ph4LHH z7}jSiZDeCuoXERTlVL$P<3@9a#mUSYEg2T4GHkSESe#ZU@p>WCMmvVZ8H^hp85UD%hQ;NK8{?Q3S1_zL zVA+_!u((=vV``!5n}sZ!xEYqPF)ZO=+$6xTgo}BT5W_k<#w9!q3!)h}i7_k@WZWdd zutb<)lN7@eQI<{8j7ub#HYqSHkz!aP!?;PAaX}2{CRK(da%`LQ8J8$9ZZcz7qQtn# zf?r=Sfa(e$vctr?Lwv{x;?xM3*y_H7#5m0Ix{R3=Vw@` z#l^6&q}7jMcA7K89Ghk*hPmm9EN|a2tW59pV_1`H!?2dSyOd#hLZbTHC7zr78TmI$ zHY!nIk{0Ob_*MbNNH4x-Rjh+B)v_6(R!N=BlEV3MkW4jHH<#nc^Z{i zw?{HCYzkp;-5$@tutkP}e}`(LQtS@XMx~&g!i)?%(-;`GCo{0`Om9>Y+nLYEw~LLD zbC)Qi)-L%*CCgo23=F$P7=(ATF!Jt}XjF>bt=6c-ut%2BX%7pd_#XF0rPw|3jY{l$ PZ5c!Mx;84s?vnxlY;8iU literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..0e7b21f0a612b1acc41c1b23ad0060da539eaf2b GIT binary patch literal 164 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^gB>>l*5;>yaq1a1rCa3Py%~ zRSXOV8JL*%RWmZ|t7GBbSFg*kpS#(VVLuNW<9=QyhW-4E4EqJRS@#P{Gwc^@~ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSC-H.bcmap b/web/public/vendor/pdfjs/cmaps/KSC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b9b22b67879d4043c75b617a24f96b0bd47cf4ca GIT binary patch literal 1831 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>R8(x-6`N?Us2H2tsN~Y<+-M!! z#L=i^)Re}k*(}+p#M$i3%GvD8F5Vo@A>N$dsNvkg-e}|3;@xP-+$zP$&??8s-YU=N z+p6BE6x&+bs1(!|+^8GcuGXlf&|br@&>`EdAKPKqs1(~N10t##m14Uh8kJ(Z%^HjKFH3B`KEs?E?)h#E z3zQY+2Ng;MDjLl%W>_S~u)v0Kff~aiamEE2tcxTV7HBc7)nHmA$FN9=VSzUDB4vgJ zIt+`{85Za=F4AIHpvSOChiQR6!ySY%nK9;C>yz>IN`71IK9 z=0!FPi<}u2STQVeVP0U(u*idJfjz@wd8P$kjEfZ+7OOHW@MT%7#;{n2VSyjxVqMn7 z226|185a06F1BS_5Wu+DkzqkF!(wNK#cm7>LKqf@FfR^cTpZ1?IDvUVDD&bP#wCml z3nCepFtaX*O0)}Bj9rk>sN}NHj)7re9D~RrW(I}@8Vrn!BpQ{N7fCTNtkqy(StQ56 zut1xEagj0u!-50`|3#{eN@9yj85kD0GYBu{VPII`!(gyjp;1Y5aUcW3Y6AxG#np_G zON1MhVwdPPD#b441`(N!O3KUJ85mZ`GsrH>W?)!m#UQzyvr&n8xiVwKa`i?f<`oPK z49mkA^j5GiFf1=+kX>QS$hji0Q7LLgGy}ux00xGYW(*7~%NvyhSDG{Gtn_4HSXsot zy0VOcVO1`J=*pT#CI3}I3=HcE8F*GDH7aqh%4c9$6~bV*s+xger7MHLYO6-2*wx;R zO2KP189CO}HY&5NWn*AiqsI`kmN$_xJcVJCL?Ua9D#Nb0CO?MV=FN5t+qF9!8MY-h zYBTKgDilvu z7}jwzEDB{>$HlNHTxlIIX&06q=hIR1_i)t9w zB`_|kW7wq6xGs@lF(bpeWQN5|468yI*QGElW@cF6%&@?XVO<)-Vpf)Q>4nPaiVTa{ znb+koEaqTbSHQ5ClVLG8!@43+v@hmmTvyDnn2&c|DZ^rZhV{%0d(xTLvoI_cWLPZB zw4Q@uu_(iOZidBT4C{Fq7mG8l=Ve$d#kHQFVX+MJdMSp*vJC6x7#7R%ua{?7tID=s zzmPXW(RIBU<6?KV^)(EOJsB2+uxwyvSnSQPfdiBVH*hj6_F>$>#jx17kTX+}bpsE> z;sE9iLJW%o7}gV_2NQxY3beaTdcyXNJW&3=1OoHo7n_&STgZ%&@qC zX=4b(;zEYS#Y`K+85fr@Z;WDCT+X;Lj%jfP!)gPTjR_2kt5r9q7OLhbvTWjJSi;7z zgoAOD0K*b4=1oEj>+Bep@GvZhX51vkutbn?lLW&OVTMgo3`;~=Hc2xskzm@Sz_3J$ zVTlamCS}G2F`S!J8J5VgZPI64qQJPxjA4lq<0cD+B`S=YtQeQ5@@}$WT%yjf$%|o$ z7V{?WM9y4ArX{*PybKHC+ng8{nm0N#EEMNwSg6Itu&|`nk70J2Gs7I4W+#TZ>4_}4 zc?>JlJN+2eB-=2o-&Vuuvz@0=iFJD<1H+~e2G{NJ3=CUj82ERnHY&yL zFl|%{+9}M)urrN;VS6$I`_A-6C9$3PjC{M;7&&)|GHUITZ&b3}<;B3TTZBP)Hwz>0 sZiz;v*xhQ4N(_5s8J+g9FpBSSZ&Zri6W^%BzSov9WUp(ZQtUn{03-$~Q2+n{ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap b/web/public/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2531ffcf41acc01338f781c845c7f50f62fcc84a GIT binary patch literal 16791 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 IX5KFa041U?n*aa+ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap b/web/public/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a8d4240e6adb3ac1db859085b769a0715be03c72 GIT binary patch literal 2787 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap b/web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8b4ae18fd3efdbe020e4e1407d2f65125085a71a GIT binary patch literal 2789 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap b/web/public/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b655dbcfb123ed06c7eeb87dfc96ecf6759363dd GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=N;^vTdW)E;jHTsuIrH~uy7IM zz6wT$eN_w$2N{@{_Ej@7?5ktp-dC^7u%Elxlwm&)8{>XnCWig|j12n)xLNlLN;B*i RXJptf!N{;*Qkr?c6aYpBGhF}x literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap b/web/public/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..21f97f65b4a61adfa13f55d5a096ceab45eb485b GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l#TdW)E;jHVCD6nu58J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hzWL)UjxYL$_@gJiCBZE9+ z0+T`^}8I4LVjn0kMu}vI}N=8j-jGE1ojY^!&&a9lxzU<=7;T+=4 z`HdRRE$odpel6aOhRm%}j0~-EjO?xQjJ~bvjY_etrHx8KZNZJYq3vpoS_;w%e>xDYi!hL=-hD#r6g?D#iBcH7dpS^MHt~My1#Z z9*s(|6V)1(VkfbHh@?iP*vSr!O0iSqKtxTWQtZ^IMy1$k7L7`=)5SnUNuyHijG#uP z*qH{6O0l!}nw4T_MYYse@%*RxTHdu}`f!`vu_fVtU?N|Ezy7#QZ+F)+;+OJqF#oMAg}qQ*i;oBj37 zk_T)USq_9TG9HL-l;u7U+bAhSb#F>@U%_hUKC zB*lD~-NoiGH#6s94<@$5K}@WNBbgWv$Gb`%PIR(4T+J+Z#3F$2NVt>Dku+wxqsonn z#z&nReQb`FG0Pn@4&gc$(;_*BMM?|{w3!zvGc3?ySftLdK$mfm7Q+HP zhDAC|3-lQl=`$@bVpwF%u)vgYkr~4x%R==_3mF!eF)p%VT42t+$cAB&Gs6NahD9#S z3#=Iyd2lVTXIL!Hw7`pTu_D7_RfYw=EQ{3`7V9u9@MB!8%evTrX|XxO0)NKEwoD5G z7#BM-EC^;;?98y(jbT9u!{QL;#bJz#qZt+_FfRyYUR=YtgppxEB;yih)&)_Cc9$2% zE=Xupa#?7{z_2imL1Ym#1H%Fh2F67ajY`amq!<|1YA~=Yl4D?4pv}OzNST3QK>~yS zBGpDEu|=f}3=7;DgctKLFf8z4Fj%b6sHC|#kbz;f0fYGBYDUQ=!i`F?OLQBRVwZA* zh|ESM3r^D_9s9mX|Wf zt}tfgToKr)6tyCnfnjw31H(!)28Na8jY@(m%^7u8dNMGqEMj0?S;oMyDwjcYWlf`! z|0*E{hINGuJgbr#mAF^sGcc?QVX#|O&A_nIl|f*&RijeuYVSs+;5C|z9BXPDmD$#^ zF)*yrV+dKxo5*zo)CI54d9WL#9pxXz1Vfg{^GABIIGOzVOf7L_ut3u9PR z#<(tmVSy9lx+sQ48Ul3`Ib!@78eMKuiT5*QcNF>KOjT$jkO zn2}*!GQ(mfhE*Yq>rxmNGczo3W?10Hur7^ZF)Pcu^g`w53mF!(Gq1~GSj@q=u7F`N zC&OZHhIK`tXkX0BxUQICF(2=`QijF+4C|R0_M|hfXJJ?@$go(LX*~zSVo`?m+zgAw z7}oPJE*588&&#k_ifcVT!(tic^->IrWf|7XF)WtjUoX$FR+VkNej)FRg|6$(7#F*< zt*>EN?8&eogk=LW!(wlS4IH2}xPg;lu@B=0E{4Uvg`6)JvTopESRBB-L5N{-pxg#A zhQ+~}8%!DYnXqk$FXVZ(P<}%i!}@Hcjcg2y6L~jkGAsyZ+-T0QIGK5)CBx!WhK;ri zi_;1vUN2X-0n^41hQ);pi;I~y zhBGcMVcrvyf#IH^UM(h9w+~n*?@(=2irrz_s1&qQn2}*; z8Uw@jWCr$~>5WQaJM$U&cCj&X?h<9x+9ltpWVy?Wfnm1@gYa$^M&8{LjY_e*)f$x; n_Q*0i?O|aQ-{an>6uT$BQHg!8En~=D*G8q-eNqXG{}_`2c&T|h literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap b/web/public/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f3c9113fcf0b02e1deea8246bfd27408becc8401 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%k~kgV$(>a6RLD6nu58J;XlZGnYh++xso>knU|bjRFGekSdyBe y$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{bJea$}HdW(NS2fFFMV literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/LICENSE b/web/public/vendor/pdfjs/cmaps/LICENSE new file mode 100644 index 00000000..b1ad168a --- /dev/null +++ b/web/public/vendor/pdfjs/cmaps/LICENSE @@ -0,0 +1,36 @@ +%%Copyright: ----------------------------------------------------------- +%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. +%%Copyright: All rights reserved. +%%Copyright: +%%Copyright: Redistribution and use in source and binary forms, with or +%%Copyright: without modification, are permitted provided that the +%%Copyright: following conditions are met: +%%Copyright: +%%Copyright: Redistributions of source code must retain the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer. +%%Copyright: +%%Copyright: Redistributions in binary form must reproduce the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer in the documentation and/or other materials +%%Copyright: provided with the distribution. +%%Copyright: +%%Copyright: Neither the name of Adobe Systems Incorporated nor the names +%%Copyright: of its contributors may be used to endorse or promote +%%Copyright: products derived from this software without specific prior +%%Copyright: written permission. +%%Copyright: +%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +%%Copyright: ----------------------------------------------------------- diff --git a/web/public/vendor/pdfjs/cmaps/NWP-H.bcmap b/web/public/vendor/pdfjs/cmaps/NWP-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..afc5e4b05ee6f4be4f17eb616742b59aee4c5ac1 GIT binary patch literal 2765 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 Ky?zV~y9@!b&>Kqt literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/NWP-V.bcmap b/web/public/vendor/pdfjs/cmaps/NWP-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bb5785e3278ab7a24b3080cf22ea0f609aab4595 GIT binary patch literal 252 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>K7iM>ygN#sKmI}pMl|k4+F!2 zAXbJ00SpWW{P~&o1~akj4P#(95Xr!BAcTS8KsW=#fiMQaz0r;mirEKz8Q2(v8XcsY zi&`BS86Z%SK_1LvV`wx2GeE)!!9*U_QpSBu{hs{$SOggNi8R|Y>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN2hyWNdWUYs0{}z@Cxufx}K4 z1x5z>#`FY6g}BD_M4?6pyOv5uomLBO_SRGmw$@y3zSa_U_BLh~hBodX&Nd!)$u==| z$ubO;_+|K9Rm4?<5}7;Z$9AMT+jTlK)^sr?YIQl-b=5Q0blW-G^;k33 z^i(<9^_DZ%^qD!^^&2zR^cOkXO~_}gnW*P%H%XhZW>S{3-Q;w}nkj0|c2kuZYo;bS z+f9pSteGz7Y&S!iv1Ue;v)#;a#+q4T&UUkf8Ea+-Ior+gXRMja=WI8Ro3Un|m$T7) zcb(YzRnB$`A{c8HiaXma5@D=a6zpubIDoNc3BR-5QXa;drQXhV%RCrsma{wCtzcoS zS>c?>G~dB)r2}Kl%K8Mx1@=vDiA)b1>{it<)~vQp6nW@ix5k38W=*-X-P#hynsvs` zcIyooYu4vG+il2Utl6mTY_~~+v1U`cv)$$t#+oh4&URZB7;Co1JKJrGVXWCM?QFM0 Zg0W^txU=2P5Jsh4!ikKp7Be1*0RWEtrl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7UUi5rR$N%+UUr**PoYhZy+br z-e4w{y8J;XlZGnYh++xso>knU|bjRFGekSdyBe u$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{r`}Oa}lMG#?cJ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5db27c5cf1f5b0e66e16f6314d042a4ef707222 GIT binary patch literal 48280 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΃v&ripAbiWy(2gN8zRjTk2AFfbg8WnwtP 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 B0Ez$r literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1dc9b7a21bc59b6540d55b3d8933e5a6ba9f8947 GIT binary patch literal 156 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt>=&#X>KtsO>ygN-Ak0v~ zz)&T?kUKw#u~CeHu~CSDu~CYFu~CkJv5}97v5~8JjwQou!$u3nMy5c9Mm9!8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8>WMF7sU(d{VgW(Rt{6FpWjEoN$ z_SY*iGBC(9I=V6}U}R}wVQf@oY*b}!bYW=JU})rIZFH7zw2^0M_HXfEVrF1sY)R*C ziPLIHXK%^a#nxKSz{IQ0#KXYMz{}Oh!NknU!KBpa(#XTuD9GF>Akh?>+oZ$5&cMXL z%)-UMT+PK2$;`tb!NAO<#mLO6$i%?P#K6oZF3Qi#%D`f*!OXxdEy<$aSlMLQ?$#LB zV$R6G$;8Y6hJx(O5a`Isu;R5bb4yfO4vco4wIVCE2FVCGY1Bd8j z+a`IYMmfGlrB;DP&c@nC6(tr}2HbwqcoT&Dp`qus}kz!%?a^PQEjhzm=J_Ery{#ig}7STT2DYlv2heb`0|!8I~z9 zPPOFjVP$A7VQe*E>(*s%DrM+(V470E&|=Cr+mqXjZMF#GgixlbE_@S8StoHb@G!RI zvrS}SXbNHJmtmM2&o-%swJ(gRT~e-#(Y8-kVwnuf%3|YA7uGomO#RlfQ+b8w)^Knz zcJZZm<|-{n=a}opGTqr}Nr2EiX|AaX2KF+G<2fg$vCooXTUN=~U%=Yv#UyIpRKqb% zoo%@WUj~y4Q=1@5n~p%cKSO(sz>;K!NerA5iexA9vUH2Ew3{+cs%D?1!O*7T+~sQ2 zRKhr0RjM&hs6#ZcQAxVlk$D-P=v-bVPWHJ9QtdX3GxVAJSQuw%3W-V2E6UG`;aEdALGot3OTs_YA_xM%t@EM{Yxz%JOy>oiq^se?_h zIaaRE+IWH!W0ySBWJBg=Znh?Awx&9!W(k%~cb3iw<~~{0i3SYQlbEJiGxsPmb!D+O zOENa|G4_LykUEmKg#ZlcV{1c^P{-Sf(Yz|hXbKE+jJQWfLO zN-ht!CRNrZ8D<8y$!07~tekz)j8mnUXV~+0CooKxVQLd$Tb0h+SRmERpti=$W^%Ra zY}qg{|F8vssC|El;{#o2`>UdA@7RsyfHU zI=zO*P7mfrHC8q*7B&WkiAC%aiy0X}#T6q1I|C~NBLn-y6y}MkEG&F1EE6LdJttMS zh-)(Ov@%YUW1OsRz{b!brq&`Z-DIsYEhl`sxKL9O`vei;34$yPsv-0+4wJEE&+uBW%vY03@z~a=TCfF|#C#yP5pSP9AjDeRyYeIs+glIh$%_a%aCQ&XX zcQ$VpRVJgx0LDgNrintz{mLAT`5ZlbydB~k&E=v@5^N02988k^0`C3Hd>pJys@)<* zODxEM1J8 z-ARspf(fm93T$i)oZT60-N~GNR?L0Y%nYmyJiS$Hy_GHu8f;=M=_ZpZg!_0oyoFl? z`TKo@yRxO3xEXj`b;Vi@SQr?)>G-ei&7uc^_Pz|>=+*3Ycn6vxypC(tb} z$RWtY&XCBZz{b;)#9A&@#MH>7I3batnN6(6Nh+45J6fhYhr@-Tm6NNLfwM=Qp({j} znTJhHfxppAqA``J%Ts`%k+Z9cr%8&ZQQVrxuF;&AflJ7vD?EfrsMXu7HK0_8p{*>b zUzn#uj=R~H$%e5%gh5xNyPlgtg2RTxmW8oR(WXs7fGMxD!oIUqyMu|NgORO0fxA!K zxy?a`sZpd;jeC+gvKW_}*gPG`<86J{6I#!6-vxzSMSDQwfhmBo(E`+jV(Um@?BQdWZq3ZbV8Fo4*}}xxmd7<&fw`ZBX`MSm z6=Ndt(%7Eh$msXGohgvh?{7P6Q-fAhgXcxI3)vS68ao6UJGj{$x%@fX zDj1j;BpAgRSy(xlSw)*t7^Iom9l8BE*4wfQGRrZrGYB)YgGvrgQHI7mRt85_fAPl2 z!Az6%c^Mei)^jv52XgtFb?7y3Z7#*F8U7|z=>2n9;{7yT$|yio`e5f{duNywdWZcoAMej);jY0_jVaE$}lppu(Jp= zatpMvFi5g8Gw?Bpv8yskF$gp8ISTqu*u>7r#>mRR#wf`k$tcCh!N?@ss=~m>3Th&A zvv4tpGIKk!`7iqH&bl^-X^JIFw;}TuJC4b^f!zMbx1=|2VrbkXdM@%@#NW8T+2@?4 z1wo5DIX zj%8|UAWwkc1V`rcHs{T6Fx(J5A9LQ3S@gV%fFoOg+zuIr^R^7=IO&gEae6yC7apVjz-l59yIfUV}E2AKD$xdUAHxN%*SzEF3e@kMPyXXaxTWnf`sU}j?! zWngAyW)NXuW#DCD;_6Ccaw+zL2rBF6~oR<>q2@&pPjY88;!Cl<&Z7}+HG#^8SJJRy6*x-Wjno(or%nwI!CZQHr72 zfuXI0u{)TdQI4hAhPf$#p+yDcIOZNc)*0DctqIIMaSY5%y($dzQyH2RI3~z3wrO$9 z$Yp5uVQv!OX)AN&32a!(&o()Ty{U+K0s{jx^Q3gvHaYHDjBHb~*c+pmnk^U^90dZi z8XIglr?9ZBOy*gvz_>YBaDD{iEDNq#rVNuMS@%0JFU@2SVCdFn=+a`!;hGs6$RBuY zLPXnyd=hWft~R}1`{*Wg>(i^mP;NC$3hv7 zg)lKNov&tKW@2M)(O_g|IM2n*$#9;LffHP?v$OIrwni|V3uA26XE>?Ic+QXETqLOD z2TI$_SIZdBJ2ISiVL0#2eBJ?+FIgE_n9rLraIqZ}XJ~h4xCrWff+Fl9J5#$2OS=Ip z10yR_I|~CdTN@h_GjkgYBLn+^Wag$I24o@ZygV#ILH zo8g=n!#RIuRz?Qqs|744q8To-F3R|4A%4cTGPbSJ3{5&rH(eN7wHOX+ zGR-SyRAFe5WM~B?W=KM3yu`zh!hA9nGWx;Pn#MFGf^nH9W1|jZqX7dm;}svK(~e9% z#Y|W27%zr1Ff(28VmM#S$iUhqz;Mok>4YlN9y!KK>8w}e*jr^785mo27?{BUe$Joq zo*2XRLIzMsyE-xlUO!gasKCU??8p^(fZF}*cz6rPdK&?&~i%+Sgg+ox*ZD&)u<6!|&Di@}D;(LC^WW49D@uQ=1}9L5RU z9FwEjTHM$txG>IAW}BqL+AApBT+Fasj&-pvLoXlCB!Bi+JE4^t>?_qdS~A&Z$8pWp zWu0gzI^C0Dz7_M7de-J#w&_M}3_O$lnOV3Q*jnqEJNy{h?fF^?6uLu|Hp(zf2xXZW z$l7GY&}6|rS%+-`3-<(8zD7>QR#TRVE=)_RS=%Dm7&sPjF)ZQ~;oxCn>@*JK4qkH5 z@iKqoRffjK;>O0ZiB8i^n`&NK-!g7IoZ~1GylIgT^X_;^sIt%DVwqRSpv2I~14_kg zU3Q?dhPgG0xlN5}qZh+TMTRB^1{nr!N2cH{59)NL<~#BPZ)ogR5}2aT&||{XW6CyP zm${XVVXYX$9AVZuLJX7g8CvyOTa5yFf?u@BGxMzjOGmtZ+YLn`@Y7T*Oas1~B&lNB^vWB#DWid3h#xOLs zMl+mCV&Dkm3+e7E-o)i~AMkvU{mR}o|5 z^EAdqJb|Ji3%0UI$~3NVn8MpQBk-K3l&XRthvK;au5*s(!p?;@9&~9u7~S|=DUd&8 z+g3*QbHRLXP)FFmN%5vM@U`hn(M1&Bnnl zx>d^UfmY)y{hgahx}EWD9va zA)kSTS&*HHk&{8jktO8gjvz*1b`fSlN5+u%jomtdBB6{E(i$&%H8!S8vYq!8Ij?u# z`n(fQhs+0|ALi#B)z60rH+DKT-l%ls3>Dwu#?ZLbhp};~D|2I~1R#x8G$#@XBq z=j9n1zZ3-uglg?cZ0sm#ycv9<>LMfig`x|!7nv^PUx?sfzFytVbD_qOE!28X0fRc@ zNo9t{dln3hQwkX_R0nc~I!{q!zsPY>u<@2qV@G9Udr{*}=8GbZJfZ$mv{*q^qZkV} zqa;I<9%GX}qXYvtqc}6OBS)z3o;U_6Mrj5X1`d8sCO*MVGe?fl;KoT_oQp!aJD3@J zlUbYe7`izanhaPc6a;dGR!^^HxvX}X@iNP0Q(S`gGWTT#N4C%zGZ-1v82A~*8Q2*`0{KE09t@Y|Vv>}(tbdv3 ze@Nq{a5>IPS(hpuSwc6?5MhC!D>z>zIaQOTHGt!_?T}*CE*0V0kV1 zn#DEuYkrMWJsRJrI&y?QoE^{1!XU}8DW73e2Acp|I}-!9BXj7Z<6LaK90HE4p|Aeb zFwP2Po|VPG&AfyqkSp}(8FSA6DgTRa8FSw9y5)V#hRKmFjOC0e!$S#%#@&&OJPf={ zx6}eT!}!nW-BN7a7xToK{2u>3fqSBk9AWm0 z#QE4*n3+(HkdI3I>T40ss&FoE-V ztRs6^*-|BjhcOHf^BLF~8dpa#v?MWP1#*Se-EwDoCjU&1m6iFK@H4(={El{EeakHw zI2hPjT4eZ}!k8FXn<80T89SPEE_g7Vjbu03k65`AD|Q3XBX4=PFrRqd0oy7?>ED8QX0*`a~F+ z*|zvHToGbFug$>5aKVQ0f-}e<2Zjsw;2DDpUTkN*nb;XQ8O{eWGccYHc4P@>-&4ZG z%-HG0-j(NQ8rIp^qrtG*o?!|L+azCxjo!@dN(`(F91N_CtPCs+t7I4&Eg4t1FwJsj z-N+4Us55XfUd>@_rffa3&UJ-t%#eBH@W$wM-49r|C z!fjFvEbPooZOW`|a*mqeNt+y58JI*FnHfQTVP;@w;$dKAVPWK8;^%HvW8z|AW#D2I zW?*ArVqjw6WdwD`1^6Wy+Km{Q88{e(8Ce*Z8QB=wScDn4Sj3q+JQzBR8HJgc9mT^# z8v9w98XcH-dNR+bU~keCTAst)$;+@=n`0*%<9bD=&TOW+cHEPkSUSyEo8p+{IogsK zdUM%U3o=cWW}Ohj+!n{zBpb*RerHeRJF&@Sjh6-4E{ds2UF5$g(Ade>*vab182)mv zV4!gLo4p*8e2t6c8W*#&igNRJ`g8_g$h}Z;p_21LmX>T|hf*Ma1jC+cm5Z{Cw-g#X zsxO){UF6}uUf))Bkwb<}*pW3tU@s5j&nm`Wn#_$GxfmLkI|d3wNFPjPzRY{6=6^xs zrF_=L10rvQFLPfO_@D4Umx=c>t0PN<&cR$zW0v8vY9LpH(T=!De3zx$4R85K%Q1iA z`^4$U5@CB>p0TTt;gbpTih@AS2=}i}&mFrmt_8AiUkhO4c4UnRoSn`f#Bj}l;hI0g zwWvVOi168&%-7PcrCv*GoEFkJE%sV=?W?^Pw5O;m7+Uoh+T|F|N3v{>U^t)5(3He*F^c7cIrC%|#;Jawz8>S2SjI*UP-((& znT6ppGect#!^J4Zi_u({+!)V#GM@KiKCRAhu8#RUJHzb|=BwqP@`r()@mvJM6@7-* z0G2j2#v4k^C({`&OEBCDW$BAzY%2qG1gsdZxHGg?IkHFGddLdO=d7(9%$-~e%$j|I zj{FgK8XKdSnfWKiG0t~pXpUu{=)^HGilI@4u~C+@Tc3MAALCMEp@{*E3ST|ncJy&tA{yZ1kdGV&n z9*swg`2&R_4{!2s?8|7p8!LQXfVFX+UgKL+)^jE2D$f-$pDSe*;1qOZi@ecW%E-eg z$i~9R!ocFl9(iq3086V0qaXt(qa1@WlaM206EllA zBL@p76ANfon1PLnfsu)snWwFQmCKPgifczH3o9#lAcc{ag-?WmvBQJ0(}AJWl|hAt z)sZ`j`zI%3t1?TAH~an=w*CH0vn7~%_?fzV89F!^dXfd25(2rS9Hw}4UW`&?c^T8V zTkxWb;6+zHN2VyBz4{ESf$~uSd*w7Fxf|y?G|mk-Q(RkSRqKSl}B!}=Xi^kKw zjkls2I}O<{>R*(5WA%pjqJQK5ym!u=znmPIq6+pJF#KW*KzsNH5s4;vKYTWM2a@meWo4v8IZj$c%Ku7kdC5=;@85)<0GO#jSmS?{-2%H(otAXn6}<9gx(*YdBG zNnVS;R`pn|GuM$R>SE&*H^!x$fkIJN&jj4EWM;bMBg!Q%#mvTk%m0?wEyu?7a#!+i z**bDWy*Lxga4VeQmJO)Q$iU0M&G^V5kSprb`_f~MomzKm?}4hq9c7Kv*&Vr}gIgIH z8aWsmBiLF+7?>GbjF>@#O|5>6Z3>Qp(Hx8PK?My1lR#?`TZ;uNGb=N5iz#!52YV|6 z6N6B@7gGR9!SQ)t(nOPefMHm|!g&8`-7!Ip3 z9@b`HX80|@@SB%`pOJxqkAa^_fZ>M`!w+)?e#VXzXoc93$aK(-VMj6pCj%b?GZQyw zI}gjUIHuMzhJ}R;hrJl~dowUI&R}4gRLam8!!RvIY>fqDvkc3;+Ca|ef+>OR2B#!W z$u_PLXq;Q#cvR(8__=IH{^+XZZcLpbj7>2Nm&_Ti7BF56Ww;o^aNd%cfw8HIftm5V z6T^8&rt=OA%^8l2(bcyi9GRnQ8k=}nn+16nc?5DsPu&#Ncqp%FVj*bYi?#7>fg^A9 zqCOVz&;b(zJA0c3BPSDR2!)A(osolq*^woB`Ho74c3$RoJ_cq-rs!3TP1QV$#R55_ z_fHAC=*E1}v+=TA<7H)LHf~4N=u?LT7}yyuJ2PCiW8h%C?9Oo6f#I?z0~5n#2ga@d z_Ve`&dsjIAmR%q*AHm>3w&l{2*lFq{iwI2X>;roq6<1PW$n zhVyoe=ffFp1h8FnWSr{5aLbOlQ-k4hJad;9V+$X{rAWp`PR1)149qO&&6zIfF|x2X zi7|46+e7T2fvfW-j0{X{3@i-iJsHk>I5NiMzGQafiIHjS&SG58%-CzkG}lJ8Uznkt zouko|tIb?;a~jW*QsJo~3@zn>Vli_XCq*^xPi$`LZ0^=#=4D`#Z1rMe=4;bqWM*P#;$UWBWM$!GWM<}KX)9o0W@BPv zV*)kp`54(5dD)m4IhYt2IUO})wr)yb5aVw(U;wrB`9V!N23AHH26hHnRuKk4Q1$>9 zp<+C3d5la<46FMm6Nq`YF%*X1;7qhFe zNt>-pf?;MPUpo);S`PjR&dgJ^Ss7Rtaj`Yo2rqGF=~80qQWow>4&;s1+w0x9fUj|Z zWTy#__~p>cUUIrBth|n_vFM-*% zbm=j4`GR^T3>-}C%v>y8Hq0yxf{aX{^v%>2&CnGB8ZvU^h_!3%(PW>($T)?8w=mUU z+s=Rn!$7?~NfSS~9wHaal0GB8{)VQ7+K zIIGVvRe@=~I|Ha|02+qYVVYpV_{NI4vALXSA`|1eGUi?C49h|pE|;;GF`hSPz7)WC z-jngX2h(YGrgL=+=UEw;8O}2?oabaX&&6<_n}LO~)rOIY;amkX1H-v`rmK0NGR2aS znYEpR;i3)WMMuzhI!n74!zne!Q|b(tGZ-&tGF(n!xSY#!Pli=OZLgo*X2SL5Q;dlL5~SzA*bS>lRXc^R6b z7@Fi5nH`zpvX}dEPS9~=i%Yv^!PJ?_Fv)x+st#IUvYwr|bVqjrqZ*gN{W@KV+wE`t!Bhbh%dpi#UGdq)`NLD=&xa7U}11%jcaaf;$WI6#65|RjX`;aZ6J5t zks0>)B$$}4%QClf-&0||>2j_xP$cfcU%m&1T(?qhrLfo_01A4hYt?M+91K^C8T+IdTD+OMn3yN=GSo0O#xYz9U_7hN zaNdit(~RLfBjchRhAq|1Efq{Fav0X8GdIOBFf(2XV7Oq)cqxMMyf4RPD~5B0%&le& z=js^Sav09rGoH6%JfY8U(Td@sHN!Plu1hgo zmu9#w#x%Kv>7Fpdl?sL{wT!KqjBk?|m>KRSGdz=F=!s))+*Zrj7{`3khv|$o0~6y} z83xcQIR<9NCUwwwfGI<>7y~Oqvp92m0>ily#&e|%r`bR~XNKl1rsh({^Ue&cpxT*< zfs65cIOBOQ1_6fCqKv0`7|w?>p7VLUC&$i#4(&ygoS=2sM3e;ywbM{_0nbOVJM z+)OPYoPG5i9Xy;Izci~9_etMY`}15ZCu2`Woag6Y zJy+t$mLR#Qj)8~aTrR_T28NS~3@5z;1rikc6kB!ARW#18Xq;txp8KT9x#U*8R((#6 za|Plu=eZr(6HL3^d0SnWnAtd)+T>Umm^mFq6O1<1gN9s~TJ;zi*n}9`q8Qqu8Ce)a zK}ny9iH(zilUa(f&4-~ama#2@p)Hj`z>y`vu(2tTvp?!hHYA{{2Uk7)?lV7-ho018}`NsoU(2FBGC9-kfW{Sl+8u;TXvoL7nNDKFDgi} zbm|21CLG?I)hTr=nuqP8RHsa*_(kViQJtclVx9VqObHifxH7k82J$6bZ|pH`eCK^p z>7w*Sg^Pw4H5z+#8t?kIWwBq5`%v>s(~&jd*;G!3#?vJX!VFzf46QDKLJ1#c__1B~ zI}_hlemUxL=-s+5%`@rk%q*9ae)|0M<+_~OmKVsE$b86!L-LGw;|`0)9lmX)m%U`( zR5b2PZ0BstI8);&k|;DIoJo|Wt%!kxp`Deft&X{^p1ECwhnb0ujhmsZf~BpVsjZ5k zou8>)fT0~+O0o46IEp3;AF^lQWn^I#U}4~zQo+#W$tcLs6~fr%51IpIW@hOsVChO_ z=yGH3iezBpU}EWtW8`sUOO*Uu#<41ocV#}$>>8HIth`fM1Gy3-=0`N{cWT`4eyiYh zR^x%%D;2lm8=q!1b`?5uB&IYr6*IhcW$2V(xM#>PIh*k%6T?+rhAUNpT#0#$+#7cm zH15p2QpCp2bt|(qtTok!s6D<^}aKw{;^0ESLx zR(7UN7FG^MUWU#ZhR#G5b_PzS&M217c*f2M#?D|+?dr&$So`0Wxvhwmg}2X?sZX4N znQ2;7ph)8KMgGsz9;x35xhKkWkK-Qm-8ydO8}2s}I(<5fUPU*a<9Z$aFy&#kBYWbW zTZxRXq8T3PFzn%A*dxerH=p5|R3K;K(QB?uce7h8TZ~%FTWs!TJkodMOg!J%W5qD3 zn2DX~q#>gq<1!WIwW17dc?@lpfn14?{<}7=&VHo9{7m_o3|l(`CzB&{;)i=G46F># zJOgfGu*0VxK+j2$;WU{5LA1&STQu0F*KJm9^quZ zR>IW6!Emk~JSfp>;>ei9{>s>qIZ3Cn$A+uLm2s+JAZL=>PQ~-~?K*9Bmy>=LHgy;@ zb(%M_IC3Qgwz)DevoD^@w@#KXjLF5QtkY4c`j27ZQfp$zAu82K2^b2FZ2VmMa_svD9R&Q%8r zB^_*>8rU>Bzwus16jc(qTy{n9T+F#*M~Zi-GaLdXlU{EvIaesi#BrYEJpa{z^Y(4r=Ti92)t{?k=VLlA$;Q>j zcOv6Fx5&8^NA_g)J`096F@`o(b_o_)!8Rv0aYwFX?yUt3JPd-Mo;X8W1WTK@a9aYC zD1)3MQ?f*3yQAo2&p^Ip!!N0C3p;Xo8#_H3J7d3*d!%iCp zNrv;j4CieEd6L~GdY=#BIiGmmj`_Skvn&_O`5;I3}J?44q+tBFP74#5TSZX`ITbEY-zvkM{}(%N60vISR~IxGzUt zPUmaf!PK~e^9nat<#QfClm z;B;h7{?XVh#55_6VV*A|6URJ{K&}*{#_q_*_V5d$7xb=cUzhl1@y+&I(4169))d=0 ziVU1W?Hmlf*^Iq$j?5_zCm0yG86_RrQtZ#_adR`uGl($qFtG-5r9{k+xvlX<;fue7 zq{wal+agot9a&P+=O;6^W-+&BGPY(ovZth;HDZuw>=a?@sAXVg>_}o{aAZs={1P3= zl~Qt6mV;B{wq|QtYbi(LIj+y*j=U-D^P?HsSlB^17_#W|*hWIM0AVn2C?6Q_ztqrMIz7nYqa> zkSk^Nq6{W>=EkEXjmMbp$=p+wYdo&v$e6P2OG+ST%HC_ik7U^!&#^R~ljM1%@kpQ7 zku&A^QhTNr1BMn`MjnP1E#?+YMh4~<4aOErNA{GH*MeA?8JIzsQHYV%ktyZ!KW5Ge zCV_k@50*zYZmVhBR{BhY=|WWFw%W#iu@&W<*B!3gKa*u~8C*-?U@_bXms4Fb)bO= zMuw{u%*-q&m>D@4FRCzHlw@FL;Aa5sc;IBZmBnzYn4ztJ^>PgZ3&Ry=hRbCPY>e!T zXW5yqTQOa5Ww*PYQW&l8hH->2jE8h$*=}BgejH%s?lj8zK(wMrd&&6=^oJ;39=fio<^IXWe z)N?845}D2=F$_CV?Ui)NW;BV`67wa%4@j+$PAt z&eN91#LC9v$d=~P*lfZ)!JKJ=72_f%*8W)LX^DXXX_5N`FA84dVY(>FaXhbayIbQr zQ?|Dijr(~ovR!0tydBYaJJyjaE$dJ{!xJ%vC(4Xh*csRu*cq;HFt9K*Hk2?lUS$pB zOe>pF#c@xgOZN)%t_w;OYN5Mx^kBQx7V1BR9whBMX7jbRKd44h0&28tUpd4NaRY#7)WKw}<$4BQMXtmoYs&)a|!7Z>As3s7Gyl;OM|s8Z!;5aMiAVmxQY za4wOVg+Yly5tQc61u~p-VK^7fbS?wb$Z%#j7r}5Ym4TJCppnPHDMQ->UD zI|FO07ssyINMzrJDJ%RMKSfdv1|xrIpN8;Ax~hI6K}hbOjkC; zL=P5b<^@GejU2*_9)aBH-94=53YY~Ow}>@0#h!~2Kj(NZ={&0=SNilGUWRjF3<3=2 zq8X(b*ci{HF*NoSF)!9(pBNj+m%eVB$$4vu##eHUv$;jj3!djXFMXcxTDf1JSk!Mg~SnM~?J=ja{Ljim5%5 zp+lUZ)0Sa=7)Q4@(_-&H&J3xY-i>`ejeWL!jmy0nmlv9xuWfuB;K-Gsx-*4=n~?!D zuP4HA-i(ofL5M+^kvot(!(?YPZ)2-Le@x?(Y_{_`n&N( zBO8MZgQFu$M(A$=hN+co%bD2w7y^Yds`r`6DoI{6yr^~2Ttl?+ZC>NsOy&zYjq@BD z=W%ig@;I_*Or9FTAi>1X$_MIDGpIUpW%Tb;WsqgCV^CxkU}0v^XEtI|XV7qD%$V_2 zD^M_FSz}{L;|+143spk$Y!_KCR9qAmV81AKBlD5pZT80f0**`>JAa8VPxTAr$vE8D z9MgEazVWESD|IdLEAovu)f#UaUtzhzdPOOaGvmTxIf*Nlm(zl-1YY5~!p`i-mvL*R z1moohrpx6FoD5ea7_YE0T&`d=VYp(+a7B$lg29)8gMl|tAmiOko-0ya3SF+3i?1;0 zU9rEy#;$NhUR3J}7jvLkCPQO$JadahqkUtG;pOrxE{05vlbISPWivZoj%B)>#>01o z^KyxpiX&sD!5lkB?o9E+D!gJWp)6emOsovr3>*ynj4BMy3_Ol(nG(O17&cTfY;nvJbWj;xtpa~v41=P|G{S~EBWYG($X zuwlAhD%iMJ=x6X0HYMfj!E)CVuBUTeSG#W6crM_(=ylb`2P%yn$(oOA8h2}6k5IgB zdEMiBe4G6}oi5`pwwp?GqrUlGFT9>{z3_U{b^q&D7LHt*4gc&I8xPkr+>B#vY>Q%O ze4x+VxF?F~RyYGIqZWf)T$gxA`3zGk2a13gpV%J-__6 zga{|oBe}-Ck+&mm+uxRPWXwEvHZhPh^W<4OjobDDthYHdZksnQ&v0bPyga{Hq>YV5 zgq7WqH}lHbKo%j6jwnV>22KVw26kp124zMbCUFKKMm0y4%&UKF7#28jP2y#r$rC7% z`R$Utto-8;-$%(z_pI+Ja0}n#>D?+PX|8*gjR#F831297WXj^dB*%Eq zJdi(2cv0;=6=^$nvwN)bAAp0qk?eNUDBp4>fAN2V<0MWuqRZjNkOs+VLLSQyk9 zI(;|=895zUvoss0YB6pNWSAPjFi(=Tu{@9~%VMb?2j?Rnkw=-290WQ&J3SmZvz!|z zCo(kNk!EPzW5#eZnBh@80}I0=8OBHI42|>E0(rCiuhlRM?n&w{-Vo2jyiuodiXiJF z5B5O*tk`S$Dvtsmc|8hcZoD1zll!&T>wG3ACEiDYj?7tg%X1j{nVB3pvvRK$FiNpW zb9AUM$}@^E@-T`sayznS6*l%HF)_2Q%Vb}d#XcoEkSD9>Hix#zE{nzm(a$uvB%kR& zGZ25qA1IJDv#}@jvAy&&#l{^17xUSl2|p8grpoe6M^a{`)k;@KwyZTPW7(Kl*qE5v zm>Ad{S+myOvtwgs5oBOv0`XQi_N22e&}8TlWLjgvv7SGWGwbL*6E?O}1#{&mdF_g3 z7jR_FI{y$fc)-p0Mw6lOuw5Wm){UQ98zkT8w%LBld1Lyj5GTayNFqXh#i2Lo%P3~LT+BNty67gK8*a~o&_4>KbZW2Xv3 zrz&Ho0#j!WXk3?xnXwCGC9|V=*7Ju_46PiD%nU8%EGeDYm!ufaX)-kDGBu|$ zgIdZ=jPsRP=eROAnJ_o{FgNlrF)(cjVA#wlwwWi8E8F#iGxPPr>tz?YZ#yvEcD?Oz z)z;B7J76&jN2?xFiyBjN8e_W)!}&ml#wdm+9foEPmM%M{YfLP=99bqQF?8@ToZx0` z;b6M%1!`@ci(qU`V>qwLa9)G)ye8u{CWiCT49tu-*_hZFnVC9sK#gQmhAVmuSBx31 z7%_Iqahzu5>ttN zmNA@nVLZynFx!D)Z6xDE8;0}h4CmDt=PEKBk!QLcz}T9@*cQXU44x3+U|?rED9>=k zh@(r+Q8+vBk_uC&2dELw(q6~ZmciKSCpw2)8?@D$k(q&oq0@!6y^g8JLTrjL12aQk z62oK%NAB#Pe|apE8O2xnu=E(Sb|6BybEOKPa;k?bm*p|W2>c`M+!#Bl6WL91vXO8g#<}J2O9YT#; zIU846H2%tOe3dpkq;V^&BVUeP8)&GWnW43Sx7nVBfsvb$fsu<*kfGUwso9pTIf#+l zkvGSFy)H8|Q==9$8w)cND=^vcP8Itb;g-Wfm}Jc z8?71_$TcodKkt0r?!57Nr}K_YZ8A-5(vB=S6&np08kbrzG=3>%I3E$nom1Nx&C+<9 z?>p-iT^-@`I_F(w&YL)L=Ja%iGl(!rGjcErFp4sYFz7RKICAE6ZBAlniDi;vkY;W% zU~ExkVP|AxXz_An%9;O>lWDS1Aa~BH#-9A9MozhNM(5lcZ?iS_NS^0!d=$|5$oE`{ zBYV!a&A|+84CjIwn835Y?hLYloH_e@%+AG~%RcAFbS{$PoS#G>f6mFif|lII7g>!j zCC{@pP77$9=B=qEe=hZ$&$&P)@j&jJo124L%dTj%opa%6>`iLCW5_Qn>d2V$v`00N zH|P20uyfhx#TuvCHBPH$mXbWD-7V6sdM@Bxr6W_$*S>n@lVO1(IsY3cCpYerWocYv z(6~ld{I|eHgT^(QEKIuREjg~STunc(#iuCf$eb(QSINx5#OuhOE3qw-L6CuoiG@*` zL5q>akug_nmq?&wuF6;E#$Ug^Byc{xYUT*tl=@ir3%4lW)Bc_twSSw;ayCP%(p`)%F~N{qasZ62%w3|tJH z4AKlNECLJyEXtt9mLprPUt?DU$3k!Bz5s?cE|HdKhB>x@s<|bTL@%&7o)2XfJ8$M7 zDZwi%)40^BacQ6c>-pmILFbE^`MA#KftV+>8&8)tHp?4xpAQ#PZ+xQHIK`O5ku`VK zG(Ki^2396vCN)Qv+|~Qs7}(fY8JHcJbC)#slrgNU=3ZA7$d$W&pYKKa#>*9rO_pL8 zYcIy|U*x`!;mDYKXkTI=SMHH%ypkf?7mbtzFS_$y%n9VpJ-;uB>0&6~MK^r~Nwtg4 zhFTZZ0y%TCqKVbT{EIFZxdR1qUrgh^PSB`sMbW>; z$x6(d0vS6hSy@;*Vpx~)F);*+<;fp*x}wW@CGScq8@IrfDB;FQHob+7EyY)4d9T=A zNxV|VeSN1uWb)g*RL_L;Om4QNe)8@qAP`hD#L#DAsudyZldaURT9#Iy(8@4w*1aD~G z5V&6J$dtEgPBH^;pl05>6D2p?Z^#Hsh}{rxJZI2&F8qervxsMz*DD(zI5a+Ry>ByRQv#}wQVTKmNOhv{i0xYdufiiht7I55lbGRLSTTbpx z$y;G7&O5w9PqLl_%ip$pll8{|*LWij`?hVtF?#6mP|%R|p1mV`{)9{3jK&N~49pA?47v>WTmz-@=Qg%j z-m<(E(74xJ^f902qtr)LkMg-66}88-2XpZ&%ZM;NmVYeuSdgo6O-bXL+Cbj?9oID; zGd?Ogpm)HN<8|0;=f{lf+$@g@0=e>!T{7(SU{R11Z7*nd)|7G-&cC{Xfk~2yjg^au zn}v%Jv_OH4ftP`YL7JmEi5%D~=| z!obA94O-^K1)8j32UW(5d@QX|jBM;IY@7_ttn6$|j^YJ5jh%&z(;XNlGO}(LXFTk{ zxI~_%t&Cwp6=OFS`&389o>=DTegaK0OxqP1dpQ_Z7%)sM6`UN+xGI35tC*oXm}xQ# z^E%-`?t)X3WG^r@PAO`flFD&GxbdLKM`bR4AxD;i8dMro&$uy&r6o6zr_ggwR^$1i@AfxzZO=7RJoUxgmE${Dzh^4=3jhMIKgmKJgoR z4>=ll8alES=FRlu>(yXmVr6D$0yU-z3r?~z3bHaVb=k0Rf@)YMW(GFU(j`_l25v{5 z!ouGUj4ON?SC=yMs4&b5X4)^ocsQQ1rG#^v7V{QM#$E-cjX8k=h0_{a;@{LZHkUQt zFMpE9F2>7rpZQ)1-(S1s#a9Da9c2nvELLP@Wno}%Rbk=fWMg0lWi>_yCMISUCI+S! zDFz-E@XlfuF3>0;D+hD44=Xc!lLH$AQt;qprn+%#H$uYyZfyO=Mu25WzITT5L@+_mUFc{(R1r5ey48IoAqt zYzStVl*Om?Fn8*Nd^=0W?OvJcIF!Hp3BjhF&YCcNq*h!&! zbHT8=fSLKci6d80dXFa~18b`QXqgd9n;dg{8dF;lLt8OZTb?6NQP$=vP^W^0k(G&o zsjUJu{L0#?#K6MZS;N5W$Xt~6*IK%tk7ZtQAYW1U5#}y2X0|^$e+ro|2HvhZ=W)*W zcIEAoP9{gKqS=d;+4>V$n*CVL$unMNVz_9^aM6Ub#e|8Ik(uFSIm5{shVzyTpkn~c z8P3}`bji%q$GN zj2xhiF0KscJs4Qo+o~AY9odU!T}o%0s|T7RVQwj4Xft4FWpQLJn%~%G#oNitGNo2( zf||&L^g!OCZ@Ww{NHVit5aYO@%5*`ZQ>W9Er?Jz?k+oQOnk*AD6R2QfcH}E&-_Hi> z!7y}|F^DjAaWZlEKHqR z%%J?p3|cT>?AX|w!`7Y3HYqrev$$XdU*kHV#&yEaRE{JyE_Z(E^wPb_B~ZAyYPDFC z(0e`R=8&eS&%9sFn3)<6D?ji#sotJ(G3G=5MWf5?O|$bHnTn@%=5w^VIC2#CZQx^W zW?|xFWMFNnVq#_BWMFY*DeiCVP371e&pb-dd;B)!J(Oe>}TdNxk=YMdJSx8`r9i0}pFlRA#f#cwBRGcYkU-gXO= zF8=&e`-{9dYh#Z{V~^;^fRC9nL`$`!r7yp&iD`{L@S9v)cSxd~nCNlUj%+p|Kyw11K}1C82X_nK>AE9ob5JPpUDnGjTI8GYT;Y zIx?5|G)~oFTUgGtpfZrNB(|~Dt??p1bK?cKc|nam&bMos8xLy)3Y4UuGdNe(xKyyU zuyI|%Y=*{@g?AVp<+i2Wu3}<;Tk*F1ZJr}bN!?;iMg}HUc4kN3lFCapOw0`IjGZcs zotn%{4D1Z-3_R=;q8QtaK^ux4SxTzD2C~mL;anunu(2$VyJY%p)mOodvvYR%@2P5B zpxAgr3?9BemfYp(;WWx$Uo;EJVCReT|7nUXg zN5PV{x3w5q7+D#(nc9*VSQtQizakmCTo}5nnOGS?=fANrw0beJvNAiem2CN`%CeP% zr&)w?0VDH#edb2?K<<*ujlETk2P?m*ebN4+!_M?c`4}eH9i>WH78nX|)@Pi^!PqCnG+&l!z6{5VVg_c0t~mZyao$!L z&@3qfD@&Uk3mXG7sCZ#%FJT8QR%U6-XYJKtWMJ#@a8xUKvz?ETfoGNiW0wf1)MV%q zU<2(rXX?~oZnt4>i(+7Acp1p>UW%c^hIL0i^IThwDfP^K3=FdrIG4&YFf+H*$n;b( zGcb3`Ffg-saWFBncZo4FGk5VZbP6$csxi0QFh0;{V0M%&`S3rDp;4Tnk&RV@N0+19 zfU8@KrCVHdLNdc_71p`-Y}1vPCrLB+)-W+MPiJK8j$oX^%+6HMaR)sk~BgrSeL_ zm3pSD435mD&yJ`wu(NjQ1d5ivKWT6ykcF9p`9>5gKO6In&>In)e8M;Ud6^n7)cw$R zmdp1)41D z0!>h}Gq5vtihve}gU)is5B6!^UM>An=h8F7aD z1{@PY7~A5QyFjaM+RPXl52P~Oieose&fJ&4a9@I{vxf1SD8q{Y#y$~-E;WY6UHVMj z8KBb~&U-PO_XZCkUJGNmV8{-(f#G60>+L*-+qn#FB@Fi^m@f%}g0+mHRe|BL9>Zf} z##bo}&zv0@%Zk5dJMxvK{ncV|JzjBKp!Obl!cte^=lR$fMC79j?1#!e;1PD$2IE=FcY)^eU-NrF?$Si5r> zyK`8&BLjKLjrSWcb6hNBXS*12G4f)@#lnkO7xNw2%l&7TaJN}8@G){TwfQl$IWq7& za+kXtF=Sw3VPIlqU}5f(VdP){4U2Oya5^%VJ2bW?Fii*&ncyGDU7k8un*T=HjmR4z zH{!XuZX|W)F*!1p7k$bORz_AP7QR*~78b@9B_>eMjLDI|yyLO}12bsJH}ftV#*O@pOpKu51N9(T znHkvHZJ2l+8Ovuh_VERBmalJYO>NvQ{>+2(nfo&@ZZ>8|w({F;=?oK9SSPA7v`I0x z`Y?BgIkJ`SU0KD*z~1D--R#8NC|JJpPcg$DLFRj2%=i2mHu5m64rVx9z&cfd z;ff{$3sbWj==_I9FZL@n42|=28N1Y2-(>`HmcKb-d6ly*U~1hnmma>Bg2r9OjeqML z*~1+zh#yc)@{wX(1&~6aW*+Q&L9E|*&T|A6@jN*)9j@%WNjqPDf zeU%J-i7aiP#yr#NAm&wptg8YT=P@(%gbJ<-3*@TEIO4+0euud&?+#f zQS~>IZ2>dega{U9#rb-Sd@QpB8JBP{ERhZ5uQ=Y=n)_6n<-RrheFJt5_WR2BRgN*t z*L$jeU*D0r;?^=A9wt!Rx8nBod`4adHWmg(c4p9;BIb(gjjcrty}sNlq5`=p-YnyN z?6FIxai)Fa9KC65r*nCqIX6yHa%8HsYRh8o28HDJ74l3BY%Dy@CR|MpJWU+Tpv_mz z0$mA=pss?WO2yCHUd;Rqd<>jS?2LR2>`GK63F5C5)&&RVc zGoKG(Vh$9q^xsu>!SR9{Gc)G}dp4HFT>?ERjmOF_=rLWeWM*Z)8S$&&S2^d!N=LTJ zjA_m+3_QIaEDWG%GI8XtOy6(M%*N8i1FEPQm|42?nAjPZSeRKm>m1oC3mcmQVPfA#Fl%*<^3pL||Aa{w`e>Ix{}hk+wz%Tn-BBLOh=Z=eQntcZBn30-;u3y<7x%QmKc_17p4U& zj7JRF*QPnLS8jM1z}Qm2*e1i+T*Sc4v!IM|MqVIi<%ynT=BECbrY_OOmtl>wSXo#b zcV{>XSKgSE!p6=FF6kIp8Ce9|omkrPK(iQ342-O7ZF#J$jLe`-Lkz5rQk7S?8!)i2 zwo8Gcfsvb&1$25aXQu!os1X6$(7T11d5ruQax? z^UjLqYe{F~7F=Hz$XTV;IN7+XKJ`0h%yU)nixR+%q$XS{F5aI}h{ zaj7u_C#W^Oor9rqyC4HoAXk<1r<|?1$4eSl+duYVUQ@PT^`bPhqgYk=3N?;qGma)Z zMrMu^*$kIF7|!T3Uh!i%R}ESjTLYR0J0Ht%K7!$VBvYFi!vzNhRt7GH3!V%YY#7)a zxvN5M2ZIi~Vq^l<&`fP!tn(Q-rbO~hiC~?{<;Yl7)Hu~Pkh`jXzZX;E1hK|Ps*S(= z8dtbq;%qBmX1=QA$W}G)WDYYk12ao!8N(e*2IfHSs&$LKm>Z`itf}oZWMb~rVr64@ z)UMjKOq8WXiM@k?sac2NoGR->A+~lkh6|poojDB5Of4P^SLGP4Dl=S_W9c$uyyVJo z$BN;OHQRIxrW5H5opB83su)iiGcvPWXJKGsxZuxtApo@DgPDPWoq?0#f;+>7Fa~~> zP9BC!f((}w7%pitUXozAB+SU`C|I@ooh8#!PtJWoTpc283q=__6c{=bS^AS$x^)>N z8JgpHrew1%iR08NMknesg5$5(yNncKV&0_g<0f zs_s=8rmN~#<*o`}mAEQ-NA~K7BT*b(R*axSL^v3D znb;heszcwo^X#_^I5D+_Ar7#Ju0bk-vJ%f?x)2Miy2Erq()!Hg0av z(Qiyl%&o=jZMFV0P)6V5HaxpM5ax?I=OR#q&F)^{SFbXnqv2b#O z+{VJ%X$Bg0u3q%cn_<2H*Sa|7Nr6I>6gbyuGt3tZ6s^8-gXeMXkK=^dW$rt+ zs6LJoeeC-<=&|o(7mmllkHc8LyE!sff4UvTz{9{A$Xoq=h4!_MAr8Tt>%tQHO1}aQQf+ZWizL!q_-5mVucmfdRB5<4XW&-%uDsBRfMQ8^bqM zhQ|I9hQ|IAq#>O^w zh6{-d7otGZ^bFr3n7$=5oaAS`B*$<`mH|X6GhC8m?JQ%ss>pa%iGiJ=vzYO;Hbdh| zIflk$hD-9yH+&eoIT&tAGTvloxXHk9lMzBPx0x{9@c<1HGchwgG-JBq&$umtVOt`@ zwit%SX_5^0Z5Wstj;XNh$!9n!#c))biGlIHHACY%FUH1op$r`0vWb(Cg}JdOfuXTe zpW(3+V|N%MGh<7MBU?>LW3LQblY#<+G!s`>o#qVPK+c+v&lQ_;Cl>T`_H%SeH*z!{ z@os9ab7ZOc-C51h)R@H3xR#&cTz#N&EknQm`IPh7=Tpwda&oYqk2{~-X2pD==tA;^ zAg&9U7b3V=FQhVEh`Eq^A>%?QI~)6j0A`*G*_<4Xe6`xMgqhl^8F(1jL1)!4aI$iO zR>(4PFo-hnF$z2K)@tl8V&G>2oh#152s&9*fKif}hnby`jfusPu~zkOTp(Ai@Bi4Z z(ZW~tuUfGS3S2e4s^ln88$H*VsV$R@sBHcqqJmM`qcR{L{t3d4OJhWqY}jaTg$RtB@2(GC=>WB=ycxFDQ^|8b45m>}2V zLjK1|TtfUDl8&r((#w=V=f$uvv$yCta@0xPkY!|L;b#zH+F?^&_jvy5leoX_%}C9^y$c+UB(AX_UlAh&1OL&(1oaI?P|FgPh z+0RlO+3SK<39>OTuro6=F>y8-Ffup_*7@A7WNs5;;9_K90(D!tnK_w21s^*DEAxB@ zhFR>av-B8dS%QZD>Y^K`h;a6@vh~;m3f2`pOnj66CXJt&jrC3Pn~avU_wLN^JvNkW zC}n={>BwH!_OyVRlYxcdV5I>oz;AMmTukgt z-&h^l>do3K8T(Bbu8J_6^JQxHV_WRu$W-rqLyfWBz>%|Ve&a-ImR?78@RS%k13!Zr zg8@Szf4%#ArpC_r#-&=@IGJB1f2vt%F)#9Cb#qwbW;d3`U&^hKj_mdEldAZp3Nf|? zF}C?L^;m(<{bO+ys*l+2%+wylzzyp1fe%3G6k?xZ0cuyWcJVNEgfVyeFtvjg+cGnE zdpR=I7dAGqvo%Qua@V)6)_;@NRq?U&MK@!0gCbKXJPYXw7dY2SX<>OQ!%^XBAVI9jI`0WUimw*dEQiQJb47P@;a#WoM=r zI*rG(?^|?wJz@Olb}!^!(yFfm@TX1k-naMhH#EsT+YvCW6^P7nh#!<|spr$$T+ES(Na_gxu4W9e_% z7+#h#Ff+W@U}%Y9e#_6m%y3$n>2V0-4qJw{SO(BOO&`XMsSM{5SUNKpTBR8o7|z== zo;P7QZ^_64o**y;Z4NhMIB(0`n!v!yaITE;Ts1QXXd5!)xiSV$hI5&WybP_8jID7D z=L(pZ8PCeD=jh>ga_xbAc zb@Bq|3pviGolj(Slx}#~pUA|%nsYX0^GuUwUdYYZ zufnum0hIh08JHGZGR+p{@6uwQPzRdeU0KS-#@byM$lK_3r2eWU*Hx3N_E*hLNcJjU zHM^=S$lUlM#F4u(`jkBATm?o!1_=g1MqY-Sf(%>?HzgSP1GyTr=Y}@E)0-9Ccsco| z%1vG7n@TsO+kzc=8!P4pvb6;;a58eRvNJNUuyVBKF*36cYT({^{f!I-{%ZV;~7rYXL&5oDxXyxcWGQ_ z{4C9pwejpK2}TBvCL_isCYB}}N5;l8cQ_o`8!y}!VQDo0H4WkznHign7@Fb&IU66X zV>`p#)T_|c?D#?MglNCXv#iDy{Ei}xZzhW}FtbjRX6UzLU8Kd(mBFwll(930vB!q7 z-Gr&vkFm`IB-rA?(9FbmM46#8hN;Jfu}_1sSH+RD@!e5&=4EL-2dx>~ZI~uYvF&tW zJ#5ZAPl=%;&XKwCePe4N+tftGY59SiO;Z088{g|Mak*c1DR^V{4VSir^ZAbKO{%-? z85$=_F*ZI-XK37^#niY%o1yVa24iE3Y9MEm(E$l|rc2&T%$FQ4*xIHZBHc z##R%CRYDA_gc(>FR*A9B*JfzqVQ36+WNNZ&>}C>e*9hcoDmft8nbkO1sPRB}vq$3| znYQ|E=KnI8E(l%_V0C0^>h59#B?GqBEJyC9){O})Y|Nlp8)gR39;faK=C)|?bOK{j zdt;MPplH+Fo~m;-=gQ9|NO7I3Jy&wBw()jCV^1{~)7PqR;^z{%&y}3ZWZ@0uYuemX zd7g<^;#?^w_qmcowuj8ll?yfXF*WWtc4TQfw8b9OJzeL-+L{x{-E_XOD`lH|<93os!d$Y#<))xdWaIf=%NC^YdBfYtI)5Nwcvuc5$pNY1|>N#@jfhtk1l$EwOQaS>yb|^NHO29GoiW zz1qXB+d48gbN@ACXzb=?XiX2~Y!=%cd?C1ThusVQ=QYnWIbZNR&vayJR@fcNC>qGs ztg<^qo=xXM`h^hT3#k_wtQ{Gf^>>E{@-`bz*5STjaKW6J<3hxRY@QQ!v-~F2|21%A zZ?@m<&Tzq!;erL|I6zy53u+8{fqc#GyCeB7)Uscw;S}b+;Lmx%>4NWtsteVQOwHxf znHfYKxtqgwyUBDKFfcK2FsLzGGKnzoFmN%dGx9jHHitL%#d7WQXIPQJ)Gy63mnTrF zx%GW;<3{OAN!*uGSue$L%3kun6ef6Isc~a0(&KN=u+#FykmFA`BJtc zWAlRPOo80Zi>6gwa^O(lx|DcHLyYTEa^pq=N0#Pw2P_%*8CW1yp&E3vEo+E>$zocTop1)8596=%Kbe@(#H;$_0i#B019oP1YPu9jX+ zQgmc({xQpdMT%9PL5+#Yk)!$NQ6UB=1|bG-#vle;MotzPN5&S`#=iJKo)*rdI#*M9 z`NS2jhN!9;J3ZBNGT8741Rg9g*OpR^gfnqJ% zr;=~w-}3rw^4VJZruEGTHN%_EH}i}ia6V9z*SeW6*tnDJellMmZ;R8ZKtTiDo6a|r z8rw=5ALKSJVLGMFXKoZI)e>+jJ<;KY#|^^^UKdU87dEc)IAza#)3kAa&NE{s8HJnG zjptJu&!;v%ENJWqzo~oE$m?c)pg>FZ+(agxn`P46r^F_u+*M`1=?p5DZ${~BIC8Yq zp0Z_d0}ZllEn#fDAIsSIo{h0_sxM<>M?j!NOYbRDFaJxvcWU+tH0d2kJ(sjr?~kL^ zo!UDwLU(fS#N0`~<78#8a^B^9ejrcF^7EDgtdiWU*KMxbs)*>`iFIUZ*>c{HQ7w?W zWyeD9J084pcfuRjRjko#yzMM-$BWmIrRB&%R))(O43~8o?i2*_w47YXB*T9vOgeBNQReIf&8rwH{4h* z7&LD2e(sF^^t${au-dMcx)#KG|cWbwOBHK90ZJl@^cWdm8 zs3+!)w@SXbt8=mOs>GPh(-eTr*Ipb#mhrug2@) z&$8s+OTA|mmVQ>s`CLp|$65%qyNaWA*@{#~R)(emhGx(eVNG=$OrXuBt;_F-II_2H zysyS6%D~OQ#URAM#=soN+q(C@oRqlWLXU;+%v>DOJRGmM9a&q?u99VBWnf`xGGJ$Q zC{v-Ny1n4brf`ZnsPyO?HfHBN>|b8CaQEn3_OSS)jvLSs1w)Cn+&Z2xXit!#X37 zK~Q9CAVWtTL#G_bRHk+fhSmaxsR@kT8G^!&jBQ1YeffdhZ4-7^C^jzRYy4Jwk%wEB zLx_{zk+p5kWOFuV26h$((40Wq+}-62vP=RDvP@!(EDW-aOl=FkbMW+51@g45pDuJM z;ZkbjLz%`tQgIVHI{iU=^soa-}E+sp%wVj?Wz;G## z`E)VEH5Nv3hO6a)Ty57*<#t(1UM;;^bG7nn9qZL{en+;pC$s!G*ty%>7(s_?GCT6M zJv!>jz{14J2s(@jJSD`@Wd}N?nt_Xvla0rbvF&|hUtu73JIkp|iJP^&%(obB7T=6v z5#n@YY!{we;K9;AK!`)L~*{_292ze0tK;ePxOP@|&4oAlJ+QtUgK+g8Y8yPQyTN$1taemDESjsKq$kN`s z%tZinUjvgPZ+riZWF{5{W(Fxp{$dniP-jqLU}xoIkaT2j?`~{QV(3qo==2YiYhU?4 z=UDD@(dSa^JY3?-wU)C!_k3<8F2>Cx|6H2+xtx@)+H=>&bsERYnK`7NOFMG4pIDL4 z@LZ08hvB&{!*eCZVp;Q&R*r!+P`Lftf1&-FtSk!^7TWU(wdS`5ypq2hG0j4P zmz|qg&5^bJ%_&V-|@ko$?8*~r{12fYcHsc2ZOc1ZlI3KZ>-U(5Zm>|-@E^T)cT0M?ayD~+2%o5GrWn_T8w&DC_Z`x5yjg2_>{ z!)%=f69c0a%b9$J`%!GOHJE?1GV~`goG)XZD93QAobfIL12e-lcE+{<#vVD)p8X<* zeh-E-hRpY)7_MeATm|LU^VN*k^B8#;E{Zc;1oa7dm@Y~)vN2s0f{L&+urjf+oQ!3- zROHCm5p_l1QK-Z8C1@c4Gjn4cgC3|&%(S9_eWN@>n;dgr0ADa;M+oz(GKM+49G$VE za|4*>`Ui4$bWfMQ%yF6bGGF6Twnmx8W%ie9FAD_nbxb`Fc&YF*8z&Pl&%L@+GL3(9 zFSGpR`zy@p$kMTTx;SfFg+yBvJCmbu$C3kaOq`&lm5d^+T@1{iX%=qK*exRu0}}%$ zBQpmdW0w{K7c+w+Ysb3AzEXkpo~*sejI$Kj=ko{hbX=KR!*esO%kjJ+>&-gmo3%_g zOKveba&|nN$H>ySNrB;G2o&h}yikUzacj^GWx>1h%y-o| zSnq1zRr$v>v9htj_#~&JKqvbWUM4nHZWcC{)@ZgaA7)k-Rt6R}R_2xvMkXe9Mm9E9 z!B!bZ)lSwc1`Iq*Y>c1-`2?7lnfMvG*gI+%#F)4ln3x0^*ce%uK=V@|R=W}-Gb0xZ zCnEzB0|N_lYYGz!BQI#FCsS)WLu&$as~Q6f1Ct|br%GdAx!h7`=IIiw3+36E0=YY5 z9!W91HD+agYrxrJ_CB$3s?t(tM~BYLXS@ubm>E8?FnnTV_*lch#PFez@v|AjXKRM9 zUZ9mbETH>W7(a_MT;OHwPhxmz#c)QJ@j(c~L1Tu-?h=MMoJ@@ybeU&qFf%jWw(nX$3mgQ2m_nBfa(6Z^+-!4vfiw~H9gS2H}cV*stLoZ`aJnIkAt((maSPzzcZVq(It?(^ZscjHfE+<%r~o;xlY*~@Mm?D=wj&N zV(+eCY%2pz>VZ#n5nyBo?R5v;hr`tF!^q3X!2~+}NaTMZ+Vqj=}*3yh%p zg_Vhcp_7g2t~ulTJkaGY?~@rnOE5HfFnqRU{OZBb6vXn_m5G6?gN5^(3FDh$4p!#3 z0Ss>gnOPkfyEGfyQv5LCdX0IoKGvS=tO3SeW@3c^O+nm|A@q znV7{H+w>XQj2xx9JdPHFHzb43qL5-_XJBRHW$$tj0u2=lGH@{Qu!u5(#z#QQDtK8s ziz?+#kg7KgfSj!}}oqL7XFd*P$iSjJ!v_D8dHqTFVum$3G8w?*80{gQwlT-GKkO z_j9-B?$48+CqIvQ9{JpAxmjahxg&G8#wsmP#pB4|t#l`mp*4a*3cN}~l8KpF1~f3n zz{SYV$OIZPb7bt+{Vy5F-EFx_`&AmNu#oUVk2%_Jo!|QH<_hHOc6}!NRqzE*tHN8$ zw-y}NSav1`a(4$jQW9X|XJTUKc^k;Z>B!z4v)Yy6V-mwU28PDDi45-}7}wb_tTPYf z>`r}R^*-}`2K%y_<;?G+Ip60vvUTULac5v>ZWLi+VEDwuz#PccUAtEBiwDPN_r_Tn z%e8N$+{k2Mc4X`^@8Wh8@9ucv!1yJX;Y$W+Z64zU2FAt~bFt;0lf}v;n{S;>AR=GJUJ+6%h zw7bh1&$%?7b9H3zSw3Blft3Mt{syRF(N^Ke(zAFEF9S0}ryEz7gd=0m+W&=tB0Zbt zDYX@ITvNCv&&+a7jQyHCC(|{hYvP=&Z3WD%Y>u2gr{>8q-eO{ST)=oslKHMKL*s28 zhQFx{2Wl7&R0neQ+`JOOv^}SBhWmqv2bmAz9wZAnD)c;AqRGh2%){A|z}(^mEpnLI zn?jhHtQZ-X8Y>u?nH%}on=Cv|I5N(1U|?pRBEs03!?eYjsk?%KnW>$Lv(JZ_nT46F zSAdzBwKWHH#aGYMD`AXW4D1X?H5mJ&n9i^=GJ$TeVdP{yqsMrpmZdcbG)Bm<(2rqZ zFiWcp(@qEGO^ggvDj2vKr{ps0~T(2OlE?L#G?V(c{TM$6voJArIWe#>u`uv6@G*C~v2-dhu!5J(u=IRt?5mgPkQC^UVCXCj z?qoMf1WzSEiQ&z{0z51%SvwXGBPmS;$gTY&2USI;TA8$EfEIL zA&nq;&=xBmhFg*hx1?BaNeA-u{#j^ySBFbb;BL^}Ob#w~W@bmGKF$jQ3><-yeY_Wh zZ;CW-@MV9H#=*qS&m_doEg&iMpqz{KfzJb9&Ich(%#Q4RnoBGhxmjDHm_YS1GY7LH zXP@4cRK`v&CSfKHMs`-v3Uq!34o8+gjsF~s{hCbOIXsIE0(tvfmL)#rxEXfI@OeBd z3+wY3cIG2eN5maj`-1P3Gqlz)yk=&2mB+vwDAX6Z%HTBE> zs(w{<*5a&TE1x4rU(V`aR(3`XMs{WV0}657Q@(PrRQv9J%@?Ja=UH?91@kgWoQ?rWfEcJ1RYAp zz|AP;$k(@_u|1P@ohZ{WJ*K1j4C~WbCaEyYv19EiXF2J@y0|iKWGZnTds&iIu6v2izkA4gEIx zFf%YT*|0J@3ic~ssbt_}XJ+guVP*o|=LxzSgprx8U5JU9y|sq56?BOm8)I{gBTK*T zhh(N+HGx(+j#l|V-u{RuuACgrS{pPrXtI9d{u1@s|Fd6X9kU~2|LiUiN7nv1vl*G% zQkdJMn7V>MtB(5f8oRPp+Ie`E*|JQDWjrbr$k)Gibws01qu(*sNmWyw8kc0u@oe0q z+ceFkU$=#Sx(cf!d;h-1iEa#y`>h!pceyb%b>@R+Vi}kN`TI|9%xK)@1==URm7{Sh z`?=bt-jG)DrViV41x)8E&((mAR_K2;L70&Pw2GaP2fTZanTgwxrT@VWF3`GHE+$9D z{#*aO1BLs)Opd%z!F7?Br*W5B<1XWi3``dpFBGv{WM;p}a-sS{-Gy3yNA?N4)6E!# z7&w_h)94%wqK?cHxDPTiu&}T?GELz4o50zm8ptz2a=Iy#*rmG5f-IaIm$@!;3SQ=M zN&W>$`yb+<&Bm>PF!Ir2`3Sm?sQ0-h@YjVOQ*jbmwJ z0j-5*V0C1fkbb2ebaokN1J8uS50y;)G3?EGf&3GSmKEF)yCci|l<#F|i`!G4r<_kY zp7ORhJr8*v33AZHE@|e;EIgB08CaN@nVB8=Cp53JVrcSZYVu%UVry3bty))M;bdfC zYL){n{bS%{W?*D;WSP){TI?sHrf`#=wBa0*VgdM#? z9Bo333~cPo41Dbzpu(56-HnBTy`9BTa>CvnpoIwRtW2PVD@@EB6N?xo)-rU+fSM+t zL*bdY89;X?@Gx*QcZM+tvVf*KCss2}ta4Q7}>oqS?0dXPjYu1h&6S+_OGJ*!TxEVl~-`wJ6yu}m9KT+(o_bu)=9_G6yEP`xz z4e#o(a&fcsI5JOEyUND!ppfBPL?G8h?W;_4?GNidDB^vP&GI0tBjYK*Bi}^Jl@ffN zTnxu*8MJr+7?@c=haYgavoSI-x0Qi9AdWl}1NLY#bp|mqFo5Td zER3woO-YV?6D{u4v$obSv&4M7$#<>#tha*KG4-!M$AgAE#fRK>P)ji zm-lt(fu=YaJ0qAmm_->yn1n$y`AmGEW~ZaX#H9}yKzxQpYz&JSnOb=mTLl?fd01MQ z7|yvdobzUE)?r-a!!VDPq0xeYnVE^9(TAb8Kya}UN52{Cl1zbZARSoegSGGVyS-usZTh;yGr`1S$i?KzW`)mQjqI zfk7TLN6b1!hM_axk$n>1M-G-fA}l>B98IBYo&JpL_!$}l1Gy&|oDNnIFuujyxL)BZ z`z=Ezv7051oRe%Cn}Zk{Pl3AVLJZ;zjY~?HaXRp3`7MrH!naIr z>E2S46uPB-v&xA3q1{8{Tds`{g&dhCMa_$55Dny>6#IqwLiioNJB)0nd``LF(!RyU zD(1*ODZ8;>oT0G|v=`-$AHyAY1{Ow+K&eS(7Yr|?G_F&=>nC{ElwHeTh} zQRv7z>D>i;hE6Mn2lWgO@)!=71@ce&_Jd_lN8ZV7H{BRn85}^j1TiQwFf)iUaWM#h&aq^%c4VB){!K7Y zbh7Nt5M`#Piemgvm1H`i@5DZ3df@q>hUKYe;}os+tWTvy8&?Un@;b6lHeOc2@YI2U zi{WW7<5Lv|4JOS%fyoYyO`$DLbE`Lb%@b{NJ?7n3wOwty{PR?%=ULAyUkC|0GENS< zD;vl;Ib@~g^AtrHNxkRwtj~i21t-VdRo+Ex5d> zu|M{C!VxV;rpW~>)ft}W1@cTT{wOz*t8pRs^CX#-1}p8`Roe~Jx9K#_V-Dn=-0(nT zsY2sq!RKL5^d@^wuWol-Ezkd2)RBF1&jVHlIR;^d)@+7d9t>N&8I%LXCr?>r|61X- zJRj?8k=LTH>Xx}JbLZe#WwjyrDer3|_Ew%&Wlouvl2*Y$uE}dwxi+4(Xgq2AlN|#gO#6gc-sW?#zK!5sBj?CE`Tpv7MpgzsMiyo! zN4ClL9(l9KFmW=7u*fs=I5JOu@I`@tfek}rNFe{@&!3VG`rS>Gk>+VpZIM&f`Jn#3 zPDy-afg{rt<~6|#jZ?D%MW(Pl$(EhZH=mtF-$-k2S}|SK4iuQ8^2xa|J-R1oX>PL=+b7XaVi(IAkH|J&;JaJO^+}#HkY|eNTIo*$ zT%V*riF}g$#M4yY%yfzA60eXW%M_Qj@zOD%g3wWDic@1t5d#b3u0YV>CJQ&iA}hv4 zrVQ*XjdhGn4D-F1`jiM}4fb22T{VeIjBWSkPx*sm2RFePi9;n%cogDz!erf;s_ zT)ugJ^Dtv!{#N`g@067z>(ugIaSjH?HUWlq0oHaeN2Vz?>*AR>97U&8H#SSNZFFbg zW8BXp*;~cb8!Fe$#mFilD9LT+E7_uA(3j8HIME-}8=dRJFe`!aoDb{9K!*GEj0}NX zQ@dwNT}xuV7R?R1rHhG~(~)iJwC|u(RU0=JGBj??V!Uq8z#7Okb>8VB)>CPX^SK*u zOEumWXJT%gSJRW=*vLM0^;OV`K@U|K9;z`iFg(;`ekH@e%FtHB{3ej$sT%_y_~7EU zA|}wLjOVos&x;tImoq%CU~Xq*x@XJqT7~JgHfVJ;Ym*)0C-5!T8r zGH8zEvO2?MC5AK14DITmxMX5tzAVRZhLz!31S4p@%C&H&Yd%cZ;u)A2*%-K)9)fO~ zyk*MJ#s}`H-VFl{sJSsRvvia(JPl=h;|E%}&hUbf@ofUbi%iCI<%}n57WSwU5 zKaitIQ>0Z_tJQ|LH_(w|>Z-8Jb3P4-k7@1kx zIG9`WSXh`_{6Gyl&`oJftd4@y9zIHC?q%URs>s01+~vW<4B8&f*lEPn>B9sX%Iqit z-9F6P2I{9VP5bhNg>Q;LpulwLkDiSa^j|Q&V18c1e1vJAIP+`G*IKO%Z_D2nvA->J z6qs(XCXBIBg1<=ybYwo~AywwZJnV~k8P~Hh^a(L+7iC@>#@JiMusfJ*E)yezBggcJ z3!#jiKKv_G8M|UY+oKq}ycpOWMW-8nbYMDK!*EBIVVVN-G)0ys8;0{v4C_T1=hTC8 zDPtoS!?iSqtM#n=Dwrp`Fdi;to$A6k)sc5PAM=8=K%VJU7s5I2Cf^NV;^AgvXJxya z?8rI2y|K}O;RZ9q4h@DK`V0@X8JQU#>M%UiW_cwSC@_8c&5EbqPu<#TwsLG`XJTGq z);PiW1xsteYs=S0EUzscS*D+!prHsFie+$=p1yWfm~fj6BQsN@0+R#NGJm!?TpTTB zl2bUDCI&G!nJ_mcaV$;+4dpViGBdDpbl0%3GPT69wZt>FL@;r(u`sZLjxcp}oxb9M z4kL)i&d9*DD1>3R4Z}@QhV6We+d(5g8v+>Ccrt8eW7y2jc-xHOU_Qe%Pljn8jJvH^ z&WJLsVqv*03mPACU|?q4VZgY;8g%?^0k{Fo%C^XdVVW;vlND%^=AaGxhD65ot_~`0eIR!`Qy}jQ=ey3FEH5M*7u)UgY?fhO;nmnD$;!g& z$TA~%RSZj$9uor-t0UWt@JA(}vlkec7+W|P*c};Xgf&jd3*?-U^33#;d}Aj=V<&6l zS*siI%%7thm&!P@&&XdV$l$@CW46bcZ7~~Y5owtt%Z#FzMP|penYw&fCv!P6%_wc` z;o;YJ?ZRcQX3TAKeV{g)7 zW^h!SaqO8n6EkCz4MVG%*zJ7A&LY;XB(5$WCI*JdT&$hGjLa-d44rPEfqDiO&W;!s zW`=eS#&&klAQlG`8~CI)W(IZ!X13N0MrIaf#+Eu}(6v4-Tnx;Ntd0^h4u7j)?gE|q z$;!OJj&}(=;}SN;E*6GemY`I^vYUx{qP9d6A6LH&Q@^ZKzYN2AMur}C#vUD(9v8;R zBJ2}+nfm+#xn>4Dss7-~{K2nP>vQ}^l~3xQl$t6XnPyI#pwGnM$Tu_kc{syoZpJc( zZyt;}rWdOjb~rH4^k!gYm}J7#F2Tsm_%xcSInR-GW^7}>9SZ|PSG;*!8OIdiK%SYa zeu&SGY+RGu&%yjqis_d6Eu~xPOt(}VS!NzwSjN{{0iNdJow@TuHfT_T5wv%XlbMUL z(~l9fmqrwHzOW<9%pIS+nY(q^TQwL~3I%e`yt<_Pp%V-1L+8fL0*#xcA6h(g4CI`7 ze@RK>J)V=fjs5OVeOQ@y+UzuTWS{x+7HGFTH^Wm;hNmu!Yz$Am1371Yxf{G9Y(*eD z6Eiy(izCO(|0}H+nHgT_F^Dj5XTjTY{bjob);A`82$7dD5=Z zcKM#7*Pb7I9JyzmU#r8|7{(CG+~~o$)sSNv14|nNTUQh>GkaSN6N4k;towV69c5-6 zd&&!*$!f}BYO-NzmS9|6!m`(yc~K1`1H&PG&|dZk24>K%c?M>N9YKuiOBq-|+wvIO zLG1-*h64qR2l5#XBn5KM=6K+>TWgy-Gs`>8cPclsuH-T?J2KB!om|1gz{%jqIa_LN zHhZH4gC6r_b%vG@wpC(`vn7Ql2Qx4`iq01K#LF;Un1O|<$&9O2jAgPb!)`H#HQ9_) zf*AU%S>{(VtS@6&%+A=##JDw%VO=3ZlLgC^IHnzmOw5e^Re_wdy&m{8F~9a_W^U|@ zXzcX;Wa7v=J7ldcbCVe3T0@apcI?cK{If%!r!z1!H48EBa%b)gVd>0b1RY|;!_34C zx&Z`q8V<7~cqKqJ}=?1D`x z?4WhN%-l_CEDYSN49p@;ijD@eTW^Uow5x$yA0q6aV^WwI*;v{^$9ym|g8IyC;LZ#y zBRiWAYij^#(13xBnE`zH1uFv&qaXt_HxENg9Rn95HzNz^Y)nSb#!CqXVMbO40R}-< z4rX??<`M=LM}gVhfAbjUWH4+IWtgSLUdd|C*kdTrn%%H0-_!xv4_LzXq+!kc!U~bo85@uj!L5P8uVMQME3eb(2 zObpUYhe{X@rL(jKFo5EpmtkiR<4#x5Jr9n|b7~s9gc^OiN?5uy19|3#JxFC@z}kxM~OI>*6N4K;F6OcMH3Pgx|%#3wamXIL&XK%rQ=0(RbeOk{p@mmOoZv;9-yn z6qsB6*mSGFR^_>Qb0d|xRp!RcW0n$@(|qUq&drf!?u4f*jI0bt6&Q|61`5ob_S9II zpHqULgo$ok;VYpHO0cn#>m6an9SJd2415k z%mCVo1G1T!p)s7H(FN2GVd7?NbYT!?;A0YIU;%ecKxgGJ&i&Ka9~j6xkMpJdp_)Vd zhgc4=PKcWj%gn-T#%vVGIZynR;T)AY{ND}P8W)(XsQqr)xGlhubzbT8WagDstShUT z`m{Kv@;GwNt9q8jy49FzatKRD8biAh12bc51Vd{$Lu-&D%e?Bw_6pX?!Ay-l3{9MY z!t*A4GMtZEn0b4w-*HqOdzyldddGw;m0K!#=743k9|I!YMla5GI$V`gS*(PCm} zY>HuTPGD_GDo|p+ z(mifw=GLG+7PI881v4`svFJfT)P{8mo zHIRS4(+jS~xU&wslqYeQBpEeM6z}JG7uPD%7T3aena`1Be$Y}*hQ`e~3&;~;f~_(Qkgzab_Vtq9?5?BM*ZbAjRNgLjLXbL=P3!z zFqWN=BG?wjK3CeWHA|w4k)ef8xix@gMh0Umqg-D#LzlbC%sQ1>oMub4n3t$B^f@qe zNtv-TGO6{JD^AH{T#&5U%hvouw%eAW(Vc5%n(NG3#aTRTt(r_zxEYuQm?M^!FwU~} z=#_EH5^GlBZI%`5G8O4`V3?82)tsidilmI<4JW zOB@l1byt)<1yKTKNX6J}JfPBBqzlosoX7V0)) zu;i)|SkBoLK0884Q)hv_cC!V0pM>u$C+2z53?1AIJ#h@(GA1oy!Hry;6RVj+HCo~r zCh4k83KN(V+x$bMM}cWV3GW1J-9{tEeh$+m!91%}a{;VJSE>oS{jTp@ogH zk)Lm71k)^C(U~s7y}S(FfehVQQqAI`-6{+dv_Zq8bE_B{B^j4-GqkgqHM6m_a4~eV zF?9Pe^fNO|jb)h3pd7-`oXF4`!_dzlG`F6EhoOU=VX6Vc1UH5zr{*8ZeZ1`5ehf`n z40D3{S_IiT_*ndST70;t_%n5eFmy{W^oujJyUDd%G4!x9G`dPGsbZKR&Cr<&THDZD zE8QB#(Ca1GYtGW6!Z5*(VM-`Ni>gA4Ay>a1*JN*oMHvh;t(n?G*`^q=PN-&S@(^y( zlv%8yJYSt{h6YP#3hyFem+3*`GguvFSBSOwHCD7aH~>Ys~7E)$G$0o2()^v7UF9 zmQq`uR9k-FB73PtF3i29X{{zvopNS9#?3#~yQ2d7M0KWXnDkWZwk3Ep)w1=(do+r> zOqXktm@m%UE8HkP$xdiOMe|Pu2Fa#8R;B3nLRBvICU%h~Bjsi`iym&pzH~l@7%qlI z9(;@9ZRV)yH)Y05&1C3Ploe;2$->;096G0hdrq#=lr)JZt>&MCO^gh4vV9gB2)9_9 zR_XN>yR>VIOqFR&ZMVsg30k76Fp)uRB6~dOPy(UmAK|le872t}tPzrE%o3PfYcZji zRfT;~6-T2Mf1@}K){vrx`aSm6+?TO=|p#jrUI!p zX{9NV0{wdGEpiNv(F_wb8G4i$x~dtLIWRD(uFMp%GMQ4vFj0|V84rUH!=gy`Mjn4Q z26=||dgBfe@vd-%J|Bk81cnZGhBifpg;^GJ!bQ5hOnSH(rbRJygfsM~7@9COD|5`2 zW|?ZE+Qh{W$k3a~(4x-Jp2aXRq4|eGr@VTn6hoUaLysUscR0h`D#_K-x~sBS7x6MS z8Za-EGhZkv-e{}T<;K0)M>XTZ?L$UUW)ug!?DCzQX(M|w&K`+R4Ht}6YeMEQ0_-PUNy zzAT1*HimiT3`?Ta7MAnRH&U3G%iNT&-c-TRTFTyI#yU-~`G?J14u(0L%8N=Erud5Y z>kGGJFtqy_^tdz4R}k!vWSMT^JC!$V7PtTU0{= z_@)Rn|1fUlj$0F)+ZVzxhlz2HI(M@Z!;BJ!W^b-$H_oZn4DHV1%~8w~jTk!exojEw z?HHyMGW5AI^vW7c%V1dI%h2n>F*SmzsgSiNouOZtp~H}2A`e4rKBz>S=g%;+f@Qud z|Ew^kMU0F~IT&Y1GqkWXbO&)xt7DiM%g~s`&|JkZk)N~8j;lwCx6PknN)q#&K*ml9 z_GV>{_8f-JM1~GkhW04Nxhg`76`iARINWJ#>`Y-ub82K}Ux?*1HZ zteGmZ9yaVv&P>gGY|#dd49$N-RNFb5b(()fH8Z!fwPZH`;b;nI4sO-*>=1AMRn+d{ z+FaVw7}1<1-E7$;XV?70H?_%>p;@QA`Bz?}Qn7U-6K{AUkEdx9LsMDvAK%9MRFEggbS|)pj1csIdZ#FK5#zF>eCVi&nANCC541x@xHHhjA>J0o0jf@OV45AFy z44e!pY{~4QOi9ezEX_ZKn0S~anLsP=HJI`lxEY$&nSz+?n4AAFGBqkPG%AEPafC24 zH2+9tYO-NybYc)^XsT%xZT^woDB{Xs&Cnvvz{6nA(ELlEsl|+?DT+afq4}RaL-Q{; zhQ?S1aRzOMCPxM#22}42?`oip-5%OihLi;S9|`(in^wS}hnF z?HHPWb1*b=GpI2%Rx>pJ7hr1sm&wqm&d~fPo}oE}L5@LIZpvu>72a5t*%%Yuba7r@W{Y3*FRfKES$vW26eZ_IyBk6G?0)Jo zH)}GrE3kCyGutt?TQKzI3%5lxOkrba3gm3zVQYzGm@USzGF5P89Q*WohAGSpy$-yM zj10Xo3>``gU9y~=UJMib8Jhgq+N>ESDKJd)=4#R4>{R6KFyrh{Z{l7c)BHntihZMK ztB++zt_}mwe6vQCMj1n)fJTqZMk&T7$3~MTH`NwZks0+&t#Zvj&8OyhH6}LlCIu#E zw74?NDz}*L!Z6=cZ>CvUyM^2OSeBJJ&A$ZaGIF*EGqluOH@P(CwYf1gCo*&!u}?^p z?lxd*(&u8*Y)_V+ki|M7m1U)aN@KD2VphX;oA}0Zp-wjbiOFJ%Lf98+`pjd?nPkc^ zsh(k0T=S38DOOSogG1Z6BqsZ&blatNTgoptY4o3NDa33U(&%Z=(4Q&TA0^vs-TXtQ z$y9!URQ_CdJtl@GLmNd!A*BgYjb2Pv3$!d2_%gHo+*~c`&RC;43_PTxFfdGUVQ7^MY-HA(%Tm>!&(R~9*Dskek3o8FZO+69 zv)Lw0b5omthOT@MB_bRG#E&GdaY%Nm_W0E*}d+zj&jO8Sf%Jk){HT z<_Ly~{0!YjicI zQX07%OBw}Q8d3yW8q5URe;G7}wlw-AH2>A~Z!@-V=C~1b&%d!Zke99bPj+Byo^<=K zn#O|mfBKE}Jxxv~O^NEx!8d~Ll{ZdOm2NcGX)NY!G!t)(&}mJGYvXVJr61ms-{@7| z9I4clC!yW^BeTi1NxDg{k)@fZ(YsZWvo7R*ebl%|A_>P2Cwl>yH~b z85(sM8uJ_7SR38lm>Ol6B%92de+tEkH;eK!t2E{qH)h8%2r)D|Fc>kgF*GK$squQ4 zw-q`vH2+j?4`b1Y?O+V%yb*m@sd17d$1crzYLiPRBu~`qHfk1fX1o!5kNvHMb5rPz z=(~ZxRQ)E!F*FJ>EH-CoEo7L)#W1m&VTldH)Lf?~bA~w;EYl_VSy+0-7+dqX+U@lx zCNhXIG%+(QQ_yHMVs2JrSy9h3F~oO@3&TobhNduvW*vrBUWOJCzZN^6rXq&P#?3#9x~duaEKH`vtIcqco#Cjp)JS*=uKv{nH9~T29u1t|0E!HLV@>4^&xrC42Xa=7HQJfn5e(Ua6{XB4?K z%D7EVH*GXmoMo-mti#?M&A&jd`KQPn*Mw;vd_8%MmW#z1MD--9rxbBd5aM1G&()+U z*;p^ikiW1-XTCOXpbl&E&w>?VYOGD{E0{&5@-Z|9Nll7kW?){%C@9F)r6kvu2|9GY zy1GW>l346P}k)}JE- z3qz+HW2d`VPa1zuHCu}r?;;k4d8s_DIWlw27^mqnwj~QSSur$OGRQDY3e#v0d{oxGE2E9Qdy-BRb42#`W z7Z>o(Hf{c`(5B4P!ph#|Al;M7&=bSZ?a4RUPr138VL~?h5(W8|0{cagO7nxX8)dos z^>wCdin28SF;o#{=Wf&EXo+fM@3rHYFV8SpiffKSW8oZm!A?G|$v#cmjUtW4jr`3& znO2nhOwn`g%VcY-67F%<>=ly;7MW^eKR;4?fUoQm}*8nc`2umALGRCVUQ5q)oFW3O8CpZtKy z|I2Ngt(cqtF=sYPGzPW*V`Ojs>%!LkzqqhfF{$~timNl@jkvq%jeV8Qj5q4;SU2`( zI~U)GzFX2bg~zf@R=26BQM*lmsma)-rI?|rF{jz7`6o}CVq#MfgS&Ezij{p>b81GD zVWVW5kwlv@XckqgF+#sFGP}*CQK!+M`A0x|X$woE7(=5|Q)yFV^G|MuW)>!S1|Ehc z28PIvxJJ&#+U6fM$}XzHOqng|W{uW7jW*4HMH_7;8B`do7!i%vo`;(ZMN`eFBNN7@oHDqY6;P9QdVkAQ*RP(ELdO<0#wLEo7DWYy2!<4f##DypUn$KYjcLuH4h&5q zZ6fY%!deVGjS|hj!ilW7~?=n(JJeYXe&Yn*UU`1~$gVwf_rkw>bUBp)J@^ z`GNcdE4FqPli7*vZLa*YGwSSrS`4 zjb8D2tyLGo^ka=vVBZ1?K1TPD3ss>gn2>@unD)b12V#cxkq^cb1iR2$hklsottB+Q!l8YP-^ z85@}x8Z{U=7#fY485rys8Y3ARBN!S(8Jdi^n)Df%K|Iirbd8Y=O;*zUOx4nj%nXtY z5)6$ttc~e)jVg?Fjx2AOCdD@@_ZBxYwlXzow&Xf8y@{K})6CJC<;e7U-qK91786Id z*G}tHohQc_w?#TA~{4o{2CiR-0xF(?%@g~jUX(i2-j!dufu0~q5 zYdA8#cDNVd*i`*;@~=dOWpWJ5+7Rs}WOuq+is_VTmO3}=}c#?HXb#5yyUnSo)s66GA{bUg@-VQ@$Y7Yj$FQQ3Wo8mXzYN1lMg|C@uaVPy`(%3Nj!h8Z3# zOw2QUnN~3{tOD=FUBYKAnR%5C z69YR7NKlbsl>);mMb1?!46DRJM*uM}tm0>4U|1!<$N)N8onaL(!!mw`3sNA)DjrT2 zhE=Q#t5}#ASXb7vtYTqU#mKOVfsaLqjbUXZ_sRs&wJl5x{413iR%$Rzif5hX&BVa6 z(t=^7F~dqDhLy(53=AvHxF%aOOs!^E>B6wmRd|{o!!&;u29A|w3@h^)R_3v+%w%F< zSeXamF|5pITUo}kGM^PBU&y|)M3aM+L7IV?fn`N9!-_P973pjY3@Zv4Ruri7hDM{7Bo=1l7H>ud2JuGamIy`$ zj;O?@WCn#eMrFn(w$@yMW<^G}W+QfiW=lr4X0IK7jE!ncjEx#iPMl5QY@988GK`It zje?Agsn(2*k`h9Mj7@HnWSLqdSeRR)8JJpR zIT%|~*ce-?n3!8?7@1p{m_bM0F}CtBFtw;NFtzeAFt%thGPedWF}H>>vb9DrGPfo& zvb3f$GPh7S42+8y7#Wuv=`g0UGB%1Z zFg6M>Fg8jsFgD6CFgEfqF*b6rGd5~5aWp0JF*Rj1dZ{!AwxlpNiSjTt32donY|ArZ zY%2(7?9yXk>{StGY*l7rY*pi6Zmr^GY^~E~Y^$|n>`-V_Vcel1!Z^V=lyQ%jFXL>- z5XMCux{PZwOc+~rq!`;+BpD|J3ov$=^Dyo(GiGdKXJu?jU}0)CM*XVkYt>pAjjBlBE#5j#>d#r%*Qy9u`z^kM?sS!V@o|N zW4k>gV@JIiy)*Os|QnHLQoSMxU z=Z7?EFt!KsFisU`Wt<}=&$u;*pRvu!l5wMeGh=r=BV%`-HRIN5QO1dZ5{x_58r2zR zq^mQ|(P&g=TxxC0xH8O#ablPRh=84&z2WR>o~Etc;VGSs7<4Ni%NXU|?)75MXT2QfKV+H)iZnuVd`1R$<&( z)>6f|ysS~0u`}I_aa%S&(=K&K#%aQQj59qNH5iwcn=!7;(`W2)m1f+QpUJp^M~ksv ztkIBhqrVg5F83J5nK3GibD0|%8FzV!Fz)hUV4S8d!nlk9wFXfpOYi!t`QN-*xKPGDRnAjG(eL4$EOyAb1C6J^F#%vOxsEgD@I7yFknu2!~S z+-}XvwB6R4aY3XQ<1#r3#x=T)K8y?E8bujb@dz`n)@iI`oa>s&I7^0$aX~&G<1%d- z#_b-7j4M1P7(1BF82jTIO&I5fDKIV0YUE*@ETO}=%tVuMV`^g=<8+p0ea6KlR*cIm zs~A^XG_o^pacdN2oLkl;z_`X1Lc8s%v{27<(qLR0*_O$;Qk0!>btE_A25ASzJ@Unj zd$gh%SJ|X9&gO4+V_cn7%(yl|i*a3SlP2TB1O=v*T6IhlltmaPXA3b-59ei^t<1|f zFHVqgIh!owY;8uyc}docOOg#3*D5kIu1%6*TrSY4$~Zlqk#V*GC*!p;SjVX-t zitQO!#WhJWt`iPsTv)EexK2!xaY=O`FPgac^LYJmcQDehJ2XlC2($`)orP_c^xsGVTlSlx5t{*yhK$U%4rTaldYh8RLG3 zMsCLa9&K)n`}102826XzFz&BlVccKco5^^-KgP52O`42{N`x6NmbPg!9#+p}JfYGO!gMxOiScZPF5_VvX2ugfOpGTy zTPzq4=ddy!cI99^?BLCKBBYUp@oZUJF5}_)W(UTT(#(t}6&np1&l$HkF&@!pW;|jh z#CX!FiJ9?;wLIg=;3j6qb7748; z##7>~jOWF(8IM#ot1%traAG{l)0x3|KBHNc@l>S}}rbao&3(2kgj2B827%!AH^D|zkOl(wQ5nz3j#UTHtkU{dT(5?)|x4Lt@nO<92 z2EBIVWPEMT6#7Pljq$bV0X@ch{H%-*s=C4$Z#hXYK4cVSeCpLv$MlesoAFsqqYC4# z$TG%zl1p)f{d@+n?f0{n@TWVcQ9vsT*ArtoVS+ox)U4YL+eI!rb}6@jMrV+7;h^# zNitq4X=G)(t=DAAc-th1=`v>%GvoCXRmO*I%#4rgIT&9CH)b+kmXu<=Ud+IFy+DHT zwyPN9y<8#2C!mcf4+EJQpKvoVK9}@kydBo0$9OxlF^=(uV3RN74e>O_r@4(qj5pM) z81M75Fh0y|4r077#LM_HwwURLjR4~l*_K+yE6h#ajL+2tm|n&=Nikj#&}O`mpThWv zOM>xkpJ}Kj8e5LNg z_@pwJ@v6Tt<6YNE#z!^Uj8{W781F`gFg}kIWPGLDD8u-`TafXYD=X8Bz(!BT$AUJD z&-|NM81EJfG2X2-V0^4E%J^7YlJTjDAmg(HSH_pNjVz3}41F1InMyOhD3)ftTBpzW z*inS(v5P3ut=H>O0! z{@skfvJ)8#t}-^ZL?&|UwJ|kz$ucuGb}8C1Hg@T8FgA7>HajymcDgkwvov;kGBP%H z1~D=>c1AETHg?8d_GfJD@_+8e*w~es$eQRfxL`LOXjE$3J5*g>OWo(=xkj!zz`EDI!V|PsRUs=Y+9+t*1#>O7Djs_maFGe#O zMln~nPa#WFUw1e|E(XKb9Plqml65@VC(hD1;oow1RP0kmI*v5}8~u~CSD zu~CeHu~CYFu~CkNvC*A@vC*4>vC)%}seqBWgpsvTfq|*fmw}}*o{6c6r%{Hnk%5h~ z$(LQSDVI&MnZ1#fv575_`P)X><|+pM7D+~?7Oh0)Z!cJ18#D30wqj_^d+n9z^H`AO zoi?M=I|CNRcVUdI?;;tQ-^DXBzDr?bd6&k>{4Sf3{apbg)4NJW{&%&EOz(La8Q%*s z3cnX&a$ok%pQSQA3Gt2u(Mz;5H%*^l889CqQFbcmfXJq=o!yxd1pPBK4A~Vki zHAeOi#*E@0Y?wtpgfX&y$YJLFP|VEvk(rU>BQK-CM=?gFkLrxVAH5k>J|-~md}3u} z|0Kl7_eqLb`jZwT`zLos%TED}a-X>w**|MD%6&Fr5&0a<$o@H#k?V621N-M%M(!`H zjK*IC8RfpXGKzgkVO0E5&B*vwmXYzR0;9xNB_@NfHjHdv^BB~=mNMCYlVjxm7RSi^ zEsN3lTRx-UcVkA4?{18Y-wPNxzZWrzf3Ib9`ys|C{v(!=_eU9H_D|M%;%sjdyNj6K z2`4tnJz$V)Y~W^OZEVnHly7V>ViIg@2w`MvY)EJ1Yi!78G-zz7XXI>bG-Q-)Y_wq% zY-|i?6mD$HVq|S>tY>6tY+_|#Z*1aXRB3Dy0&y)E`5HkNr8GAAGBP$c1v2tCHU%@X zH#Q|Ru{Ad3GAcASl`t|kHj6UxHa1HziZnK>GjTRH+k(X08AThLy%^;hn-iEc8(SEe z7#mx38PytF3>bMDTOycb8(Y#CB^z5=nb{j#6&d*&TQwOC8(S@yc^X@@nfM!9E4uT| zeikxm{L*4%`4ytZ_$!{B@mI0{V`ICY6k}t1Xp=0{Z#GB9-(mvHza_XBe=9OF{#IsU z{;kT+{#%=k^|uKZ<8NCwrr(ZyOus#u7=Qb6F#Zl?Wc(e>#P~auiRpI)8|&{_7M9`hk z2rJ{?C>F-Qu}mU=;~5$MmNGK^EoWx@TgA-$w~mqd9}^?vKQ<Q^<6kHf+rI=xrhgfXT>o+yh5wZ^vi#>}Wc@F|$n#%}k>|fMBgcP3 zMvnhhj7RF1Vpu<|sv zC4!XXGqE?el`ye1w$(AQHMX;YVv>i8xv^a+vC-&(J7eP{w9AvBY3y?X>2L>0c(SrJ_630?B0)q9h=^z8YwSw`DJcYLD+aMD7}*>9su&p? z`mc``ti_{g{~=`vaNS z8v8>)I-=P*8vBzN*&F+_nOPhAOF%>wGgIRPMkeOQ2`r3EjT1N+85<{XgSdQ*9E}r% zKw{D$mK=zs&c)j}L63#8ae@sqW8(xn4#vg_PHc>g6I?;s+&P#VCwOu)HBRv3VQicb z22v8i&eS*|1|*gUQj)^X*f=4Bo3U|1t{`LMgd$3%;MzMgdgW+UuoS5Lv*f=qRnYD3ZHZxP>#3DY% z#)*|6ZMAHSjguG|85<`tGch$zVr6G+oWu#@aLNlgt^p8z)(Hc#Af6dNLR^PD*3|RhA))ja?=z%#B^@j9!YV5IMW^L@TV`OaXabe~Uk{ZtMwSG;QpO i1LYNwrd+1RPB#XQ#x5B~_Qoz%Mz+Q-T^7#9$wB~s8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7n+yp>=scVXrt9IzrXXCw zz$75uyhpR~Dq9nG8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8@WME)mIQ+j}8O)GpbarK6U|7J& z(!#>nsLI%=%G&6{(5S)C$jRF1EZ=A&&(Q4O;=#nsz{J>+&fOBH)soKMlCg`ewVr{A zSDlH6fti7qtC53=nU#Y{snMm8hp|zRxlur(DKxi9hk>1eiGi7gi-EbCizSkohe3jY znMsS0nN^XAft87YnN3`jpO=+^#aM%xfm>RVMZdAK$*|q6F|Ng&k%5zmnE?z1*_k2G znUjHmVa01>=9Z`y$(CqG=EjPq3V(;4E{z&o42`bk&K3*|3WOP6 zIx;9Q3NWZLXfd)eGBGlMV6gy$HIoe+Gb=lX5EnNuCmY`m<46V@25SbJ=B&xG!Lket zssT+-jo0~91yn@@R3*S<kO)m*P=lbhk&Y#fNJBlR1n8mgMmRczsZq-Swa!w zO$f;%#=yeWSkAyKz{|kQA;iGU!Op7j0_A+42`S|jVz3f ztV|4y3=EAd3@Xfx+6;^=46Ka~42_P0O)(5j!7L1NEeQ;4RxPO<40}SI7?>CtoEaGy z^cQtWgXwj>N?>~5F)--w-D3 zPGE+0qjO?b3v;&~S67g7yDMK$9b0FVL~jVwdRB=^ExMwknwYjl0DvC9Ua!n2M zX^i3Rmgbul%+_bdFe!?AX{}I866drG?si|9refwQ=2kvtO}73V(TR*)ta6LeSy#w# zb~18z+px^F=Imf)SRf(V;V9J{C*PUM-^$F|7Q@gV#XLovt)+rxN-5(KJBIm=49gT4 zr&@CNurjokFt!@7b?Y)Wl``}?Fik07XffrR?a6J%Hd};oLMYQz7rqIltdqDIcoR+84&uE-BZ=Xxk?%u}p?#WwCLm3+tQ&rhaSLsl38-YdAO< zyZF*ObCnjPbIf&PneObgBtU4MG}lxG1ACdp@thOW*k?(xEvsbgFJNu-ViGlPs^OTX z&bC~GFN4X2sZEfjO-G>JpP{`*U`aB=BnHk2MY0olS-M47+D#cJRkP31U})2E?s7G1 zDq)g~X)i@-WQfmY65N z+?UThDbQ}BUqy>KbB`5Ek0fia4qv-~`YKP(b^+NX0s>P_8K>$nEj8p_7{fHVoUKWW zRf)G*TCg=$w9A06SB`73F8eYymi}yp&PvuERrUo|+%tU{7PB!;U>EGlVvjj`0J48Cvw1XJs+Yj|@~|m}bX0%{^vufEbf#lO>N0XD4sa++?nf zD5eQ~P7|2KCI@r$+w#w{VC&PAYVzTjV!+T^&N-J^S;(?8pRqGTpwY%_BD+9iop56% zXMc$}i(apyX0Myqq!Q-2p-la5=FQ4%Eg1}x^Ym5*H}b7_l5=LAoGrx6->qHV&nebi z&O0HBp*x##k(fxcAxEDn%M1aI$2Y3fWprW}0=OuZHSGt?P70+`w~nOa2|x}8*+ z8M@^eC-FJA+c0sm%?j6<5hvg1uGpAv(Ba9*!q#r4*{sCfmM7h=&DP1FJl{2DRh@HV z9Rq`2Lu020bE6t78y5>31H;53_KC%e44{IHk%66om4T6gePRmp#8eg*J{FdV5sjXc zs$0Z0nRr?mr^zu+RySZ{Xc1Fu5tnYVR+*L)K3!a>sfc}oi0}kK76w%j9tKGU##H7s zMs4BNDAC4zhQ@e~Mtj}}zRohnPJONkLHsScf-Qk;t+7J=Y4VeOm3z(DSa}+Y`5OJL zI+S&KCG6Ui)!S|DCP`ULlow!eYEl#Imxz;9ou<#*%45dB%b+zOL103(9*bs^glLl} z7n3`iH;XEhQDXpOqc77$A?1E$j>deB9zNapC24)T>$$kO%er7%nRwmVM zk)kFp`(A!!4yAq{`4(>BZdGMAE(ZQ?2BsDs#(r)#CTSswP7bDK9?foLhTb5iHg%RR zM$Yae$3DS?Ry_qaHU`e_47ToM&OR&VK5J$MRtBElDz@HA7X}SBv6gg`Nfp9E4Nbc9vXiQ-0F;VMh)^3Vp>XsAe z78m3YWMXGX&*?8{`s*dM~6E7D!h%^<;H!(q$9*rsUHrXawS*I8lTS*qQ^#L>aX)}FxK zC+^(lpu^NC(y7Kh$((Ug02?zuk7%beXO{`H3u|K~vx{77qDC*T$RsZnrMyNxhQ?^Y z#t@-)*7TxaZUzQF_H~6<1X)>FuLxbXz3jz$*_+v!oq@qmq_qfC%`>tvaPo8%F!m^d zYCJ#1U%8+f&rhmxVlAUJd#`#h7XyQz*1zz^&yh`Cd`+FUm%SQK>NL%%yqtHo__B?& z5(9&uS&JlNqY6U^W1|Igvng{0qYe`TQvhS51*plz){(;4!^be)nwgEkfPtB_g^9B* zk8835b3Y5yI(LRD#zqFFE(L~eWkx-w08sVLz{=dL!`M~;cBRdFepYuD9uZ!p*?hdS znOXTjmAjvLW0yFq9rG?h_T@GL%dHu9r18yR^R!W|}iGJM%Iy_^s#=up&DndKPR8HAbH zL1hc4C_`f&D}ysD1B1VKjj4M z)!Y|&_&|Z{@7$rv#KIuYpvPj$pv9mKiggcJp9i1_uA2 z4ceR+m<2CzToAsXcD|lPTY^jbg2Dyn3p~>2E6>+Bb1*RYr*F_=JRQw&o`XS*;k+^9 zc_W7N_6$P7QVb0KML&uf@6?|cIL~~pj*W-)JTv#XJf?GnlIJGDxq;0WenVDP`TCF5K+ z`?-{J;pd__&t*#p^K&|b#NSQuVbEoiW8`2_WfWkRV3cI#XVPF4W^QK#Tlr>74trZ3 z12aD_BLkZXIEbG7NMq>I<=S7zxGIosZZ`AW6xNw>EK^fK)&vMnaAZDjbKd+0!wu2% zG3OnbMbEnkfJ_RI+aben-j?Bf6vKIMhVupt=fi_}85jaoCs;6_&pIC{uEum;=e%j- z(VB18vNE6)8eqIbmEm&;!)I4ULFUG-B@9iip3FDo7$g}lGK2gb;JU|+>!S39x(k&T z>i92|U#PiI$^o`2a8DqkF5`tvhQ=!%42{i}4DT2~Nj4yA3e$zUi<}o~IHjan#XtcR zkUE8hq47KiSUTgNMQ5V2(mS@sef1aWE;3&Ta8_er2q>At$-vCO&cMMW%f!Ic9>c=U z&dkih!oG-c#o77qmNxE*Y1|WjH|K68IGqOCx5O~$F=R0^Gc+18Ff%mqF)%YQ zF|ac>g@G6>Epm*Yu5D`;$i_f{rM!&nj7$tnOzdneL5vI>tn4fdZB^{8JPgdvq6`dy zTo*Z*j#M$sjAFWy$jA;diIJVTql%H0k%57gftiVeabpb2k$8q#GVFbM49rZe0uuYg zKyD0-Y?6Fq@Wya)#^QA5e@=fZ8vj`DjMy3JEXlwSnA#G{*eJ!&?7+}g!q^?m&?v{! zY{T3Xz|f)sawKyPAM1>4uGR$Ro;U_(rd}0>`Kb&|3LF#U7~8ZsX5=z7`!F{N@U)eI z{m`(KpKWpwds7kf1O^6X=1J+SZF1bR7}=&|u{TCBHCr$;I14Z^1ZFih*l;a_n;Yr|jHl&AF4ZzN8nAS-uy*USUU6c$B+Yn9jPU|HNJQ$9JG8_wGVqiL7 z&A`mW#@eF6$joq_i-e549r&xSWZMUTx4Us$joq|j^UgjLsKyWGh@38BWM7lU5AB8B+_qZ&h_9^)JlhOHWm z0SuP}884METu5hNX1I{Ta88hIf(6s{BF01fjBRCXTca78beL|sFtlnh9Moi*SInrw z&?3pu3QF9NgwJ@1harXeWGZAthN(4;X-Wj+GEK%t9mYlj24==9K1`<_nR<$uuG%qP z3};|wy5hxfzL=4LwM&5EoCnhhRi-_1jF-|`ugI~t$}lo8w(2l2g9H4WKjS?yhU#i zF}*cz6rPdK&?&~i%+Sgg+ox*ZDg-hpDDrcP7lRFxvpEAp;O)k4Ddt{rrr9}+6Sz4h zN3*rKu}^SeoTbb*Nr$ypP`J66VYwXZVqJz_KAuVb?5%b}D>c|xs&lktvd@m=nyt$^ z(N1)_C&PRz<|*~8&ADvTjo27?Ci^q9a5J#A)-!kbF|^zBwG=3HhbnE9VVV%iGBc31 z$%vuJf_<_M+XNQw39NjLoQ$oeEE8RrmQ=I0MX)h&EaGBV#3{nT!^GHW49eueOAb0- z=5M^p(AZeq*jP5vX}W1s%}eWB#*K$_oJANIf;TM^V%{AO31jv-TrBen8I%|rc|d8J zt;-Hn5;3<%F}JBPZS-O|smRdez#zlG4Jz`3w>+rRnVJvE;K3UjyOji{=ri<~F!h+S z&DUjaWn)+?#xO^ib&e3jqhqqjW;$PYzW991 zd3PpLg~pE>jSHjCyEeYiYkc9~G>r%3j}VKFFa}V$$;GJ7sKzMCz|O?X$im3REDTB& zA?6z#SoxTlnE4rn*g0AFLFpmH`)?q_dOwB@s=<5=3?T`d^q9|;o~vLIXW=x!k6PvN`gNPf}SMpLjJ+ zH3vIsR#y>YbB^c2&V@D} zbZI;o-S}Gx9M0ReGP0iwZv3s$xF-Fa_Bpq6k>{e$xoe8BpL029@65u$5OTaXf`N-c zl!X~=)%h*eY#i)DU>BeMtjw^XhGD%c)4CAO-aJrjhdkI3e%}AQM&ss4A}6GJAxR6*+rNI!7=;3v0Eotgn=QHaY9<- zMX$!jbV;`Jz9Q%K&Rd^%;^~n2AoRohyrcU05aGs7r^XwVpteq^_zpLQ#-%=tjZ0mb z8#^sn=5R4~c{4Q5=4LoA&(Qd#C|H1jAyjKmVq-@^o(nY~=Y?ADDPT}%JgLmkc+Y~NaY`Y>g=$c2g*s1BW5398QLyorP-91BV|!8K zP3DUtpyU(kKShfbROyPba5G9WH0d!m=`%_&a5IWCGlN=up}u?K7^E1b8CV!N_&J&Q z1Ut>Z!oiJ`yf_zya(6H@_9nA7=`nP3Ff9QnO ziwf8iZH zhC!DB-1ZFJ@UfJ+MSx|!7sFh0#%5lYCb3{i28Ph%vm>viTnoNt#>}d8E&p1A_%-)y zVb_wcMer~+cKCG&Ha1vZOTK1t&Hb8R<5Z8vH>zN7Kb#%U%)%hauqmHmQwEy=TRRg2 zHz-wwK040D#>*i9N>!n+{?ste3T2*^#lX$HgasTRKhKzR{!jT|e9M^gme(!sTQ*D} z=Z3MIF=cot!O*xnl97jjm+6)oD7M1*&*d{@`7Mt>G?vpEI1yd zHSU&d-0v_UZYu90J5U}EQ~guH_)wnliXy{3Hb!=a>jDgoTNOdph8ZmqyT^2o@owJT z)W&@V56tiJ-xIhe3i3&q{UUKbHWp@PCdSqR4lzbS1~yQCB+T}rBm*dM^D?kA&F5v9 zFUH8v0P10~b8~@eogzklCN?H;$_R7*Q^(m+#mK-gM~SgRnz2KjV^S{jY=2P8J}hIY z3?~b>(8DOshv5$c9)>6!d9 zIaXHYXTs0;p7A@|F))PnEw^OgU|?ryk>PI&V`5-!ieznN05u0#SeP5FK+QVVMg>q; zoiUFkfVEMJ>7pP5Gh<^NsDAfgxZulh!Gq~+B*Xa#MrNk-u?#Fs=Ytr}N3va3U}Ru8 zSIN>E#nCIrz{JSR*lxqoC&I|gw#Ap>iV*vGZ3Z@m3pR`woIwUTFkG+)&!b%MVms^2 z#Lmdca6X8cf$@AWC<%tM?k3uob()M# zaSY5XOpGl&tjr9J0*vPwxO-W-CUG({Gjeh+En(cO%hYQn(k01qO`oANje(hAcO1jy zYT@Z=Tze!K+me~)2{R}$>4E|`+;c<7`S|m3tmng-SeSXw$APNR@WifKCMHH^CRPS! z9%dFU)>a>e)>!t|7Jm^*;s@bxLCxQIy@LUj2VTQn4QHL7{Wsu`&pS99hi4|GS8@BZ_*T6p2OV9%dlCS zV<#KqdPSzrY^J$(+>@MGI?Y&{;+W()+L9Q0bJMKM*Wi~JV_8aw$KJ6S=6bok4?f}k;h@HcxoB>5T_%QY@$WfkS-@AT;m zzL0yN;zA|og)A-E#tv}(62Y*iTIHf_<1K~8j_Ql1Oc!~$uh+MgUF48q69(n>2!Xvk zj6bUwe`zu|ZscNUTh5rMPQ8H5{M$OTrF`74#FU!1i|jA2d; zs8tqGIbZ#j5s&;WMc!K`SFEp?3EXl8jdMh_&evdJBYpvz`@AL$im9c zz{SMO$j;H3#mL0K&B(;W#LUFV&%gv4K8l#sI60iTS%PVjBtv%y&k94P_Au5Z=`4rL z7*?{g%u(g$-1+;XR9BA-MWZ|FahcqaQy?3wg4F=qz`hKL(0eHoZJnxYt+)L2@S z7%zDH)vnV~6(;bIia33KMjER0kAK>bz5EwPM^9H26Y;W7)uWoCxPAcl)kj2EN1F1azD z^<+Hn$9!6y;anZ_d3J`|AcChrUU6q=t#W2(V2HT&kQG!mu(onAcXBZ>YxW6(!~RZVV-zzp|HL@P`OXZ@ zvFsC_I3`9hG|DhG%5rw=bI<2vTxu*dF@TZ5poasL$RZ2wiBEKE(rG-V*_6`wrl9dn z;U&Kd&Mcq^j;vlE!Fs{`f)x|*1$}0A)(bYEIx4cOqne4Gg_nVkiJgfVl-MHsHpDW3 zI(h62tf0Ctvh$Y#SCc+#b1*3HMb7OgWNCa-(l}L6UqHzTNR z6uGXOo3HUMM`Is9|GC`r4DvjU)9t2MH(ugBS8=ZXJQv$}@utZhjYo|6L2cp4!<+mY z`!X8u#tNSoU~QbI*Z9_y^<2rh%5z1`=So=xI0eD3ywO|A$ipbe#=^+Lzyb=f$ZMMd zSXxaO1sOOQ}hpHyaxZgJl>PB46}YoJ%{G+<4Qf@v{60Kh?%Ay*A#)7DXO5 zHg&Dh>@3tPlSQ7!-KKYfuYltL4}1Cl%Auwe{wRm zDzmhBv+s{#+wadbTY{;FpQ+22p@V~=Ct08=0Td}w4pY22FGeY{yo_nwEqKvI@S-ap zs3#NUvsa&iHCUd3Au3?6oQ5QK<6MWvx#4Dt(w{6E5Bpv;kx-Q65dLM+c-pt|R#aoB zA^S!Bi*j$Q-tb=ZZ`_~v&YAO<6WE-By#@@w*g!cas(gm>WtI0K?_(7tC7y^iZjS`D zPNN#X$TIY(F?>j5U}t>A!Z_QBv9Z;YfrWt$l%Asc_G))pbVdEFX}lqS*~L((v4Nwp zfe|b<^9xtwc3+mub}ZWLjg57abl(SpA|`4{;}mCx#-*YRtPGds884eK{?B0m=@DmO zh+22BMzX7j^;#tBwLD=VPC+Soo@<%R%-7O5u2u3ht}?lt3O4%KaXoQ?Yx&p8B(KF^ zt9q=~nG5#I#l|Uaj7vE|$tLRRnSfiC%uKg@M7hMJnA!Mm`QP%o<=D7h?n?eGTTrw?JTQ;D!EdwtDH{&A%u<4)PmmYKM)Vf=H4^;i`C~KS!9@>r$Ze?U>Q(at1%wd zW?*LcEx_=bmw}&=fq{>KpGkn>hY`aMa|V9KjudDm+>yw1(2ik8G6N?A9|JQJH)lH! z%d$A8)-r~Lg$#$i81{QJFf-0zV476Q&=|uoEkl& zag9LZ-15ewDzC!NWrK>B=&I#zOr0W(O)(6Y%o(m0FkTF0xER84-jbPtv8jrInen_6 z!+A%h^9~Hn8K4{PmnZn-era%JLWU}I>_VAyZKu-}k@m64g@c^<>VYL;#}h9(`x zbBc_uENs0Dj90T5&O0-;)qp0QKt*8m)y5`4#S))KJaZ#PbH1m)NmoOGh85`Lcu4pke@h~zlo_A&b zB*SpomGPbs^ZrbRqpS>S3~>yX^%yQjGPbHPFtc1%V`5-9SI*QLz;G^z;aoUVn+5|b z6Datd8P3}=o)2fZ5x{oQk#VXI!!0}JP7Q|3@yuObj4gZ&mm(P(IT^25Ffg;6H)pz_ z$H>CoB*w@MZlAG(2KCOHFfuT)F|aV4_hdNl0rE;r?n`D+-!Mj|u{(=#Ju_pk9n)MJ z)qY`yc6N?NQ?531$<1jzOG<^OhA_002a7Q<#LQ`&6xFytv9YPHv6+|qT0lAftihoiH!-=4dG*CXXIsLV&q_AVB`cfKx4LUN?;J6J0vE_)JZ*W5OiT={3=D1M3~d#x+zf179R;9(eL6k{= z5i}Ue3M$xRb~QF>vvo-@%#7q~=V4yU!9T&7d5ShG1M4C#wk8|lCC)5eN=#kK!ad2L zUQVpuUhl>Qe2ohvJ56}RFNa?ClG9aTSoayGEbPn-6752)49-#v46!zcG#L09 z1sRkWG#MlqWXIQ3IPqPfeNcw zyT%?(_9={vQy6$V6B+swncK5PmdG&A&j!`GvE^qn8~ZaF`(uS0`@9r*sz|3%-iQzma!+9=-^V|$9jIB0| zObq8Lm>C$()iYhq1C>RVjLfX<91It27%w`4<|bI$#TZVhF`iOqxSYXwIg{aX3d7}G zmU~JJObpj08Loq7T9}!;B0zNjDXpN z&cndW&IIb=#Wk&0W2|9rQUaH3ObkrCoknb+0ef}^Hm0^T@S;3c#)B$$}4%QClf-&0||>2j_R)R2q2@R#p_A=jBCL=1IH^HH?jM43`2J&#E(=_hRfcV>r*qxG0BVOEq=ETghPCO;O)(72 zjF$o!E|@Z2ieNnN%W>I?;ankes~N+&I>xpfhV%A}=dBn|=rdfjVz_9{aM6nSlqT~% z1*Wbj24==v$)HRb_wi`}LsJ~<w~`o`881gNU5;Wn6U}g4is8C6!*wyH$t6tpgc+_>FkGo+Y|UhRo5aA( za5tIZnG8cu9CPEgTE@mW=8HZ|XQUaJ7|+TufYw7YFf%r(gT^{c8JfiySQ(ndncEW> z&Xq8pD`hy%1{w`uXwG74E@eFL%)kn&_n8>D7|(|@p7&x9U^p$xc$$add?@32KL!@Y z)545Q45#@(HAsBSuPC_*cN^D^r#Vkgp0q_(Mp z8aoN~Q<+%W1sS-Q+u4}fxfxj57#LZYxmlPQ+J%@{Sy(`2b3)P97~Zx51|~)(rcMTi zj%o&B#!fcoj$+1+BF0X3CN@wHgMo#Cmj%2cAffb27~`}UwrREUb6i+kgPEpygBrdG z8}`NsoU(2FBGC9-kfW{Sl+8u;TXvoL7nNDKFDgi}bn1Yru7tyTvpS`2Mf0#-lkpQ>;@T)Y3}0IK!2>EfX~MnsB|b$F%XC_eG_P(iasj8eY_B?9pkw>))2e zemU+#%`Z(*#!7fLm6M_IbP0nnLzfgos|(m2A7=QmUG_T@-&TG(>T>Aax-QK#>Fvxc zmy>?_{Pg9zoZ6NLGCz^|kPC<88Slm&7L7Z6+e$Bc$-Jp(+?m+U*_Lsp22_Y83e5;- z5@l&CV&GtCXJu-uV{WTwZWrNUW@2OGW@xKmX{%>yt72&9XKEKWY&`{__)Qc( zWY56M$igVV!oW49f}zWkQIMf4gt5yXG&9Z2%+giB(v`~4<;L6<$-u_J#L^YV$OB4f ziIRWII9BEHuFU6|UBfb&m3JyDs8C3Zm>GrG`>lf4S&av3uTO+IP$ji`K!_b+? z!p^|S)EULn8PC`m!PprLs=GnyJhAq_EpuBDD+_O*DN~;~12faKC{RhAxO|cS^R!3m zH$v`-GTr02$9%VroB4+Ojf7604x?Amjpw*tM?Xw?m<={#&#gqpSJ4cQbQtzpUJSbGjKA2`Ur_1?x`@aGCcDHCC9|Cs~MS@n>60l zysLd#^uqq5!$-$Pm9#H5&Wa2SNgS<#43~8nF8VV!$uP1oG|PYry*SV`HZ#+0Io5-M z4EF?>K;w=%nY|G8E#cEcJeXY69lyrTC5nF%NUx=8IN!>Un^m1;b1sd4<3SP zH31dotd*)gF%3Sm6?@^AG97IDPX-ON234(6Qdv_186Fcfr*iwfro*cv&n~n zoq>;$fr%Y#X~sWMP%cTT?9@FUz*3@}w2r$>&P=&lRhj zbK+rQIhPJ4gEX}~ra4wYLTofZ8!+CDT^Gpoq3PE*G62rM_uxk!BP7Q3DoZoma zqw!vTAWNxR~z4njPu+g=TboF zEt$Q~f}u@}p-q)tf<;!a&4~>>#hT2$wSa+#K@c?3z|a=K(&jDPmcS&+AO|X-k|i43 z9YrU5f=ZBN!!N0C3p;Xo8#_H3J7d38(RO* zo1yWNF~dbI21AC6ppo&5W?)ye@2$Eh%X?9vvCE+GO7y81)rw5+fP$MjP_Ee3FI-;yf7sJ&Q+saM_T=WDBFP|zc!_9h8?V{jC4hhaq1@I(i z^3K1q%>Tj}I>SJ@Kl#9n*v6M4jZ-<5rMfuo@m}FzxgvZyM}heY_vNU|>3oelm>PF* zUSS9pXJAOadMNU8`V}@ofy>pbm(!TPFnnR>y`0+k+^q4r?LnSNUX62Q8Yh`|rC&~$ zxLX0LcfCdDz#^JQe>nCAgX<|#&v-I0y$;TJ?N=v~*oF7eIco9(xtIjJD^DYkPI890U7 zIT(7g8GGYEc_hW*1Oo#%qa>(=Pq9C%$IZcIzeI!GRB~39 zgHz+SW@}k%DM#ZuuFvA2`ah+8el$ZH3p=Px04)yVV_;>LW|m`YlVxaQVFp+KDfMS{ znfRGHYM47?7&=2iB@`1o8#eiusNhaH zzSN$n#ekv3mXU{{MT@yblaYbBMT4=$6712F*MeA?8JIzsQHYThZ0qHJ%$yTUK-n(k z!SblaZ8eSCN}q`^U5IMjR@>MwwxXQ#y2Ew*XR<7yl#%jbc{BqHLvscrGZPmZCu36- zYg05wQxr>+8Z$EkxQCMR{#FKahcZjQ8Z!$6XmJ}GXk{H!s}Ca!6KGbNg^`nCg&yN# zRnU|l12f1|sa%a+;2e}H{WR#KJ#*t4jc)!mwahG^#52EYH5oeBGccrTzK~-0V$ZY zY6UYh%L!&iPR5HW3>PICm>KvPK>KkxnQmn<+$v^hD`34`!@$CDg_+@U83P+5JL6e) zrt4Nr7hD-`OE8>|WoR{IxW~f81d2k2P9G*_h7Jt|W~LrLrpE1zEWa$6FV`|KGu+c+ zT;sv;sGQ-OA4B6&ZpIl5jP0O>QoSJzj|3QQOEbJpV{BZ+$%F%s3}coS9*g2ji4# zhKT~&ebF4fkwU#OOfy*dW^hSQG6P3ncjM$ZP^py0)LnfphLh)9I?p*D&U2pULe8b0 zOF5UwbS{Zm@LW7IA4qkYL}RldsD+RwvyGGMA6w&DLH2W19F6mY8sG8@o@YDH%mP-X zy^R-?6Vi11+|P@g7i>Js(s-8fToDJGAUmkKN^_i;1d2pZo12M^iJb|&U?t6Rn;-)_ zPg@=nD;o=_R7i7aY&Kz@V9qqbig6JWYkw^Bv_w!BBQ0{D;6=fUJWLlwIgaNwZg*>3 zXUg`rqH#a(MYfBqjkhBjZ^wdK25DJ`>KUGhF+5Rbyu!}F#=y>Sg@b{Gp|PQaq46p! zC?}?s&8XtIr_rT*h52$7YvUBB#uwJ0Y9_5^jxh@-GZ%APF-uz(sQbs#R=~o_%D~jd z1?umoH5{s8?UG~W08JP&GcmIAiV;BPq11D3H0pkT5h6|1iOiULH zpsU_kK>Q0v3>>UY9^kP^8wNH8(8!M;12+Q;>v?y^^ERLa$i;Zx0@U9OWjOB#s>t~n zgg9H37|)q8oJ(Y8VNhaF1f|P!fehzd7|umAoy!0O96Xa)C;>bjHJspuJ_xLi4=Yr!X+INHDY+I4dwPr0uLt|eN^I{$LiLszUH+|hUlk?URjj!YyXLF057d+2( zUiv)Wx!Ut0>fnX_>HFVTF?_aW5M5N-=&7H1FxRi5d8wi$@FMKCfj zN`i7>`oG4mP*9cEp2^T5&d_PgFh7i=TbpUIHz;dlNbU4)?DJ{tv*l}C?$x-w(Byn= z-iZGlvV`N|uVi0EJ1_ft^$9!jLB0&7$lhZS@{@2OU6~fp6TDG${@>N$Dqh8 zz{1R+&uqk`&Y%G*#WH4m)e075V8~e3*qG9ILtN-Wm5@B!Mb--y7lj4bFN)pBeB^hV zy>Y*QGZOc^DWn4mUQ(G~TXnJgV?YT}%9meB({E#+$}hSgx>MQ340; zg~M_ZS1d251zice!gYn68C0ZX+?pxDcsYXUaybJh!xag}E36EcD;P}}u2?c$QDcx` z@MYj&;02X_8SiHDT#@Qh=yJVWe1%Exiv1Nfc7-eQqFPtDm_dX8nGB81@ysn2jrNT# zhL_8)xEL}uPG)MHl+EmTIhN^i8V}zU&dViY;1)@y!5lkKd6y}EScO-NC6uMBfQgks zn}LIYpHYRunE~AW&XoAA#IT`?VWT6%basKcC7fL`Aa7<`pD-6P{1EY>RE0wmv=*)- zP_waB2~_fBdd+cQxSq$r%4p5t6s*m_kQsQwhUt2#VB=n)pTSeul$5Ur%Uw^np3Zq) z?Yd>-xq$DY*Hs%Is5EvYYd)@N+^u;%Lh-ugb&u=uZT9zcx{SNnZYs@<`sRDR@OsAe z!s|)b{jXbDfFdum;h!C2NE_e3$>3TI$t)M79M<*UreXTu*k zwiVn~FnJ^P##QRJJwIpQU93!SsNYHX`GXITTbq_>usUi#(n z+eno6NzoI>+t#i*gc#Mp>aYH>VOZeAHHnvfCQq;g14HJwOY*Yvk3)PPB{SW#zNf$~e2 z%#&noEC+=^mc>#(4$enDB9Ag3IS6!mc6xwvYnF54q&YfN808s77y*btc+!2W?^GuW@BPt2PN*TwfF4Um{|lF*q9*v z)r~#rtP3<5dIXu)Sa7Tdj|yZRy=TJ4cB){m{3Nek(d^)bh*{?!f`(YQ8Q*9!G#&5VMz_uOQ_dUHH#WT7t)8HQDqEp7j-iEvu_K3XvIKiu2B`7vEWyB#^>j5G zTayNFqXh#i2Lo%P3~LT+BNty67gK8*a~o*O8#5ylW2Xv3rz&Ho0#j!WXm30dGh-LX zV(_Z2tmhA<7+N_PnHgHjSz3x1*ciE)E=e(-(`0DQWok}i2DR{+80Rao&T(aKGGT7? zVQ%DMVqn@5z_6K9Y%>oi?z3G_I5S@_yk2&Z`?dqqZP(ilS8bg=85pty7PD})>M^yb zF*T<#w!1K#4`gVJVrbG~X!c;~vSYf&#InngWs(v@2Oq-;ZpIc4rt4myHuAX$#?~~3 z^O_9jH5kupGG1e1I3LZx%y^THiJg&|sWS)Ev^QnAqQ`K>nBj^MW0xGqX;#k85QgRq zrZyFZ76rxwwhZUh7*5nPwfiu(<$=_kjb>oxS{u%ADTv`hHDhZT!+96Rql^r*9T?U| zGCs6nIIqrdUX5|CBEu1RrrQCGtvQTsF$~P$X&DX%cD94^3|EXey5yXN85ptyFR3tf zdVo3)EbVnnZ5fQMexh@@wLym&Ffuc+Fm$@Gw%0NBScpwAW?*LMOJbPp04h?mgZ|~Q zOlA~c>BG`v%-WsA)>>iDAT`mOg_UEXAOGx3a7g~0;sqZspjo*JWmA zYSdz8V_{}uWn^P#=V&TpU}cbI?amvYcRKIb)F#u^CJk0!vC)8`aj6wUzsF$Id1|gVRCvp!x==Fq!~FF1sFvcMHuuMIl$swo0Aw?Vwt2Eq?ua`7+X|X*csUv zTD(9dVb1)IoJ^CAz~-)M?8$Fx!jCC{@pP77$9 z=B=qEe=hZ$&$&P)aj<ql zFV;BCu5ns5vy|jH?QW57)pG&oD#1?w+E>qf5&$9}iw>WRedS27CUd|ASuBs zE7Q2tsc~tb0PFeU^Fil}nfbWR=Yg0fv>Q*CH8#r|bDs|vQ*V5t*Eq$P15_sGuA0Wj ztj@s7B+LY^J9Ag>b7Np*V`TsjzvV7z>?vbdSIxZ+JoKNteV^||`Nqo?jZKzf7i%xZ z@L%M<0A4VYduU%GD81$$nZ_$AqJ7awN${dO@5LNYOy!>6m&9~2l<%UOzJjFMMQ1~; zi{L5Y+|*}K zu#2V_r7p^Ya&Yd?skID(49uKN!tEjqZM6(-VT@8>-~2gj&(LYeq|emFCIN}Ye~pus zm^TG7c2u&muyn+*F5_cj05$gV()9mD($Ql0sMHuV}C8GJY)QW!D|&-Rltu4`?F|pX z8=5x+uGfNcN8YMA$qc-~nhXqi>rRy1aK9lVEFpG7yz!ht|4Z#~qH@JmwFx+6hULd7*FTL09B2$-8m!Q-Q_3LFf1m$}2PGx|yP~Mvb zGECx35};(8cjH6`Gc#Y89iun{2NQULE$?PyLngxvErywjj8g>y7d4;@epg&I0EuIvK79ir%gSC4qdQv(*f@ zGZ|Px8>Ws4FieSJ_^-{Z1xkbYa_2-?@9^Idxx>%Xcr)UkW=Bm&E-2gPYcAkaVwb#~ zC4bxWcF65yCgsMPb$@FGrEgo`E@IIad0WwVvaq%0YEefJD3J1<&v7xl$qMFXV9577 zTiVGabT9i}n%KSCdvRCPt|;CM2FpZUvb-1Acqs01Wv9mTYUX<($|mxs5HBw=8c3H10JQeaxr%DD_d*qkQg1MeQ-|!Cd^xG9pZmo=k zGP5uUGO;l*GjOr+v#>D=GPTt(vokO;fzEQ`X6o~1=<{OaWRhU!2PL8W%Z)7_tkX3a zn5Fw=8J8(>O$q@ywLs*a`?JC~R$On~-x$5IW`7g%#=mj4U*qiXHx8gMDbQHW!``I8 z$iU6Y+i1noD8!^HR%H-n0B!RHEgoZLU}KPG z;$r}@h1r|q*qf3-v00$g*vlt3p_FlM3R6!$GXtm^D~Nib%se5kU+`<-S1%UUMxJky zQs0Gi=f})91%*#Rc550-ix_Kj8Y7Efs}X4YnTeH|jjL6R4Kx`9n&)F@W@TYx}*V6ALTT5 z7BWtEV3^3rx?P;{umj@~d6u>^h6z=S-CXQb9T|IKnWy^+G|4b+S7hwvU|35_}rw$t7DfqmvgtKveT;qIC zS&56m7md2OIx8K!g-z2bW%fbFeW zv+fk-##N4>yjAEn2i&GBv^reP)(Kj0!NkDDqzUp+q4if+rapbfjX^9exuBj-q34{e z#`8tr?QiJbFuUR1c!A-&ePh2xV}G=QDk%C3!{(GQG`4-5EI02VILXe=uSbF&XCGkcQ*8v|351XrV( zvlatG;qprn+%%Gw7!nJ>7*(NeD zO^9HcU@f*LnR`hIZ+|}L$_R#qnw)EeI5q^cOv++dn9aH{hhd2$1GtDUQhK4%=(jy+ zUe#6iMz`dLHVet`v`NF7&F_SoIi!k7Xxoso%1;7d%N;>NhcF1dWvQ*R%Yu@U}^SaIVaC} znTg?|DZ@n*&K46UPDW;iljRI2YZ%U3GJuW%F=se$!@$nelEKiL!_ZpHz{7YhpOJ;( zTm}OtBLgEZ!?|dNb1@9(5*f~AFtRhX7BRCh@G^3MwurehocCa0WpAruUdcTU1)x>=priE;8BNjXR{!SP*jNLyy4c_d8xsrb zmCP$eS1Q}w8Xux3HD2|rUglGM1|`K8lK_a+z6cCF&7)nZLT@Aa6QLz<#K^L{mBW@-_U+ z^5Y!k3_!I(@ugi(48jZ|jDk$83}OuIpk^vq{%T`GF{o@UelSU| z@jKH>>A#+hQ@t9ehW@SjTPY%ZLHVQ(*y6X7v>BKf8gIJ=OEWMOfBvccMP8h>u}7q_ zNAzRBN7pYJUo<%{CSJ^7XK!5L*Z9l$V%)`4mWxSzH->z3JNQ6>SYkhy@rKO}#~W@} zv#v4TskoE+y=Hp+bTg1|N`dGY%#1=z;0|VqPvcY_wuR+P z3o1d0q$IYn)vfU&KXc;+w|PO0J~AaHmcPvdd%JG2CL;qAD?9i!rIN}^HB8J5?2Mf%jGdayObqM{>8h!nsJCVPhHCH`8ycz6x%fowLJ#PgUar#m2iTjd$glAIpLF z(v&P-THUxa<2>gx(`Kh;XZB|Xte~7*vSEcFPa79wlPgz~3rmv#XxU%M+S^);ER3uS z+)Qmr3@i+wU6_%KT`mk=)=aF7pz|r&7+Sp;Sy`FEfwSeOD$7<5o@Noo1&qw|^_d&l z!LGU7*jv?ju=0!A7ws=P>`b4uzsWQn$-V{7?IjPUsXb#l7TjgjlJuRW@kn;#Cy&PI ziH~DJ3)4$k78nX|)@Pi^!PqCnG+&l!z6{5VVg_c0t~mZyao$!L&>T4fD@&Uk3mXG7 zsPJNGFJT8Q(r0PQXYJKtWMJ#@0G*Xn@@6|9BLmMY1;#EBQ0dIjCBOzci-M_BgSp*? zxh;x;nc-z1!+R-)4ja}T`OI@|Ii}Pz_c1WcQs7)F%fQUsQX|t-#mvCmDZ{|b-o?Sh z%-$u&$jscu$IvOn*r~?cZo~LMpMe>4)Jw^S|7i@3;tY*!tQtJJ9Nh+7-C``=;-V9h z8D^`n&b4QouEab^nz^@ziJ5siBV%_2;}mADE*`e2GOQCS7$#IQPpDv@7tb*<6qKAw zyVm-g4ZRiDxH)1%Y2!WJ4?K4`cW{DIW$E0WFy2-f&OQlH8^z zmY>(y>Mk_FlnJsVqIAb3d)5mk+!yqjxi8o;vtQ6`ys6RHQGdZ2l;KN{PqJWW{4T)Q z_+FNYf#G5pXh9JJGXp26x+=YXMEfcu^Oce-)s45k8ryuYR9>mLQhBA|NYV;$i8OVg#LF#mm3}YWK4-GqAF@n=ymS(=zt|{3<;qd=pJs z8nZy5TIRDttnqZ%BE^YDXM@lBHEvgZ8M05z*`I--ENo>t!^Ri%7#er!Gj(Tx zPJ%h_#ci|MSl^B8XDGPIR2+?Qa!BnS%LGKN+KhR1pgkBu2$ zr7%1LpY~B!{52ai7*dw@SBs&!hP}s)WkMD!6KhW@Hv@AErvL{tgCK(l17{yQ(@OA8 z__8puTybJPSAMSOT=BUwP$Q}AN52UJ=yW7zCT><9MovZsnKmT`c4r|5 zhO+P5Wk4%Vcz7AvSlgKx*cezr)0eEgjLa-T4BU*JN{pS7tesqp%%G%P&hsltaB3NA zcP?Xh4oi0=sJoSB7zm64T+g|AhLg@v(2i3!yIWCA7k@{Y>_49uVn5X`%57&r1WGBJVz z7Sv;AWoBS&w_)N1Rj=hU8vFP_>9c%&V{2;TZt-UxoX^~!d2zFWi`VkoZRrdXRahsg zGPFrCw)!x4hk;7n^1Umo7#Y}`T)3N^n43J9qCf?A`OZJZ40{Bb?|Cub^Jmz|!>~G- z;cx-#R0W1BnhY#V&2FF*Wg5NMuhcL!&eLV=Qe%CW0k-+g5zDKbZ2?p3p1Jh!wG=e& zGH(0}o_R0-+Y`sqY9YwL(Wb!2#Q@&1Q~rI690O##7Bd4YTbm3cH)zv63+O~7W+o2a zb`Az!25{w4{_lS%XPZ3#VhLsj#tqD%o>qnGq=1_tHxn;7urYD+UeLc_#(Kf|Lcj(4 z3lCnGxp2Ll@e zKMTmjPCihvTT%5llWhSr+k^-fX2tn>jC?G!1R0lbFf5S;rMrsbjjg#)wOQ_4v)?yh z=U~6Dd|%}l!+gD``uFugrEbNoWjs8fc{p|khKk$Q^BH*=*jN}C*_lD>*O(a?Dy}!S z7BTeta<7O2d-}~X-p3xhWEyAMH_p+U#&$ZF_nC9!Bycak(yA?sxf>F~-&e>pF|e`l zG@EcWIq)=bFoU)}G7EGiFoHTj&MFKH6+dr#G4nIo@mGx9O8Go0XJI_Sv6&ddhd zXwK4V0UG=PA56#2*pdfYV8hJ8+-${gK#1XhAR{xw1<-jA6Z{$WS~B#9F?OdjG;%N= zaAIiB2c^JDm+kt@=i^zJna_tXF@u(UR{HNMyWn`ijhUJAf;}5c<1T@ol*VJ_7xb7e zSTeIR-;DTG@T;8jVkIauRAx+bW?|sz^EZ!35Ez(Qy7ZXX z8JJj@Sv$cAyRxvcDTAk%m2t8b(-dB&DJ%?KGN5X&a>BXze^vkL*_oM{+4w*CymaJX zeQE=0Z&l9!6vwci5wuPSRDM)0xn8;_pmBkGi^j8{D=Ce;EuZd1F!v8#^<&BxPV_WD#t4Vrk0*%|bCTFtW0> z<*~9dGJ`hjF|dM~Qk7S?8!)i2wo8Gch>@F<1$6Q{XQu!os5t}LaLLNf$i&=b!XV7R z!oUXFH^(7T11Xd%uQax?^UjLqYe{F~7F=Hjim58C#>vi&o$igjGOM*4_o?48 zW4>eB_|guPva8G&yEEQ5V>nvH(74o?ffLjl*v`SwxLuF|yuPQ(`BTo;+~XyUtL-0q zF|R4xuX<6M*;$N%p(=cZ8b`AkN0S{RGslT+hD#m{XY?7b_%WQT2CW9K0nKurk7YO? z!Eip3sm+Yxf&&990~f;uPlgLN3~Zq2t_ryw3_7fjkqOj3U~2PXozK8AC6aGS1nW#L zP%&Fo)HoHqcdV*^zZX;E1hK|Ps*S(=8dtbq;%qBmX1=Nfim9r3Cv%vY8JJl*%NXuh zGJsEZtXj9&i@9-X!kXGnLnh`$Gs|@r z1}26J{)`s_KpU!<85r0ZI2kUuGh7H`;AiRNVYnp7a7lsTk|yIN35H9;jJ%+NzH0Y7 zOQxlsocn^fIz-qOiZXU6Fmx!g^e3@&>oP_%G{^Hy$!1#;$J3wBFu{U-f*Mz&FQ{a# z+SAyl$kUe0+Lp%6pwOEHTJ%`0v_D8flKm2A;{lb%1Gbq6vH1=sU zb`;*oZ(O8uQk$8biSv^4rJ$RfH^D0*tE(IPG}-s-zq z>pM=&EO+eh7%}hn09C!!Qx*g>a5J*7GBCB)F|=`WgATf6Vq$JBW^c1)=rLmAWN8&) zYUKunW%aak`HWl)OpM$N{Ol6!9Z5_~tSpRzj9e_7+#q+duy&e32L7uTz4K<6FTk}f zj(Jj`&?E)Ub=nN`1wpOf>KiwB9_K!edK~&VPMBThzGI8(<0#R`zK??*`#yHzcpUsV zjODu&L?&h;|$WfJqt_?HG$PnuGNfx0gqC>pGV)Fw_{_XJl$sVw}ar*w~iJz{>C@ zjuF(^d=tyW#MrnrjiGUIGDBla9K%#$M$qnL(21JweHoaTK=(*2$zj|K8dlk$#jw_s z5i|-8QZmnlv2kK712admjKW{zA%PHc7{eahHt72jr}DIjs2wz-x(NIiZC|L z_h;%VVrkQ0{3pZEc($6M@vaohyjq6mybN3njcp8!jcx1<7ZMpRM1huZFno((`j*Ua zlArOC9K$791`w&ta7m7}vy9=YBI8vh26l$dV#d?j42>)07#foqF3B_B@L}xcV7MvC zc$1ysCIiDwMhMB=X2NjC12izt#LV>2jOm6y~PhR05f-C>N(j4dUgVx*>| zu~&wzNkM@@nu)8cPIHDXI5s{$S8U3iSkTYe&(S5_$kBMjyQ#SjRA1Em?yP2LYD{8i zT+7dJu0B|qfuWY6-~W8d`Rwy4=VLiJSkK3uPj0hfzEE@_`9cuah0F^PT&x#TnJ&a! z$i0wpA(Wks{XzgU&xLGG4p7U!R(qB(Q(H9y4+A^stSkmjR!-2`Z$=IVQ3gInVbCIm zT8;fh4E#)>8y#2}LFY9KFiJA>FtanVF@dMZYgPZoff^9CzW-ytMhjonziP!UC~(#E zsuF0dw>EmNGgDh86AuFuGczMED+?nBLpvu!TO9)jYnul<6E6cJD zdiFbhymu1$m>cJaG|rI(k0;gcSdhuc$so!s#?HYc&MpM1I%>C{t7nvAVqz8t4W2WC znl@}qVl1+t60`PfV^HeR)3SQ*T6MjKSf*0F!{ZCnt}!T-2MSWJ-XaUuWXBrYL- z4oQ&P>ZF$`gHEqvVPOm9Qb-K6n zo)ybI%Xn7J`7G~QGRw1q=bX<glDN<+;+yn0Y5dG=tZ$OvWVEEccV~X@v7u~3Df4^q z;;*{4rv=QM3@i*EBN;wMF|5~PXk5q->JrvXe6Do5tZ|do3K8T(Bbu8J_6^JQxHV_WP2D(&i>Z>TZ0g9kY4<~L5XX6bcg2TyLYGw?I0F&Kd7 z1nS-2Gc|U`H!juM#>xCD`BTk8i+PbBtDD0bH@mSk{!(s@1l3^m@sq0frV25(1u?ey zGxb=3PD^D0b#?0_wmUPm2QhGiI=SEjm^y{nr&xg6z^q+7OdVm&ojy$Mpe5$a%-!Gx zIrW8&4eV@9lAxAked}udH+fwZAFIDcH6AkWjAOoPc0RH3C3xj&{gg@7tnGfx%&fhB z%*+hTphQ+bak~p>#d{|QLnkjwrvO`L6;qcTsJI2yF!hrg+oPE`YI8GzR!r8fx$MmJ zLZ|U~_I-;^uP2Nj-R_0li+pbVChtuy^GBa%laKMIgzt--PrPn+A^SoaxG!FRbW#ml zyC0~j%QHm;ls@Z^@2_QKV&-OKWA7|to8kmYR`qwk#etpw^t@z8!WWw_w)frd+c7h- z-!gt&1xk+fpYE_QJga7SR>sg=#{4{-p|P`wp|P`=p;;P~8S4K(k$mrcqOhrjp{a#& z8dHyEkIG4b_d?Fu3=9q2v*bW?MEyogph~3Ql<~d@!%1O=3rV2LfSrMf@n#*vC3D70 zMhwi1Qw*58m>936GPZIsJgxzq&TGItIfkimcP8k(l2#dplhO?56Byfrm@gzVT!>@1 z5YK$GhUt8{nBO}Zh&f7A#CNQuvoGW8ISIx`;I)Z@lTp0r=!?{dGUWV34 z#@0B7a|KMyjOXgvuX->sG4e97Fn~_lKA+EUzJlR=DZ}|320;e!0rm~D?}Y@Jv==I{ zE|g?gCeD=jh=FrIiMS#y%Ss@F^Nf4BDNna*cW7?Gh~Q%AlxgxN@X+ zmiPJU^L6q9=L7&t*47zQ>baYg|aP6k$<&Jre8R&Iu_0H!W)P_Alt+1Tg8)N0Pzn9Vay znt35NW4{X1dIeCjWMp7kY{@iRl)p=heL@{*Dt~1u7aMDL9jIB==yjz2swLM|ldJYu z%}z-6Dql6bsw>Fc_#y;U+BZg@k_Vm1!YIff!63-U%WzYWfs5g$1S3BvQ8s4J4Q+g< zH!HaDa`H`;o4U+5m2OJ61%oQg#)`RtY;6GyoQxc-?2HU7tQ@U*jLfXe?5%7J%$&@i zx~{S8lnR3&cNZHd)iSb!222>3**jtwSs0mF*cq6aK)X&lofw2b$IUQuGqN%8G6*m- zGjKA3&kAj5u20lnPo3)VTA8(S6rvSzONwL3`@Xur!|GWPO&$ z@~rY%#c`L$b;i%qK-EFx*;NvZ3>-~Hj7>}|O*Wt`+IZ#;2dLm`yl`KHrPTn`Jc(mu zW^6WMXo>^Xqm7T&v7KRV>Q!iJcKjfBLbTuHSytl;e$XEG#y68i8JJn8Ni+1@u`beL z=*nQ&6Ux{b!`NfP*lxnq>&MvU0TOKSU}$DyJfh6d8N<|L!`P?6*sB6cca86kvNJDB z<2h)}*lxo#S&D6^3+rKX=6OmC9pJ5xjqe*<1KFk~Doz9U|C^-#CpNy{9T? z>>Dm^3FpBheNC#n?HL*;N-;J*OlN4^p~cj=Lz|)TN(N(Niz>(qO-2VK*qJVQGcjLs zxMY9H0p#5#_qkEbZ9Y=dGT2XqGBoEg?$uy8C#K(lY4 zEXcsjHX#pGgfg~qF)%Z>nlP*qVpt{2z{;>njCH;?LlX}}V*sc=X|ikVW)f}J0Hw61 zk^_>RS&fs08V`gwdo=EmX{+C6{x6g1g5U)KaIdMUyNeB!RM=XxKxwb3bz=ex8#8ET zjhO+oudusG|la)I#+Y9{9J+**SXqrCFg1zZznYNRC6(X zt@t}|3j!CoS-H=b1uHNxG`-qhBF-YwIKigzf%*BY^R?#-grwP68oM~wmNf2=SL1D* zQr2hQ*p}EhzpQb7;rT>vehyBR^Iq*?*KI*{Q#1EpGls@)UWV3mP~?GC;W+_=N; z1^@G!=b4-@c%Em1T+*ztJCsorlpmW_c8AEb>0C&^5F&gb^&*2cC|Nh_?+ynAf3x9a z9qtPT7tEPCE<{|&<~dO}%WqQsUjtAYXtv+&&Tzq!;erL|*i>7F3u+8{pa5%j-yO+! zp_ctZ4W}^o1%J*9P8WPHR9&bBTU$PznL!j3QO#ky-DElq7?>D17}S_8nM4?P7`PbK z8F@e%tvS50FP3YcKf{U)rhaLTxjeyA3=GY!?}HmRN?%IizLd&(DUMV2lK-VJ!TU;$ z8)KO+`LJIKzEp6j@=`>XT9@P>Gn~ltF>3H#IE{lUrjS|<`)6A zo132>6=%Kbe@(#H;$_0i#B019oP1YPu9jX+QUrVW$1DRDDOPy~H6|vo`9F^eF*q>@ zF?cfuG1xM4vVeDfw6Hez#e>>tEu2SnuBP(xi7Q+UQB^Z`da4JSDQFREY%phRt7dvv z%GT8741Rg9g*OpR^gpv9am+NY9l<=^u9Z1UM!`=<5H2sOi-&NuUn zA8NP6Y}Y=-za`nbg=;()b{^aS78YZ9a1&P;|5eoJvo0 zxZ!cb@PgMx)BA;ut2|EGGv73A+@JHzm`O(AW_9EFl*aR^jSmYNJHl`3-Zb*MnGXtz zmh8ESOguNsq`6OtO-i||%6!uqR1e&Y($@fay`}b)ErT0qAZlv~W8?i;#>V$-jEz%$ z85=tSK+Ua|-czPt{+E33)a(;z(mRlPE@`daA4jV@wRd8K?&RKyxs!ay$;w{kyvzA~ za8NBjZz;ek$<2D*=DMwli0++OP&#bca^8?p4HR81I~H=^@!*xa6W+M4VvSzoZD)Zy zUf>nxEk_ozGF;YRxU9=?rvPl!$%RZZ{CCpC1x@7d_}?kIQ+=llY}lK{)r^9mQS_E; z=bafim|1u`KsRJ?GJ}rtnXJn&sg8jSGR@s`>whWp0&%9jB@Fu#8H*VD9l&n*c7;Ly zYsOc5YgREK?)#PZoj^-4TbVA`?h`r6vfQz8cl23~Nq)jCUiQMQ?B4_$uO{BFx?j(B zKa1~y-~&Cj2d1DFWUI{ObOtpBHU@JB4~7Sdpxoc8ytv}N+kM9eT$XC4Qrw_K(yDj4 zhCu;z9S`FJABGi~%zM+AzKJv5k7Rgh1sWW0b-3Zia>1Z+i~kcjaUQNG+HAaylY|z^ zoR^jZIkh$LhR+*|H@yRyx5O|Xi|jZ?fDuZKU&l6x=po>f@-St;jpF=-uZ zA<&*k4hDwSWh+t{Ss9uN7@ApGxEPx1IG7+C$y=A-5djrmtsC#FF^V#9GjK5oF|aW( zgOYpe-urS=;(`l37P>QYaY*xUyaMm`X+6727IcU+OOpXRt1~|XL+k1LN=yt)tyT=J z#w@K0;GQ)LBOfCN13#l6gB$}tWZc{Z6Os_ea*c)dUtnd|NWn-Ui19D#*+Zt;ICeV%?R(94#F(&Y7xNR&?)Ig&F zOiTMR{C}^soO?NFDR}&~%w#YFYlV@zrV!ZCgzzn)1quqevQW_I8Q3pp`647fKl}R4`m91a%=~KuhY{ zbe?N5HbpXQvSVBu$Lukl;$MILTh4k1qP4ym>| zlg-(f8Q57EASFbaI^Sk42uvaNV;8k zZULz6*DkS8f|;8YH2KTH#mU6N%*)IQn$~X@JfFuP&L+vA!Jx^+&L{wGew#3xGRiQ5 zR~s`LFbFd6GAJ_YFtIW6GO{xAG75vPr(%$0VgpSHwfijLIO{VhK|qv~{ek=giKo?1 zvmOXOka{5hK#g6Fo0sE({R15pP||8oy`u5J`$5oyzy|?}osykO`~vJ31s0Tmikg{#f?0nwj}yT~h$-O1+iFO`%O;O})9y!oy zAVm!Q9t>v;neRt2T+L*-3d;BAs~NB7G4e266lb^y>M8RuU6f{IW4b5=6=7#!WnyDF z8Ov~~2<*zJEBc@gW{2rZ(DD&x=EgV%Jy6@9X+;71MtO!dIp)3qzF@|V5av~740Cun zI%7rW1~AR_2L)0`_jKvY9G7`7^EEDIYm{kRW`C*nvH+-Q*)jD%;HARLY@AHIJooBO z$u$1az0C5L@2@Z?s43pDdb&7kTZKeh6gv}WCa+`3fjA~k(1Kw`5!NmSX3%6AH+WGZ z4+9eeCnGZlA7hsm0~a&+5X6pkjeVs8>pfX}lNo0zu+Ik%hIL$-Tf=iRt;_MeA?wXL z=9{%lH%o3YI&(5GbUd8L$kMn;f#IAh!(CaXyP%7JxEby$Gu#EQN$dE$P=={-YtRj4 z!MpOzchxvp?`q#w`NuS|va!MVBqwNqx08JdFB2OpHwzm}YcyMz4>KzZD+3D~D|1T- zBNG!lBO4p5V5Gw2}o&dg`L44;@8KCv)-VrBSP!@$Jw zp^)*j8N+95hOb_rHDWBFTfrDVi!)r{W$aI4cxc6NMwanG2*W{RhQ{s^hB=%}jT>~C zXK64qGv4K4xF*eTO@@J)smp@lW+lVp9MIX~jLZxjAcL71ZznS}PBvm{oNUh662kD@ z4qPKViD!NfI`gwdjp2PVV`IAqLt~pU!xzwT7$3t0Pt-HqE@C)e&G68U0km3piVH)R zD=3q8mjBKYY_H)G7U+~_?(_l+H8l2da5mbqHB0GtX0tT9fC}8s`=^=Mn3--d->hQh zI%RjjpB1zhwu_;Qi@m#ov8@a=bqhY5N`R3abZ!Rd&NilYA4XnA4kpm82MjErBW;
k=Fm2CioZc*^JIsj-5QnYodVy~(19(kjEW(}8&tBg2#m25!bF`Jh5$RSLt3=q90go{S6(?HWucW0^bn z7#SEk-58!mF+7b2tt;%3WBlmH_%WD;iK)wpfrW{MfuDhoxzmlMQ-Oh%nVEqJ6eOD( z`|2AbIwS=;Bp5nNgScO8TY6LBtj<~82gZ&4QgiH?*qK^5noXQIUu@glCCJcS!P@7> z%-rbSF2=&mz{1GQ#OB2JV%yd|0-(BtvD1Tzm5HU%k%57osmp*-5VVPnk&U6t&x!fP zwoR`%8+~^=Fip@4;(oDx@-dc=RUZr4xkUM{sj^%XyQb{K^Jj zY-VPMSs^oP)xQg$6rNPkxJ$-~=f$o~^Yqz!q#9kj3pfwBGqe^lw6TEZnLxcN2DWx5 zW(Ftz7rQ6!5e8kp6u`jA4C+lVvvrv;uri4-a)J)1WZ-5LbK-lkYeQpuChIy;rek_c zNA(%jr#HGxQel{5$J$fQa?*u+xhVT`5k>~k8CXG_FLrM^Cd@RljKW)|Mzy#`GFtIamvhX=Ez1Y)xL4koei1Wps8CS}- zhiwmkP{_f{!~G!7N$|y1AEG-_)Of1Yytf0;QER9a!TacKWe3%&+nrv8^ zL24IYsbt_}XJ+guVP*o|$PBtIiIKU{tzC$TnZ31!wUv(nG?v|5yXeRR-V~%Iz z9^IyCF8#VK{L@uH!x#JZHBNM6Xxwkz=-9Z+jiISCA2cD(z#PQ?Vt?nxjK*DFphFq9 zax`vbKUdq-8`3J?)M0zBfazT2xf;+hColFdnjp-`!NAS{+D{3}-powgPAo6>FWA8a zS~JbXh>7a5o?GF~WRapHN|&@efift?Z5 z>*8l?cVHA^;A94^ao}JObz*(l(6mRKk%g_(hk=EK)rsk4L&x6)&L-6$o|g?Xr<*c~ zU8=h*$im5Snd>sA;AI{s?w1YgW;21#U1b6tI>yS}mc_^iYK4ola5%BOY*>3to{@=# znWM{#k-gD{!HM~0!{)|*0p>lXjeaLeg7{uGcAj>7lFJTo&Z$IZH1qD)MU zyR@8mUpCHI=)%APo_GQcjDU}nWNBjot+Z!gbz*thxco{z=r}{r9<-N@3qMpc^~bO` z=Yfpfw5;Hc*d1Bsr+hC%Til-VJmq}K@szj4>3PWWNGGyT>-RHLWPBsk%g&Q4zwVYfs>hmk;#eWWmD^&T84IR zwrMg_GctlWUpB4#$nYbU={)nf3KrJ$j4V#PFPnDs3N?DP2{AITu`@I9wR3<_2TVwhOV&>;hEA2Bd6F>y11?vUYO z;AZX&V-REkO*c=hW|~;V(q+T2Oo3sUA_F@UvlG+HrrqCN8a;Y>gScL{G#t}rzUF$( zOH@Eyi2Itg6UWPz?$f@EpaDH@2GBKPx40Q^@dWX|Y?*f2`xbW_5A$6U7D2YVhIe&X zxwzSRoS0v>EW66a@Su?4TLj3!)mNG3+8@?^P{jKno8>`PN5)frC%%_0J6B3H`gL+K z9IIvMu3=ziXy;;JW?^P&_u_76V`N}%D+6_roOoWgPS~T#)EUIc0N%F80CGBLog)h) zD|1s4$eRDTB7+Qru>rGogw~94uF*Nycu47^6WMX2RAe_{pWB-4-$1pK7HD<6j@-@0P=`k2FE3vkS zv$Uu)%?4e&+M&n7#Lmpv8NtlKEXpXtBn(<~!Ndn@5i@tWF)}+zzHD3ifB_`Ru!xOe z5hGJ84`Zt!Ln{wU3lqaRH->ZGjLkZXi+mX7u`)DTFfcbdGl5ow^cDy%Hsa_vV_lLd zuq}jnS21(9Xb|_yj)r44f-;gqJc8Fk8;`g&9`V2C;>7y0qj$Cl=-w0_P8L=tzLy<6 z$E=w^#i|&n*kF)l6k}&#kOxiSvrds==*)Lwf7#LZk%MKA2uqI&M^h+Ur$6I5eulO7XX8A3STf(8rwjdrtbJL+;L}MVdMzndfB<{g5iaf z#&ybf{RHotvfcIJlMfPj+10Qxv~f$=b;i!X+jfoX-R~xG2%d~P87siAD)6(yiScFE z#D#G|+%LN(FO0ftB5^nLuG?MjyD7^2clGb41@XS@T5!QciJe=PSwQ7({M{r&w!6Mg zY%jYuEs1B~X69sOX5eac0VTe!EmsW~I2jBZJy{vWKq}TX_DeD`vmc6Qm?Fm97{aio zC`j;Sck7anhb9kIAF^@qcBFLV^RY_vnmm+!D6=hVTcs1{%kJq{r5IQlxEZe&FkVe& zkYG?|kYnHq;(FP=xUpZl@hW@cN}=QRT%x=WSsSl%>?m|%ec8S4f;~g06~lvih6i~J z2h2cfyQ{oIZ-=kMd9L%E#?M0=PnbN=-zw52zglp4QDcAX^MoT> zPE0R*H>^}=c%B!;^RjpIN4beyjSIP-C&{cdSZUv`+HRn}O{Z}la}f8-zJ>=POBEU? z3qB8fqBq%ddUdu8*$}0QU3a{n) zSYM007JXH>%x#%F2gfR_4Z%-&UmLNv^0X>*%CwZU3I=h#>|3+Sweh4y<4N16Tu(V) z%Q3yyeyykP#PqVid36E{gA?n^zU>d#8$DWe7!?_%m=vAZUiR(yDZn__hhc6YV`m`a z1g=K6MG`?mFZ;V5g)fjZw> z!!sSmy<7||jJpCsL%%HC42!H77nw4!vozK*GBM2eV(L?7oT$sd#LUUGOoy?@*NO4v z#3_yaT0sIYC$3s&_%*HDpi7yV>6_~}mv5fmJj_^_zZHMWJ7wj>`f}>_Uhzf`2F5l4 zhIRqgb}uKUmlOA_i)Z3+5`8&wcVn}3quWMz20q69Jd(XtOueCvaot>utP+Bf+>K?v zjgc)X27URAjT8MrUGBL)46_m#&-paEZVY6&U(d)8#PxDo_iU+aNzB)xxv!;NOJ!o_ zbYgosZQ6Ix8PAOy3mFQQ|YMGlA7|)A?R)dK#oR?=f4=RVwi!-pYT>GqHniZNJFKz`}5$it!>l6ANp*1H)wvhRf0nmqBw)m(>|A zD>0m5W@uLj#V!*Q^JO`PGpr2PA{re*YmlymGhOpxx)#sC#0a{_>mlg!;9I5)ZG7O~ z_uVkih@TrHGfPJq!_!d4H-4b~5)3aG8Q&%_yvSrcSI&5{hGB;?W3L*+g({}byhex1 z@(k@#4A;UKm>8}_GB7h;3u8K;$k5bsD1>c$g%)oLFDZ*zrHG z(W6OIq*b>utJQ|LH_(aW<+N3e?V^pftr^^19*r4Yx}se=je)hwnvK;HLmDb_QFT0%)KmJM->^EnY%ogm_g?*Fm@U> zI(7Omfd+Xyia?juv$lcyoJ=ogZ~4N~=r=_mNZ{q1*&jU{C+NRmdcpj>hWQB7K5^#P zny}L2zMQl1qXW~?8iqTv4AT^trzx^D*)%$wcVbvC z$~dPUl#>}7xfrgcFeL1SPW0vOhK zGHhmJ*v!s&+l=90KEpK6Mu%x0jJvH^&WJLsVqv*03mPhOU|?q4VZgY;ngMjy9=J)) z%C^XdVVW;vlND&<>!1z$hD65ot_u zVPIlx;b35QVtl!9TH}@OFtUnj`m z!JyMvw#S)mF&iTTV{4fc%gcqEUKTZ$9n)s&@?o9K<;3)I;nv13-p0CVra@dU7j0W< z-Z&v|QTE-c#*^kBjNUQ7tz%+$l7G3lWlgx)j!rgkotz8X--Gl4cyGcmT6uroKh zwJ|U zpUBJ9=O4uNa_NL8)gN4$Klrt3eUAUA@=5)ZQd6Z9)5~SkCg?LUIPtw)I{SGz!)I>B zGKOy+j5&>^7poa|I55xjW?*KRWWv-g!N|<`G@7Y7&x!Tr(z%WOb}S4GUGa_OZDkx& zgoAiqE?f0Oe0F5xn%sU4=7&;Dx72Sb-BM?|rQ*c$a(UyzGQQRd@Z1^i%Vj$+WP?W$ zSsGoK8914_7(4wy7riowGO#hQJF&c6w&RmGbGJ^Td#eV+N}(Xmm&>OvDSzn1!urs; zakD_F~g$z z*S4=s7PBp?cVd3IV#;GK262XWyg~dgSIk^p^^T2$OOR)|+j9R^I;#v>xLG$QZHx@! zdbwidQ+C!5p&tUcSeI!vPG|k#!y3f%a>bUXOdmWy_*dOZwOXK)f!G@v*qIq4*qxZ{m>5`OoaA4wY69zOge^fQX0dgbf)=yjB`U78=aVD>M+bGXO;uclpkbhOk$A!Tgu4H-08*e8q^G6 z=tv0Sdbw&_V|RMv+31#_rvWE@PI^8KZ(N?VtF&F-iRb0&##Jf2t$d7)VGOa%jUJ3! z4LPPUu(UC-bw%+qH@dggFflkWzFa+jkFk^7%he4JJQ!P9m|K{@bB0YhOieZ{%@T~O zOIY?gGcT%PWMDX?4>}qmf`J)y76k({!;T=v^`#7;L2qWpc2Jvync+Y|qvL^mh671K z+%MO3Jn-7BwN0Iw<(=j`l^a=Ca+#Q&m|w10I=O;}fs?_B^W~aZYqQxKB^dOWC#y5G zgs`m=W1KD77&JMUf!Rs)<(esu}pSl*e%AeCYy0e5JP`8%lt}) z^<@l;*%@1z7`MhTtSe+_vS@Uf634V7k%^hHzbc6H<=Ut5OaI-Qn zi!>=ZMZH`*^?5o2GgGq=<1TmR&JdQ)EYPlS1|EjbdQ6{nnL$@BfsVjpX70#h01c@K zFbFd2acFedXqOF`SYGZRTZUV>~Ix zbV!zgh4EkRtp*HRl|dUbzf3_Og2 z49x87gP7O5Gqlt(a4~W-vVe~7Ww;TWw$wA+ zh+$%2x{}Sn!ZwSe(TO>T>*a>lry^Xeyds+{HU-ZTY3!=}P~gP&a>L{`@q&#C?99wn zoJ^p5)n9Iy^i-6Qhl!b`DS?5RnTL^+frX8qfrYin1MFND22Ms!CXf?^8y#BJ8CrFi z*csWKxLXLz^FKyC?f>PKGvf)>c`TR*pum=9D1Lmm52tXMV2! z8p6cF$uZwxzN3@q%Z*dkNrKvZ>~<}zYYmzEbU52U!+#8oK5aap_76u(2oonO2RkPd z10#b_ixM+KV_;K^lmE+&lU{@{%y(g&Z_UKbz{R}MjbVi-BPh(+LCb;|8kty_7?_!C z7?w#eECbcUEX-jHYz(tgnzJ4oGjt_@%x3QlW9%$oWMKfU4iaQwVq|D^U}3z-!FUlg zhsMpo#(Y$Qd5TnsGCpsRuS7=#)2n1F5;5M<_HZr5QFW?*IHWjJcW zc+`+Vh=G@3MIQ5tL3@`}FmewXCL@p9|-$4U%53^I)D3|j?2$!cyM!`#Rq?w8vd9&2!`%#EAJEF~+q9>~!u*^P{4D%Z%6uG5EQ-rQK&sZSHDqC6 zW@_|gb`pNMZN*bP1~vv^#-;)W7G}`GAy!6V22loPW+4VaMh=Fi;6}$L4@NGA=@Jan zWu2H`Zd?7&KyZ;=qf@_akmSql?a#u+PH3HQZgOZ+XAC+w z85&(cJtQV>#zq$gVFtcNC(yQVP_GGe@D=0B?Ry&g1A};9?&y4Jf2igV{~?w`tP|oU z#4@umn=u;&alYI!{gvSyl{x(14cQtOn5?M%ZrQjkz=`$c&aKmvnO9b^uB>i!>eJ$w z%HzcOa_6pRS&gn+jhQBguymv`v@3yDG{bZS1US?9lz@RWu4@%?WIcDo(;LcWryY%Ft55z96g7 zVO=T1+!BV#f~->`*{4P@EzM?|Ai&ZZz|sktK4xKHW^PIV!( zGc$HGF?8BXbvp1d1o6Dwy=9%;cRQnRxs3<&8Yh-6*J+pQ%3BxR*jDzK*NOS%p1yh2 zEDSuL(f>W|>+E^kC7D~Ss9Gj=Q}g^6frDTVVJHB z9u;ljVQiENl6bji(LHWv=GLG+7PI881v4`H75Hu`pwI2QaWG6 zuz``uu(33tv8F9cVykCk(JQ_tuC?loA$u~p_6l)yl}KzVXWGot>^i+z>}pws_f-#^xn$@+9W2(Ai&TV&Alwr3BXgvbMZbpIK3?iW8eHeBL zGVBsyVqlz=%sVTIgP}2kfnley*iIvf9gz$>;u^j73v=!l5@cx3X5e7pXJFVS%dkzR zF_odQYD=>G7LbODIr5D$bL4m!8cP`DLB)y^c;jzlB!dw{V?IL@0|O5O3q!LDgUurI zMxRAy5)4i342=;h_1k1u8nG|U2OSF3=*KT~yMbR#o^B!dJ)qYZ0gdUIW)3S*rU%exItlj2*H zdy88bTbVjDTXLP4-ff&Wi>HU9Gs}tT-MV>8GaIv7Oq|%>t!-MT+Qd9L#<(r9*{$1J zc#cw++AMV^ws-6MkE!rAsW;d3#B~U@h<9cdH{UL4u5@C0w|3pt$i}L64JXETYa8wb zI5o4sTQ>PuBEvE{hGp^$%j9@^yxDs)7!7xjiVOa{pvQ!Y+%g;VDoMmPhI|Dlt>&#eY28QKIjjqd;LEHQpmRm9O zi8J(xG4zSE&s1lg8Nxg>l$n8lW(X5gqf4I#L!TxS69+HT%wUEUQVjjZ4E;t7eYOmJ zHVl2%Y-%jCctsc(RzxtYh-~y>V4ab{FoBO@MJ3D3B!+$&hLwyA5Jq1u`z%(5m3$2S znjACJnPz4%^jk3W+cI-8aI(+LZggQ_SZTws(iTBZ2<4oS$-%&|GKOJgEI%8=${dE3 zxy%d_tkPrvlgtbZt8_q} zznNaFtCX2n=`b;{vw#E@8CEGUtWxA$rNXdEoMDw%qbmc$Dt;yghE)QL49uVjs8zfS z%lH{CNHMJ9Wmv_-$-=OTm0=YN69enYT9#ET467I!RxvdCu?Vp-tc>JdnE=|L&&0sP z(CD;Mm0_g@!=!lDY2Hi>EGsP-RvI&`G-6n3%*?>B(u`}eHN(_uhLtW1D_w=B`7uoM zZ**bcSXsufGM`~(9?Qy1CI*I;c@Q4M%6zt!Wh^W6SwZrJ>?=zeGdWm6xt*DTWkoW> ziZq55>1+%PD+(A^6tb=;V^~qlu%ZY;GBdEPNM~4)#l*l0R>{P`up*U-q0w_i0o#gr z7Le9txfNL)Yz!+*8(laUR%o#>h+p7mosh=4U#~FWNd zXf0$8ZY<(sX%u2;<6vmxWoY9Ol4jVrVaBW`gj)&gcw*l%NaV$K%z))%21^cRnd2E)fXzF@v)Wpc@+>-WTLBqn|r80ePCky zca@oSjVZG@8_SkzF)vYN=yPD`k}?A|z14cl8xyDGF)m2f>}6|=?Y3oTbmy9x*2Frq zwlQ%Q4_m7y(-dw7W&!3ViKQisv#gsvdS#l}vc#HIc$;M#!@5jGIvp5hBy%;VHKul3 zaWs32_S-h5E|O|3pQo#|G@^-pntE$dr*#usYiVmzYXZ+Kr^bRd+18rQ%Er2ByiLjz zE83&_!X##gHpVs@NY9Mo=<^otO={Z2~L9#2SW12IH=5hHmr5 z*k%RAcGkwIi7^cAt_=MGnlnusLuYabP2lF3nai+@r!lxijdcMh!_*pvMlPjxZ>BaK z_RhM-_(mSC$;{1(lSP=9^K-QOvUNl>iO=U_=m}3Cn?*smQKvDjtwO5H zo}nqNF}WjGa$>MXEt%x<<|?~`cao#oW%JWraTgPWlzj-gw|q$R95xRHxR+mNz z;e}Pr#hv~foqk%4K8;CBZ5s=gI;dJSy3gZfSn9(t!%(2#l5qhG=b~)3ZYPGhF$^7+ zf-}Pznp7ED*cco68~tWRFwN2xo#`Un%gfLm$k3hD7}YE;+O5JcK^rt1I=70UQIc^P zH$yv1V_7pBOA8l6HycB@A45Mg!_-)Y$qbFjAq>rl46QK?{R~2L>p6HBI@lSe8Zb<7 zV`y?}Ozz`l@AhM8%3_!k%-15==+?o<;>XkC!#%~HsWXJ3TY{lqoT1&VF|OT;p@)^B z(N$te6~hc^hR#&b%FEtb>DDlYUa!W$UUQZn6^03R3{yfGT2vKU3>&@r^|&T`Gc3wr zm}$+_9?CYwh;>3WOOuCii)LfYVh!c_>WywQG*~)Qcozvbu}lvVpTXM1FuS5Ltj({z zqRqKWfvr8OS5~u6voUP4isZz4-dS3WNo{#jZTZcCi|nNqxiI&ZHm9|kG)Z;JHJ0@l zH@BvDM>Prbi8kg;*D&d+Zp>{ z1%}4RraV@qCh7LV##Ao$CU%h~qsHWBw#JGcZpFTIK8EHPE`~)Oe2d~6Yv!mm<~LQr6=$2t!rYeJBs!;}(R)s=(Ui2th$gKT!6rtAIoVA-3k@2BTdYm18uR*! zn^@Yl8$+hbw5hh+G-t>(2`y1=Oqj@^Hj%wK9(2ByP?PxVT!u-)0&9dCBO0>=Cf7Dr zOekhmVP90m(Wuqv-zd%O+QhIZzp-YqlhR_<#?-}8qTS5Rnaz0`0!@r_G8==IxT#O} z?96XdZf;JP8pGBoYPiI`F`(54+#IHP=FLUjCXL0-4q`Lv8#ARE zt2!i@8y%UteHsglc{1Yo1(>hceqk4-J8lxpy8(rrl2+i>YRV>ZyO-k*oz3z)`IwV?ih2|?Z zXV2H@tZS=gn5NIr;VL~{qA>t;lX{uyME7QgrUI!pX{9NVjRF07>Me4hN_m1NLyrjP!XTHGE>B=v1CdW!$d`fWjqW*42vS!8+n@j*%;&*+Ut!wL>j}p!WH^_7&;Re zI@}rB6d4v~HCD_CZw%@7GU?%NbeI;!&=JnipJHgj)U4d-F1?TU@LtSXO)KtjYlg`jD%+O)T zFp-C$H6K)r&huxOS-~>jm48+k(;`O3r5ubiq#0V+8M=cwr`0jcjAdxdVrZ^nn8@Gg z*=EPpBgNb1&oCv4c}^f>rv!VmGDmw3LuVpGhblvR6ysc##-PQD&e0zhG_^H$rZA*6 zF*PzXursnVGdEVTGD>x@w%2qBH1an|`b-XJNo?Y1Rhe4N+#%Q+*qPcA)*{_3+ni|L z#@t%Q)>7MC;LpI(#H-z0k;EXtAk$b?sO13aRWeF61~jsBYY3_{a5d&Mb0{|XGq5xk zsWYlFh&M;`$;+@OF|akaRy3-!Gc(jRyZdvvv1Y2sHgVWAx;Hs9HS@7WHx@K9OcPO^ z!`ZCUB-PA3*R3UU0!LFopKz;I6K98bb9Yg@OA~8z=`xAttj6eO%MLlaX5Z8fQ-%@kX8|PSXyCrn2Tqyp8o!%Nj*@ur}B9R%K81wr}F~Xzo*Q(ryoK zvfCot&dkwX)SMsKT;7x}*c9iS{$WAWl*ay;2}%s@8K72Rdo5FAJwuZM!(wkXE`~Nk zhDL8DeUMONID;UA7(-(KgE~WFIs-pL3nN1l6GLMtLt`}qCqt78TXQmdlPFVj60ve zY+FlPf?7n_x~p5%o7jr`-OA>eHfpw)w(>MaHA;1egtynUMYiTxv@z&4DY-Y+S#;K_ zGiZUj^UdwSnr*BaO@iWW{7!8=jY4f4O-?g&ngd%n8ig6enphg88moPn8#CKI8ciCj zo0!^^8mlJOwKBIR=kT<8a5c&|i8lr}=QIgPw#YV5VrWe3c4`WkqTCwV#MQ{i-Coh? z!UQ@|e1dwrZDVY6QVVlq-UiNA>*i^)jb_c!jjSE~Z34~Njr{D50*y({fnCN;;>=AM z-QkT@O`44{&CyN1P4dm5jbW`d{K3*~@y)4W^DA40x;Ps1o0FRoO&S>)q8RjB%h{U! zTY^+ue4C?-oAmOUGh6(cJF}X-o8(($niHGKg_@I^7~3K{q+9YPyEZaTU}&zMAXK2j z-I&5J-kj1J))dOnBoxf`VabYxjm>UNKF#9INlTQM7$rB0FY=wDCr*6ro?_o3 z+UnC-*^%3r!@x7&tVN|!rm;|{NubfAIkQoUvB|Nuq{*!@wMA8AMm5uhq$a`S=8P6shFRr}74uyf=6g2g%`|H+Yqw}(TOZ4^GN(guE+c1)FhfgyV|9~D zdtRFxC~KLE)1=bO@fWgjd^ofnydQrIeH|U^ZF&5ROT@>M$fHn(wP|1ST@^)X>Mv` zc$YiFlmvz@`6jV0y~g;N-pq~4T#W%8?EPFktj!hu@-18)0*x8VoOss-H|DMjYRsAy z-DK3_*%&@CrM0@%gR#rKg?WM>6LX95B-h58$svu^P123Qb9DJw82ZIqi_CZz>4`KI zG-fnMFihlU=r&TED%j}LTp&C#kil4bp;DtykG@&6L}TWJ%*MEGJKKq33`^@99j03` z^fNH@3!3mUOble1lF;bXs?9XHmbc%?ndQT>&Q*<_RqY8()7V&M)-gD9e^|18bz^r) zbBaXs3|)!llt%9Ml170=Dgq131e#YCG=?tYNtl}HKeO1vnd8HfmHmyqfxK*!vjeB; zNjI;qX)M^8-&o)LipiuqQQbNC!;+QT8z-qYMmL%_<}?;_HkyeyMl|NMCN#;l@ptBj zPtI@jYA$b%RBFm=jL>dw(rj|=jBb)^VQJ=R<8IY%E^p%LU~l4W%mJ0i*&RVGVy&{g z&E}19pp{n)ZG4Sc&G9WporP`kEusu93>{gGDIM8OLXBzdwXF_K3@z~zP2TNM3{7&W zjj<_B%#8(2k}YyA-1W^FEn4#O?e6WiO`?q!42_!2T^wy`&514P&2`PCO=8U~O~MK+ z&FZZc%~tIR?5(BErl8@-N(N?z7EXp19ftP&MmN?*_a-)`))*$qCbQO{IPqpte&)s$ zkUtxr7{~sdqSHUuSa8fTVWF;Lu+z-7>h=eYzJd7=Z9rm7BxCn8d{}v6^9t z4a3yjCZ;BHhB*~1(rZ9$P9fnq3h8B?~z81SCo~9y(`9_UdO>vCvx{WpcmJH3t&CNw!)eLRf#?ElmT58l7yo6D5l@G%_&BoexSNSY7O`Hl_Vn56E$n?P&55lt zj6DKvx_u6fd6O9%Yi30=Gf8xWF!b6r`c9Qoof6MBovSf+dT?v`G*-1KE{$Ft;W7)W z8dK-jGcdPlwFo!n^z*c^%?NK2ZOUs*UFp-D+fk|CmDw25qs6+UUVdswqgR)R#r$%H zMv2DK$sUb?t)hahV)9eM8CHuhtd?%{?XhdoZs%%@Z7S$un8we**;vKE!J)#?7}x96 zT+n92*l5}&*PhkJ72VwEG1FJN(}uOrsYP;9Rb%Gla)v1?&Bf}1lfxS$r{x)~lWvZl zq}EtFqo|3cQKpG)a(ZKFqq*WN>&C2R9rosE{snTaA#+@t6sCDJ`t{_sSS}W45N*tp zXs(`8#63Z%(R)!mSCgh>W4$OtbN<4b#+>=uyn&55tnCFW#MD?j*jF$&hD_ySXbh5? z6vfQIyo^y$u+ghaNvfZ8Cp0PKtox6jgbj_ zlk}OF_U!7$Z^VTO5QX^S3%EkmQ0Sd$Dxw-LiE=f>pj zG}ej2EFC@!C5-Jd{Cxoottp^3t0MyoL#G>Kr@L5BTBCnYHCu}r?;;k4d8s_DIgK%M z%^0WYGPWfPHCZt zUS)I2yowf?73oYf!y2>u!x@+x3wnb@dXrd<85X-YrY<(vb9w; z2KP8?_KGz|1dB|yX{?_g*_b`Sp@n&BUTgUZ_cng^Ht{JEEuao^?X-x-=tkS-+$IgR zuIk3B9>*r;X?Y!7({dZrrj<0eX3XU_Y%^+1m*(#AVr5{NP|Z3atudv?T7a!FdR|@= z}GDEIbn=5JsYzo=XHrR3-ks~;BKs1#A4vo z7(PK=V1m$;-mGcfa!uk)GsPHsYB}_p6PqOjgBsKN)Oq`T8gm-GBs=_hy7ZdkR|m83 z$To6t_Hi|a_cAj{G%+_PI17JR-q6?BRl9|?NuoueS-!g_zcI8aV`(*K^9+lEZcn); z6NBae$sV~T*0V{Cwaph8xYnsQhP3-M1~gC7Z}jcqY*K5_ZnmGYjIUAEnft@CT{9bd z)tV>g2eiyDx9zcFp6Q&~BGDMsyn~T_8Vg(V{o=wYib=gGuAqW$>GHlf^9 z?9X;C{;+K8mc}VOjg@V(jk!%lt=Vk?Oijj3EG@+hRc$)WPR*@8ZHi5bO+^gujma%4 zjaBwdV$G?|8BK;Ql5Iwf5pBkx)nHnU5smqckC>% z;%ZlI%xVc~%x+RvYD{ZPZxU|dZ?b6uP2M%BGc>w1Ml^}5hBW3d$hSr`dbFqtHt{x= zF!boR>P_@+)o*SwZkK5;YL{(HX3%D6Ok|qF!O~jRXd&2W$A+qNu>o9Kq0}!qA?|(52EG(w^2F+Qh)nA<`z&#NH;{n8m=;DAC*>))dyF z+sx7)+g7aBT-U_XT-zMj8Zf!CHLy)KZkK4g#pKHlZNUkQ3UQ2yT!$7hHnC056=+su zWNS8J=WDiXbYN`uU}S6dYGPx3lf@warjUX2tx%%_|67@)#=J)jGZ-7ym>3&1x|led z!r3@m_!?sv8!KA`85>g@s~H<3dn4pqjG7oYo2$4uTUgrj8Jp~wn3}vAec79onj{&U z+)lR{Et!vC?Y^!ao zW9(39ZmnXRVBDg@INPzclCf2%F^aK`MUrtsumEF+c@raJ8+)TGV@m=HQ>!5dW4oXj zV~2GUC*$g} z9rcabjO~t1GK}-B8^4Kpw`a;;f8w zq#6qt+nk!~7`x*c8N2hEgcv6VwlOl!NN-GMoTJfMz&J5Xf^kMsb2{TxS9!+vsMbiv zIR+qq#&9vtWM~XwoR}iQ*yh!k#N25s%hYGz{<<0NKQ#+gcuv5f5n z0*vihjp>Y?{>F?w>dkeGebvn~YZ*J!TfG^l3G*?|^ym;|>~U=^V(b^|5@wtk)0o0I zm$^lfahiH#F5}E(M#i=nHs-cCX2#B<#vI0J+KokwJ>l$({Td96{c1dnlPnt(7^fMu zs4~vXYxHF5*KT5AoaD^UI9H&to^g^}dp2XgZ3`#kT*cOO#-4;GbH;w>#xTZy*ESx; zxhBgv80We+XEM%`X>KiL>|kyzW9*M>F=3n=)|$^aS)z-daXQOfSH`(z-L;I9ts3hX zX9acEGfv=W(qo**F)^2MvQJ|Q<2?E1RoslT`4^TlO;8qLoSZGhI6b`4mvOc-FXOzp z#sbFK+Ki0zk~+&7r^hog&Nkp=oR{6E%{Z@k^7CNECdrmIS-$3~MhCtYP6qxKNk*m? ztzAN(`E~$xJbUeka4|K6F=i7`|eD}RTXns z7#Ep{Fs@ISn#Q!LxOsLa<3@oA+KfxB8*3R?hBa3+F3NB8WL%!uXTrGIZDtAM%B0Rv z#>MPSLW~>r8VeXVaLf^6Twd1PpTxMd+>CK$UTZny2A=j<#*O~n<&4WflOG#HTDTb( z8#eJVu2b&JW?aT0&A76rKag>OOKUCTG65mRRSeCEjH{SC7#J7(H<>Z6R&K6kToBn9 z#<)yQf^m&*8xP}xxYkg{RXoCst980d85iX9F)q_?Zmwrs;n|tNv^cA^igB4qV9HfJA@cl*-Xr5T%FWh%(yl|i*a3SXC~vqgvJD>m0E35jLX@Y zV;Pqu8!)a_WM*8O)EL9KT%fgzabaGED&wlS&M3xp!cD@A3(Fgm7}tqOGA^lZ4rE+d z)nUT8E}@5kah-JwBjY;T<~YWcE-f64Yb}%1p6uVoxI?44--mIBS&IbY4%^A8j9Zxu z7XTsHRoxoLxSPGXm~p#Bml@-B z>qa-m?RL#`co?^PY?5W%;+Dkrv~e-x9MXaX;g1KgRvaT`G+G zbtjfF?ssV6X58;Fi;Z!A-sBj@{iTgLjQcBC8248N@mtE9#(J8WIUlVNrdTaYGV@P z*$iFA!#2!}Cw!O~Pk2tOU_6||%6Qnd(Sz}@LlZaSiI5f+##CX22J)QArdUFQj(E>rnqj?kf882`(Mlqh2Yg1x8t=O2tcv_X2@w7&l5aTiN z#yG~)cI=E7WSb|+FrM~b8NqlgfP?XLNt-g`>AKbs#xqPUa*P*}r|>ggC}~V!yinG| z&v>CSiSgOAO^g>ylUSbj&SSci)tSL~sbqp6(`C+yDU6pTlk}d>>S4U)v`U%rR^;Ro z#%pHHhZ7mECCp)Dyw2Js&3K)sd1DCUbyEq(>ke&k7K+c*u~3uL%d6h@rHWy^a!RK zHdFW+uP{%pV!R^In9X=2zlW9Siit4ejjG;M#w+e}j5j%YqZx0C^$0Uw$rfR}snH(6 zc%`a&f*|8nW-i8?*3DjwSGk!OuX1oQ-n8p1WV|Xc&4lr0&g^K$tNyLkj8{XK7Bb#4 zY~p3SW!hN5c(pDm{b|cu#(Vs%j1Q_-7cf3#6lHwswYZMyA!nmEOzlgBb4%@iM-QZDC`4B0GFg_BK zWqg^`T+VnWvWJcFnMh*<<4YMP#+T{cIgF2td-xciJFzjnlxt08x?j%5_{f=+@rhG& zpAzH!nnn-CXYx%tj8A-eV;JuWx0f+K_hVpu?kU6gQmrwJ@s(wl0OJE$HpWNEUHpuX z(is__4rXtR*%)7&_WuuKY;1|#SkCy3X>JkYJL|f@xOoELKA&hK| z4e5-0jScyX+>H(OjSeb}jogf!jg5wke2tAZjSgImjoyrcjg8@q!i|ktjI51~^^7cy zO{|R$?2S!aj4F*yLLj~cBUfXSU84hYW0NN%b7PY)BV%JzAR~WcQ!pcYV^cB{TVqo$ zh+ER=Akf&%!pPXzEXu^&*et;)(%7ud#N60y+vvdB*z5?Bac2~5Z1!T5Yiv$vbkb~W zVPs-#Y|&-pYiu!SbP#WBv1jCIY>8kJZ)`~eX=5QE3a~Or+moqYb;AwOa_`uK1_(74G=Ytv}`v+r2{tq^d4(uO%m_F|vNhVdni% z%*^tUxzT~;BL^eLM_xvOk7A6nAJstuu8hJTy%|+LCNw(md}3u}|0Kl7_eqLb?2}fb z1Is5zM)ptcj0T?q8XY)3GcwA3=4NF7tj);t*`(1y@UtU}$md{2_RpD&T%U^?9oRqD zGID=mWz_s4*yzCd#hOv>iz}nZmy|{a#xIqOieIW38NbRhGJaKH6#lBz=)m&TjLG1u z4I|svyhaDLucb_4-{cw{G`^WKa(|0sWd4@L$owt8(ZT*(aigQ)cVkA4?{18Y-wPTY zIKLM$ihr+Vl>Q;s=%Dq(h*9`QY@-A7k3vS?A7zZ%KUo_c?0*_II+*<|WMccJ)##x3 z%aD=fS4d+TGB5ndy%r z3)3GJM$SL#j7)zF85#eWFmnGfYYb%kKb_}7h*>8}S1 z<6j?k#=ilL&WwM97@7ZuurmIQVqyFn%OvtQo{{lyDI?S0a%RTARm@C(>l&Sy|1mK# z{$pbj`p3b@@=u1D?VmEEz(1`<2Z4Xqj4c0r7@7VBGIRV3Wn%l6z{vD3gOTfBPNSpn zzj8*F|J;nM{{jI*(gn~}S*O^lJLu}ztgxv@>1k*Bdu2gJ2v zW^8P8U}bJ>b8mEDYHagnWNd8nXJlz?3j!&OVC89SO9Uy*XJT(`D`8@3Y^!5pZER<4 zjAm?X=iy>*Y!~XUWqobT#Q)l=(ZT+;SEGad8!iyx)##x2ma8#??QP=vBBpo3NsXS5 z`e!jVPL{cv#njj(%gor=rPx@<*x04V!PwYk*xbj=*x2dTnatAI>B-30*a>n$X9NRd zV`pr~Iex~*F8`KU9E^>k-f36ijlFgpNXBdv7eohxv`&@QMj>RkeRiy zUky}p_UkaRH1-=YGdK2Iu(37v+cC2@_Pc?!_%Smz_6IVtHTH*qxY3OcjE()V>>Q2# zNsR1`{n;QRN zsj;h=iL0@z43q-8nHV`6yIB}H8oT*enHsw#nOPgVWtn&z zyOkMP8oLdfiy0fcof-pp8oOOVDub998@pq8m>Rp27?~QoQ(0IVyE7S?8@uyBq0(K% zXwukS!oUu?b;&`bu```fzOl20nW=HIa-$1#<76#%md44Z%#4kbZ5bIGCp&;xE^LgA zlYJWF85<|(@Ut{duH|8BoWjM(+&G1=iH)(bN0X7Iu}8bng|V^6kddvi$C#0+vB!#; zwXw&Jk+HGIg^9bd$BmJ@u_uU;v#}?x(LuYh2ej3=SEM_asj<_IfupfYhLOFoOO=tW zu}innm7{U8a5Be-1zY!l{L(x%ma(yirA>^nv4`!T591f3_9OC)jm@S_f{cyLM$Nxt Q85>&yCLG~sY@DbB0H(;tw*UYD literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..22a27e4ddbe26664c57f778a864b6872f6c2ba03 GIT binary patch literal 157 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..53c534b7fecfd84e465c8943fe3adf500a4444f4 GIT binary patch literal 193 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY*)9BicPk;tzg!q5^X z$j}nrT*t6SW_C0~i#-EFiybR_iw6T^OAsT&9w`RK7B>dQmVoBDnG7vXY>X`~Objiy oj0}6Exfxp=96A5X?vY`9Z!G=Zh>?NuJ+Cw;BLl;GmPQsH0P(FjU;qFB literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b95045b400a77419292cab245f9f66f6298dbb5d GIT binary patch literal 44086 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

Pu(r%VFqC7VAr5U}s`x<#1$85PlTH z#-ggh&BwwL$d!=3Mc`z4tNnqHgNX}O=5jW!l4$I#?M`;&O(>oe&(ssoI)#sEY81;v zZEdEy-Y<7VOBCP_-tWftitwm4kzcm6@5FnSp_ek<*bq zq5QEB8-s`xBY0SsgCmeHVf7Y~mD01U-U>C&%5I#M^_KmlcH=gKH}zYYdUB7XH7>1o zWx^RUh`WS)@{$dzzoP5xVxx5jUc8oTo68ojk@?9rUf zdpjXeFyUFZPcPrZ@VbVr5$|#-PjE=*ZP*#In4QrBR-#M?rjU6vw(m<}Mk=sai~`%52nGCHW z?9)`(rilwr4rkizB)QyFRD!vUk#(6C?q*k`~vGl5}+ zB;%Ge=JsgjMmdIcn*2+x7&|!_7YH*fGhk1BKzZ5 zSp{V?W(H97b8)b;u&_v}F*AtCF)^s>3CjfXBz|4Xw6v@#x=Zem!EVvrBB!EHMIE)> zQoE5MP%MdUi_B_{@0E?~EE@axmsc(2?{ICl?@U>dyF6t^WaDzF?T$ORcj+HanP=J9 z;?+1yaC1!{XOjHJnrC9qM46w7JribrCbHc(kUL3hqGscAw`Y>iBpMe4H!cV|V0pme zu;a(bEJuMP^L`ulR!4?;N({@~Sr=t7H-<6Hl>n8on-Z9&sxvGwWN33?m{Y*quEI2> zlHJ9TImvc&2?H|=lOt1-(^Cm{wm|Nrv>A%ilp33h8kZQa@tJShlQSuOZhCXTd=5v> zq~i8mrY z%}k9Gtrw>DDlEuqY!ztS;66FakuPb%q%?*WErxam#z~wEeSu8#jF=P{I;vQfhcdVM zFi%xunykmLTAOitfFo1V{FOG+435l6i=TRm$uKhnN+%ua6=~ea*Vr7qF}_)Prd>u` z<{GabHjTSO=P9*XHZIC&T$k9mE}?O`=G3ZHiH&=B8Yeo=s9Vpx#H`D$S9Y7QBWKe6 zX|7Do+Kq6 zI=5&wP8Iv%zqZ(sJL%8#V1^k943nxEI-D72gfn!+v8)nf++N5sEsbfi8cQRaBV#hh zCO=2UWQM2tfjr4li|ytLH!c!uoZ#6U*v2-IeVY58n4ZX`k&Ud5D#;q{`i%407-n!X zZ*XCnSHU((oMC1(QzI8kqaMR_1;&}443m|a76~wRg)kh>Wau+unC8IHmdnsl&oarB zV@eUjgeb;o%nVJM3>}5cGprbw7%{UmtY>CgSHZGRo}o95X@eQV(o&Xw7sjQjj%>+x zhXXa6vY9#=*m^t!re-rVr8}}GYd&LXKC&{Lk&S7ABl9#ChAtC^<&g}%JdDc(nb#SxPf}rIXPBPMxU7_Q zf)qoeI8&o2%Z50{epkkR9Y!&hHKB}a!Wa%%GIRtn^ae4tRkCiBU|?Z7n8?tS!PLmb zFgJ;90RzJvQ^whWj5}BuSXh{uXUj6K2xe&GU^~viIiWg>$w)!+am6 zW-Ep{1x#!#-PWvI(j5hpZyl}|?(&!GVBzfYmh144>f+#HVCr$^@04Qhif8JrVVRuC z)27GOq`=)R#ylyVvC+^`BKhdEaBePMAtnX^5zz298wWohA0Md2$;ks6_~u~Yl%0FG`5>Jwws;t>~cE9(zr;sagk0S zf6C71>Ay=iraaGW+*ox|yhDDKrW7*tcrbLRF?L3>b_OtZ z3p1_rXI(4c$ddB;1rsL+Xnre@Csk;Xd}DXc1;+~xhtdzFHO{R(E^#gHQ0k$S)76gr zsj4eWSl4Sat=D4cm1mn!$~cvaVSPGd4O5dP!|k}|NL4x# z$h&?3RwR?66@!ah5lq0vIP*Taz|RriH5CkGRQs8k?VYUrl)YxXa_Zb&q)vu#{w z)3}nkaV1mZ{@NxfN7mG&USEb8QcSZsSH_L$Ix!hyf=}#vw&f9Vjyqogw2lE^&1anys~^{u}^ZJMB~oz#+_k} zD@7YuirkUjZtBRKI)5=6Lu0ocL*q2gK;G0P6CL`B8}~XjZf9@Y&eqtY-q@q|l64{1 zN9V?!R*kc2+ie^JQg`-5G0*m5ZVP8_31^*Z#oSrMJ|mx_+lg^jD$~RahB>|ry-^H{ zSs0p>nOfBu%$XM|vP?H)=;vjc62QLNmwCDf>tspB8F>ud^~?($7+TG_nq(MSxLDSj zGfop=m?yx}Y|S`9lV=hiW0yC}TwC^LKZXfqtlA8n1&nQ8ES>3`jW&#PL>YVJS?9YZ}D;ql(8#6mIk1!JxGXo0)GZzOh0}Cr73j-57FC&L2 z6AuGBg8&mJvtYX@OS_ml3ljsczEGnLs{)IVqhRXxz2S{qomx_@QCf}M44q06GvZm> zESaWONOVdtw%ahYJ2G|~@^qVUPG;q93E>XnYIk&$PTldMn3Ic(Ls&{)4m5HmAjHlA z>KyX$DJX#kQ5YF`1$YG<Z z_ZEZ32|A7Q#T(~~HTFh3ilm!NFJhQ3&(a>oG|!Bwo0)M!7{erWrfJnoGh$eJEE%SA zFsxB$XtrS4z`(lJn`xd1!>mGvxe3gZf|+LKIkKgDYzSdyXJg<3%@VLUvZgz}N@itY zWnp39;tS+X&+RL2+`-d$)N_)~4V!7zO}Ss3zSw`U`(p0MmR>j8j$yeht>Fn(0ef<5Kr&xs7{_zLb9{Yuu2$yULL>ecJ?o25Fvt zd#)x%hB+w=6XhAE6frdEF}OIgrf=Sm%gD;a#lgbJ>ByA6<+U8IKp=PejSZ(;o^uyLiqS8hl4^rxK$Y<+P|%`uFN0vPAzGfWfaT4d+QlKyf-IvXdC z5)-c@Q~IaZj@$x){28o^TpK3|H6E?pA~1)K>16)NqOU$*t#>OnZis4J$lkb+t#LuN zBWH%#^lF9dsjFOGqObpzz++xfuikv)L3L-q5 z9IQ<2EIgddENsHO{0c0>984m-tUOGtOfpQ&ETT-ROk!*T3<7N8%&aUz%yR6kOxjE$ z+ziZ2j10_7oSdv291M(#j4Z4|Tx<+XJZvm%JiHomZ1Suk>?{oYtjydj>^w}ooV>yU zOl*SOj64j?tSlVT9Ab=270p&cpb-TICI%q}N5zb}he|D*gV_6&+56m*8Z$Y17$tke z*t^Uv+7x8kjTzhGR9kX+djuG|yafta+f!M(qga}SL|T~{8Y=`F-Gy7TnK~>CyA^qx zwM1LAm|Eo78%@o-{WvfM&uRnX><% zbl~VzcVx=`@*x*AW0%8o(s8Z#ABV;@`cpXOW;br*Yuv8c8nKmYM`GhvB}c{_>7JrM z@f`VH@y6p}e_Xe)UJRM*|Hq;6Nbq8ojjq?cnC7wco1AB9JY723tv#!8gTo)^KTeIS zJr|cbO5|89RAuQDVwz;l&}+mnrIL9T8^h{K#wLEYc|I&1hK$n`nHNSd_82lut7d4; zV(4RLSRTRDtk2q{#MU#$#EHJ2)G6a5Q$fuJLYDZc>@<+IYdQvBP+GYOhA)ww%Te{cZk^ zVmX`pxma4P8CG&IwwN$98Z)dkWmr+d(5lJOSk2I*%&f$)K$LN&8^VoW6r zbK)81g)uf8GR-PuT#)X_nX_@NH3P3KKa&)LG$S7aI|maNiz92!u8)2Ke8M82=6E1y z&bzf%EQ^^JId5B^_CFc|VqL@$m}q^02Z6isU*@acJDF0v*%a?Ae#Dupm%TYWxaxn|TLQTePevIslY)ni{t9_X!7BX}c zF!z`;9LQps9?P^$l%X|)d4~w=!ce9jO{NKA44uMEeH@IfzD)B}m=|d~GUZktkKtu@ zWXp~IBm;_AH3K#l7M4K4+}U#!8`n5B?&I8|w%K&E$^7ibl^%^pV>?_M&nYx+%%7;c zIBpXAOu>U9j#9bn)@Cuxu4ZafV_Iy@ALY2{(7Q=01?9F6i=XC$#q5@4KO#V{$K zVNw+1&QOM(5lk}-8E2R=EX!qD7Q!?`m1&|p!_0KXH8~8MxfxEDFfZ_ATwuhwz>#r& zHq!ws#%%wNrVa__X>#1GOsxD1bs1W<~I}0-d3kxfov>GFWj*E~48yh=EAZOnC*+GpP^cuTU zg&Vue8oL78BWvF7bqt`j%Zzg^7&<&0ne+C1&Szs| zVhH5TJH146liHh-TlpKR8@n?aPZTzuC}^B7K0$gNS7W0}V|TG5W8SSk|3IF+dy9Rh zgs^Nh-e}U;!_l};zL~w5uW_G9<2BD^K91aZU%K^Kj#_c7sb@}NTBE|cnVq?@m|;c? z!yGQI_2ta#iyXP~-t6;c>g8c-jb&-JWa!gl>kVdXXOU#7@jk{WyL8++^;HyK}cIHK&Ro^Q5}pM7>D&+G`sg}PilvCK_Q zjP26Qn|zozXS4NZF)T@EKFPu;$jrmY!pO{i!k<}_;Y1b_XdUp{VBQXHmU%3!(^I(5 z$}^o+U}9$5BgnW%h>eq-nc-AD_h}wR1_pK>1_l?&oPmYxs92nvx=pKlWB@6e}58VhqPc5 z6H^l}({wN9Iod4kIc%+wENyZOz04e~VvG~282k9y`m`9hnL6YdI~17tS*IyF3gw%B zG34Ol<`WPBHN`=738)*v$)%*l$>Wg#%66cBbs%Sf#PP`6L5+QuOpSdeuM%G++%{%* zlr2zRry|J(@UC!M7 z=`8(b3`#uRuFTElOsys?T>`9~z6>qNOnowrYz2m2gXDB%RX8|U*+iuRISW>A4n9;n zxuP?_E3xrJQDdueW2;i*t$IhEf*p%I8P;(#O( z#sw+N?UjzK1=}|VF|)ETaB{HBmvCe**!4||k4Hcvkf-3uB=5%KC5@MJXH{+HId0o{ zR<3bN;8f*)jmBLbjT=%Ol?uMkm169UWuD^8y)=wr5j$6-7js`KL#GONhZ^TR4%Xgc z(Mg$%jamGY^jJHRnP%m%HJ0&BE@kVmU~N)jiDK!oXX%t;ZDZzHRw}kwimQvCZF&KJ zO8`fwoA^FvxF)xF6zBnU;FdOqs7KWM3?5i_4 zR~NG`wP0Q<%&5*VMUH8@59{h|22K_(Mh5YP94uWi46D=G+1Qym=4dd^(Pv~}7Gs&D z!8B8WZH6sprw!wrc$RrgOuZ3IU8xKUYFQ^{F-**4U6jVw%gQn}nQ6Kl;}k2tK4qpB zcCJQV#u@5d4D3y;j0@ZxMGAg=^Ox3QVleh&WZ;(or6zV3ZazshIW0y8ULgSqO;CHq zfJcOpA&|Ssbdqvs;xd+v+U*4&qW0N0E|+NBrG1oRp|B%sk^6LShWVz<^RyVYJFzeX z@)m_{%5LnoxW|3jv~i@#6z zVC;8fYIS6v%EquUpJ8Jb!$D@|Hg%TcIt9k?&7iVZ;VcY7& zz~snURC~}zqBD(qVmwQ?i9`#FBWF>@j{s#2(83osHc8O51qT~PAZO8=?)oJ$?eU9B zCOS72PBCF)cT_I=zPgTKLol;D%SH)CCN?hS^`R{5{TMkIj&d^`sbOA|$}m%y;b)~l#&o(=U`!AWf2ey#h>}DDq7>kf*rxfc9sOr*IhV)C$;!pR%&;brX_6A-EIo$f`V7Yn*m+nu7-zDx%&1`GU}R># zP|I?WNnl+qV^=+cA5)_P!}b^!E{2utoGT?5nAv6+J2DpkJM7@dUEJ}r5*+9({6ai@ z0%B|&j0|EbENp>1C8`^Ym>Z|$G)~C|P32B0ZJbilI3=@jN=D<9T(EedBWH>66gh^D zJccGihEmpMFQ)rh3{SKe8mClqZg2_YE(zUW(>PV4ajI^F$pzJRcJiS zsOQLBQqX6|x;TJmM!utXN%Ems)@DA2wsNKg;hfBDOdK4H8_XCtm@{!Q@^K3@aH$Yv$L@9ikSul@|N5>k@AeK z@it@QZHC6K{Kl?4D0#wizUd;5#-mD&do3M>O5V+lVOZhA!oax2mtmGF`?&&^xz!xq z6^xU>J4IPevNP;RVVEz<*rLJIqR4!tg7HYDBV#GgNmWO-lCQrjBve4zf`fyDD^R3V zW1&WmbmPIg#=E7LRPG2jK2KqoW|~42zgY!@uE=U-Q*69K+e*++fo|4^BPZw?oU`N+_;ma zu{-~s{A4#r&eGKj(wNp{GPJ5NO{rj-S;@RnfT`D+VM;VZv!x?T>6&e+%sdRtY^;uq zrEC8r2XdAk+Lp)6euuU31xw>*(H72m`F#$KjHPF{6$EmXURt2gxKpWdlmCk1^A?Rg zY>f|#pNsv9YCItC$XI%Bx@#a;>7&V6$9Py8d$<~V_*pm`djuM91)g(qWGVeHhl6>E zEK5^0dy9{wVClzg6t zT*mU3OHhQFAyA-9?zGWu*G+jnGChioJxYxiO^-6|kUo?1J*M%AZ;R=&pvFTwjXlba ztYrqAIMo|ecE_MbYqWIV~;jFdt;B;&+190j*MkK?Iw;KWuB)E znO8WnF)=bRuFzp#VaUkJ&{gKhQs(hjgGT^77|mUlbcE?d{&l+^?++})& zaSji2r#r(MDW=_$j8ik2=2$RoabVeJ$k@inc*KC4i-DD8u|C5rcgDRX%q)ycY#CY$ znOA8r?vrHQC&h5sm7&p>;iv%P22;kiBIXV&h9+^w#R|;KLQJ4VHuErCjAy(U z$FNtJaW4CH4T}P(!E&rJ~xdQphAIoT91M$%9c9YDZBb%mU}xZ9U}xdwV`gJyW#D7tW@2R!=Hp@8 zn8Um=l7)ehpOHg&RTMKP<0^k9e#ZGM;`0i*S=ksESQ*$Hh0DMH*OQiGWMF0h?Hyoc zV`dN$Vq{n&;lXV%I3RqiHnEH5G`m8y-^cgy1*jLvvtf*&d)8gvqbTqA4 zdoqP(l`ZQkJBC&E471`Gno;4Gu#;`#X9m;>~3t3Wn?h*;1N)< z5|;t3oRySfVPWUs;xqMQVhH4}+_^BQO=*#AZ_K8=nd_9Juc+%aG zqw-j<4^yW<;{qPWsR7K3SQ*+ZSk>9)Iyo{{Ufm|^$W(c%u`!sDA&{@~@izGz{*CV= z8ZRmKGc+ESYusbsxW}$>I)CGIzQ*a`xOlAJx!>g@#OX47gTUGcGV= zXwu_YR>`#8hILb}&~gq(jw+^YDxfwNF9#a#huL>D-LllGu3K zq49F%b~TPD^&=tm>WN!`yGf(B{ItB$A;wo}sURxlfv583W_gOh=}w zsoUkbm>e0a<~26O1aeg^oy>m1pm91w*kGb^cuejHhvRmoXXC5E57l4PUBQo zN0w@<31N)waXgc(8GE!GIjRkJ6f&~02(k*Wu`#ssFtls4$T_lA8#OkYf|_^W9Z?K{ z{MG(Fjy+`y>-tO^&$=~!)NK5y(fGx+@rz62ROQC0N{v&M_X##$Hfo$I>&R1GKB=5> zqC3kRCB}Yco>pnLE>DI&8^-AzoU`27dsUb_44G#;IEqy#?5Ja8VOi?Jw$z)6je(ho zpOu4CgtfbbrH7SUfPs^RgO!sJw8e;@osU_Vy(f&J$Jvp+I{)Ybz`w+NP+fljt@)Up8-hB4fQl5!COfjtOR{S&d<-1tK zdyRSf%v8Hd7#0|?EeT~@=)%1&m!mh0slAMGmOR7y61F~WmYxiTW)qgRuFQRGOe~Bo z!K}TxEWH`rExugM`V4a_n3fhZ&B$SzDaA0~)zPf_;!Z&hHYR4ar7|p&RT(B0b1aqO zSSrrQ%(zs7YpE~;H$$HvW1lx01N%}5hNa?+-EoXFEtr;yGcz+R72#Pb%rYU0p(&lQ zx0r#Mu~&_wHI#p@850M?v`pri1}sgn41A2!JsBI#m}gXRE;klo;sT9)FflXmGw`u6 zbAXyHd`zrMOc-VtbF}y|^a?u)R9|Xr5tUa1?FZ!(5|m~;86 z|EsRCNx6q}vYI1XE$6{{h7=BU`P)Y+ptjmMQ+sOMRFZ`r1t|a#XKX+*{1oRmISm!NAPW!_CUe&?5vI z$Yfw3s zF!V*T^u;l8F-_uRm{`WzZ_m&s#Mr6DB)~8!lVMT{^JH0uCS68jhG|@k?UhXJd5qIb z8CqnRTH=^mS-{-I%iO5R z+!@X|m4~4_){(LH_gOVZ?%F+#ZC+wh++0iyEG!%xpa^7PQ8eNg3goLZJZjyh@t5Uu zeJ6LD&ouAGUY5VSe|Z|GnKn){X>7Lam3CyTbL{bRRIGD75yZgEFxQuBZV+R;BtvUD zOHUPZuQ78k2V0LRLpwLaoHE8a>I{>`K$F=_lR{ZL!*lWy-tD>D z<3RF(q(#+=<%NV)@7`z;r>h`UV=3)yJt~)zR zwAW#t=^n20o{LH*@b5`j%i4G+uW^0${@@nD#YPMCw(7U~H%U$x2;`}IG)Z=rO5=r~ z#_P3>Jkve*1?-oe=d-}4aeY$b1w%*vx({8hO!Jc%+SnNSbs1-sGc<=WZ*gL1)@Pg@ z%P`N4d08n#mjpvgHB*~1ONX>0OWn8i`RpuwoQz_Q%ymB-+hYV6SQ!HO>V^CLI}|5H z&G0;zHivr-*HO-+T+Byv8^3BbuD3nQ>L_2Yv5<$M%ax@$kac1p!`?hlcwUoaoL0oX zUxoKdAj8}wrv40uHMxvE77Y8#7%wujTx4NnX1L|bddq`hi7Z3226K}r;}$=LiS7(r z7#TO$F!gyc_Ia`}F)=$b)%%=IVrsukpTV<9(CHr}B=H^;3FdSbNo&rxr0ax-xa83(qWI*r3h4 z+>E)slzF)}+u9iR7DwhDNw!&<42`n<9ZU>;_MDw{3@d_|8(A4<7BV&_GcL$sTPw^k z*TGS&e(p{eMh4a;5sXVB8K=r{OqJxEYRNP;fvc65xs```vJBH?S#Bm~&_o;q3#dQR zU&J*}nz5LrtHP1DenDf0A}Hr_aDiqHL4_JCo3s)W13MQxTOe11z%+x#CmD^4OdA)O zG%hl|tb1AKqUthKLzCGhVY{Sm(|#v5aAMD$}A` z#wI4l);y+(W(KU1adY6 zZI5YOZ|y1m?GcR~a=-N*SsH2&RWh_PGt4k$U=HMJXr3L~C3iUPoP9q_;~AgE`|geR z-5Ou(x8*uAHcZ}B7%0#%ZC-xkm6FEO!i}ee8h?2=OPsPe<=^<-rEyL5CC^TsReX(S zSQ>v=h6eI9tegc0r!lZSc?Hv|!c_&0YYH0wBswxToavBZxa!5QPBf6S;o5ZZ?O}~; zSsK@JZ+G5qwUK?J(A9cJmWGG@hD@u<7?v6_G%jHa6mEFEnXNstJqD!mt^RDIC3zgD zyiYkauH|U_$lCakrSVF5Ifmr>vjr}%_ zKMh$Mf0{I|4d3e68Fs_Lk*P6Zvn<1!ut46%)cL|k7-pw7t_^Eko7lKEp|P{Lv9qXg zZTx2G#s?LRmm`9SO_=Ol51VO{boK4J)U1^PrYR|>a7do2L=-MI6+BnV1k*!H+RxM*QAKQEthK2Er ztx^o#E{=>%0y~l%S(*eJyRtxA8$dmfCXJm2jf?pje{f!@c+CE&u5qzQ<6_YZmHqln z%~p;=O{P7n3~jLtt2r1~Nb@cU5NJ{s>t|(X3uT-nz|iBuFgJ*$Pm!UIo2ieB;XpXU zfiR{ug^X*;90i*!b{a7;FtLC}D?nXH&Nd&0HeVJ7mL(~SGxZs}&6$>@FfGw!>I!4+ zjB{jfvTE$A<`rUOkWyo05a8kB2;^?+SW?k=CZ+K>Z;y22Wwpjf*0T*b8;=V#9_L)j z>d4tNeR&px0D~aY<@TMjGXATA+_;)S>s>FZ4QoHP1~23Fz_?X(`N3IW0=6jB*etUG?kTMN*W`B zBV*Idl7Z2oWW@zk=X*^dwH+-V=^pZBmrB0$M`i{)ad=oU@iGdq>M`jv*f1D7GB@)!cE>X@u(AXSHEU1Rm|nWKsPVW^<8jr-i9IS2nj;zfND^x+d z4%nF)#T}WNJsP{~K%3EZ1BTIAFQEl$-NbW{fmcA@Umgeb=J!+u31XPAMZ*A-`X*{00p>RVwV*zt2~^ z--oG}U9ruGqpeD~rIw?mM38~8Ez^;w`B-C*H46*4YG+f_0JXcgSlrV$WAt3u<6+Qt(#jbE%+`>ak`o!@w(r139NY0U|W%4m!25v`|mafKLBPIqe z9x1Iru9h8(MZ1I88&B#rF3emW*m%;S@ucZ)q20=khAl_tTe9@mv(kI0r z%)rL9TGLUq<@7!wr4}xR9t&O`v7Qvp9$S{aWTrknwiavQ79SP~c2#B`26aXwCPhvS zwn>%@-APOyoNYpm0xf46dt+ExxCK~QIJgAFgcW%C7#ZYMSXg*?m>9VE_=Q+l0y$e- zI=BvLHJ(apJe9x8rE!8r<9z$Z`F4#HJRMbA`&Y_vPnKqwEXU5v%)mHBm3fL5!yHqF zIW}y}jLht8?CaxMC+IWGlw(?!!MG%tZAl3G%u<&5-h!(gn0sqjnYfpEvMlowU}t3F z>y>BjRS?{q&Cun<(4xoC!p~pjz{Dxc%)-jRz{bqQxU7a_ zIWyC;Du!j%-~&ronHU^7+NLy4U=x#)lw)EL&E8-g1*1T}t*Z~Pk9xFOb2vR!eql?%2yMpiZKbDnv8Qf*cYlZ>{Mfz=E=BT*fF|Y zX@?$zEF%ju4+}372NN?B3$rK_2Ll%eH?ssA3*+P*=E>=7!c3rf3nqrCS?p7*8Clt< zhA>TyX5eF$WH4Y@rp2(#n2DK5lAVW{k8Oevb6XMXbbls31||kjVI{%H4BGv)OqGd= zc}581j8evB7L3cJ8Mv92X)rBQWsql(VCP_AVp_()xJ;Twgt0@9u|t<(85h%BRpz;J zEd7E^(~8-qD=_p$FfXlUUB<@1#JEflv>~3kPlK^flW}PU@2q%+NtVq0QcUgjj1!C) zCK$6fN-$23VD2yAn5xX)Xu#N`$ky%ZDBG^mI3ZZW3^J-DCI_0l77m8Xp$`=PSG~P8}Xq@F3$k|c5U9&}_MYC}mSK~wGRb`FaxSFQ=K2CF#>gevO zXPjZd(wW5E=D^xw%RVuSZMQq)>Kx{UmHZvr4AbP8=BMy9S1@+DGBj2(PgLdV@#O0> zVrUIyZZTx&$>s>=ZFFGl;}%*}!_t=KDA&=k(?PODQ-q0yfs>Vqg<&NF^NM>M23=`EDr-w4ND1&B}nAq5v7(l)F)o~1~V>wn;Fs;hxU}a@y;AP-rW#{B_j#=|8j70B6Xu+FmaWJu$3_UT5;%Nw_QG;Viq-0lWCl#I30WnPff zELr)POpGldEXz0@Wjd{o#aWnEsxH&2~yo)W|2V#dWe%p8o%%bBOMFiv)3njgv3 z6U8w-kll#AFNe9&letxisVRxEkBNhcg^9V}kg;Ebi48RL#xyzFk*zbeak3{Xn}{4E zgNTfT&H<6Lz|#x9SoERJ$r!iTdMoAVet^ch># znVNJNd*m3KT$x*|8GDpi`qP;@BAA=1n3{wc+fOQdm%8ECi#G#Mu#CMdzq1)8G>;R zp>YHEB%!|YzOu%-C5?0I`|KMTyYdI(6}blk-2Nr{us7qf7WIm*q9ii*1}2(>O1%ab7^Lr=Ox!@@JeD#l*qT#m&&g#hS?46U@?7#nmCl(j>*u7tYofz}W7|(C)#|7R}h?$=9jI z++5GV%G}Dz)F#f_oyF7}&DkW%JYR`{2Dr^be7I+=5DTq6@h%+N2bTm^q8FA_}!`T zxp!}FUs;=6E9)lZ?HbID4`do&)jG0u-|8%3>Q-Rr$YpBFV{Q^=>=1Nh>b^QFn=#mt zz5CiSHI|k_hL#f6US)2xQpH200dtVHGn& zyA@NT8AA^r(?n;6P6?(GrYVY?%?>ObqO6O|M4H7I=1HCj%1`3o|DRGc!xG55q(@#@=*>rgVm8 z5tcSBhE{Ec#%zYpG=`2$hMojR<{r7mX~sDd;J z<5uPlzjndK%}$N8ZKq{-*7W2w&bDe?qu7!=)nlT)WwZ8Ft;X4Ajf=H=3L7^_H7*Hs zWbL_l(uko?pP^fnp>Zn&6W{jhj@bg*kHeygDk#Xw1;($<|`S+LguF$IQ^~z|dC3rt8Su^ZKMIKNE+rBV*71 z#_3vtoV^^N{nH|iOLZFq8W%@3uCi`iW!1P$xQoY;u~+PnZJ>Cs^ghvEo*(sFqgLxS zP2p>rl-^mr$*aA1t@<{OrLN0r)@IL(>4=>t-Yu}&Z#8psWk*b)V6Vv>pE-=joz5jr zDViwS;&9Ave&PIr!~TuhM=JJ+=FMhl;c(>Wb>C#hw85TXW-vojIK!DVhIP3NjpYpU zasx$sgV$KEGTf%I&#l=Nx}#eU=R|43i{<+k%+e?D?lNFwAD;oKe8i zRLH)?pP{{mWjY&omn>t4DMx1wV@EJcj|y{t1mkpjmQF$bm1T_U6l3*Nd-BlB2(zVF?G*VoN4&Mm|PnCT12EMm}L~1~w*k7Cr_R zHhl&K9?-eNEbNBNI&7V8%$=?r42%rSERMXrIgQiZe9}P0I6E6V2NMG~4-XG$9-ozg zPb84DPqUMMn@{5luEst5jeGbS_wX|{?%`_O!|2G;=Q78Pd66~KLJO(o!j61>CPxey zCTB7;Gq5tTF|o5vuV3>^+E&Ed>b;#hjUnL09=dIK1WnYv6Ed+ZsSlo&eAnA(e(BN@6S zStlnsa`nw_oKXdu!`1{H`vZz91};8*t3aXt_O^a$8ccwS0GCvKR z?{MD7QKWxohX?a?A%;ngOtVrLCh0Lw@@D84U|b~5(96X-J&UoijA0=&Q)fAIYZ=3` z48}#J3=85II=LAp)iX@acVzD0w$4_D0kplM|8V0hX(k2^E+z(cmO%dgM{_(If7>-) z_h)5myzbR_-IM*8`iz{WR<@?OvPaz-uZJ}Lvv=g||2{R6VOBUpzaR7RDyBX|hNe=6 zMrVd*4yJBvN9O*|>s&!M3pg_Ne>qbfC_RC5zL(bAfX3@Fjn^X^uSYcgR_x=NYIaPz zX>M8LZ}Dp^o4k)|HqB*fTvdI+dyZw(^qR*1jthMk>-9R!usO{COvzDbg4#MSHXerK ziVVjUIA+H(O}Ay3sn57ck7-pn!+Z|LrAbUP3t2Y_GqyW09C2Yfmd(5>gkg@DBkKgC z{nip)dQ3gqtWAat-F}X&6U-ZDd4e_wa&U1n1aeP^UKh1Wsc~&Y<1X{YU1p7I6dTtl zG~Qrc6WY`g(fB3Rk!3>0x^RZ&X3Pg<85*?$g(np4Wog{)(0D_5iY#cZdy{^PO5-|? z#i8+ z2a@~b&S^G&QD~aa*)*S{@v3R#Rg=aS;*BrF8ea%Ez7T4BA=&ssqVa{KBg=$^%W@d{ zRT(BGGR;X26q>MVUUlOSmc|$AjW5(1KPxVk-Jmdsv#CX?@r5e$Oyij*jW3iMUnsWZ zwqz`oc2u0OZ&@i*mnBn|6$3jX8`J7=<`y4@Wi<>e4DFhX?K;eC%%GJr8`zoK@)%YM zF*7rCCNgZ|WZGT8xFMQxLlny{N9HCUmc}%OZCuP-r5U$MiR@Km*{cMaHgV*baQ~Q` zXmhwga|BbXF-LO-W1}5ov$#N?t|Rw^V~w*pxWT)axVab^1Vorw7#Vm$!@XP+b&s-x zM(JO&Z}QsYzs3W!#$#1%aDs+gx^)>RvNBAIVwhRZ(v`?En}cbo zDAOuCh8}g6S+%*r6Z0op3-$TZQtadsppL!jWq%v}s;*_$SW zG%Yr6T5Qz#Pj;6V>&4QGHK0|-hrKWQci6PbPxRXp=g2s*ep+xK=fu`s9F2!Vnigd? zEy`$o7uxtPq-l})y$BXZrirtrhB357IWkV1G+)M%YvP1moD57XQ-xUjd3oEI875aT zbOy3_DTB_L2o#!l;GlF%MdOC5#s!w3=IR35#sxM_%LJR22{e9n?A1Omch_`&MVsS{ z_@)U;O;e2>nI_)pRc#b+=W=wJc=cojBQwK{c!n8K%$>QcedP=@vY40|XGn9;kYnUz z*2q zGfXyTnry_t#vsC=%*4UaZOYJX!!S*qWf}vM76UUg6Z33V=2AicCEkjD7hW{pCy(ViAXk1#>xHMK& zTuHle8BgO8S4Z_p+YkFPN-#DCvbMN0xA8IdnKLw%a<*0oHpa7dBrr8Hakb9J4HWshU*;A3tvWo%|(YDr@5;bm&`VMycZu4bB$!P!~K*yzvIr^3{y%GavO*sI6U z%FWX4#oocp-YLk^6wB7H$KA-r(3a$=Icei5RW1WI4h~Z$L0&6H4rXUY9R?9bK~`%9 zGX`b`b{0M^5f)BvW+pCXE(TWy17V0t~4mL&xULFn}0Wp3)RyKYCb}rD`J~m)VMsU@j!gzfw;!af{mL68kYw;GEeDP%)_uQm}N$dquu1q2Nf76 zb1-qTF)#};GcZh*X6!O&oNvS+!pz1pH=1Ei9)k<348!b7##Rl6X)cVC%*{+Z&8duy zT#Q_tjoR!AEK`ITr-(6BFmN(=TQYQeFbgtqup6>YWoMph$1pXMu{D9I&y7)ld7d@H z{4|zsL)LCBMs?Qd>WtF^xElkR8Uq-`S?7l`&JSbi@nvihWNGndoUFq%MU|n`grV1h zp|6%}z9a*)qrl`Xjr06PWEdGlM3@+azXya9prX{Y9Y*Xg;NHMhXGi1!QyVF1m44Rx6+Uhu3qZntTv+y%as$!ij$26muiGgWiB}2D0*JLNQmL$$bb*2>7 zsRkUYcpU|%>TJznXJO!DabomkWntrBV&D^EWDyi&@3rIT;A8A%V(5xw>WXmWnrhrQ zKaZ0EG?~T309tm;%D~GYBoxRqwR4YaHtu0*+$q|)Q>5__ z^Mo=-xv4XbWODTQGI}$nGc^h^v}!Q+R4{;=4Xyditz}H@hKy_s?RpH%AcL7%SmYV| z)fxI-82XKw`%OS~1;dm|)+RN^NdZh#J(;JfIWkXOa;8#ITH3>rZR(=N1tRRA_5ECo z48mf8yi;FH^;%c5OnjMGs|tdr&%v? zZP8$E{9M$u$#=C*Q@dQ_=VB0VnROdShmY}8&z%_{?hNi`rY>nmmT3X=yqPB`G0b#j zx?vN@H7&Zst!aZ%<6g?V=2QwhT>^ z85kPBa0hZuD>x$4xKpC>i{KiIHI_@_`!iacj<7f~POCk_7|1iNb)nBJ&ZZd=jbBt7 zzo;}Gvp!tk)Me55MSY{xas95KK+b7Xdh_49H0}s!{Gz)rd~HBet3l%t_8r2GEYp_H zPGUHl!O*xTj-he4U?9)54a?GY6*TUQYJ4HQtf29rLenhArdbY+2TQvw8_(!8E)RD! zo3?M731h1bLvI07qc1}vAH#e}hUQ9^c58;UT8wM!S(}oCR#z}KS94GEWoQg#oR-hB zI)Sk%hq+OasUwPUwmNfHHfv8FQ;Q>OZxv&kknm(l)|s^o^Gzh0T$p=vnRpp{%$b_3 z7`y!#+C&)CnC9s)uQTLqw_}*Y#<)IRWStq~x=OA^V(h)bJd^S*R)#Tjh%-**Wp0yU zohQWDq{A?Q+0kU$$!#($op#I&%>4#Ts*GLf4EQX*SbLILnV2R=FiehR zZ*^d8wPj&uWCC4|AU=_SX+k|{eurm~6T>2B=0$dlOw7|Qxw=)^7KQNk3JOmy=V0J$ zHDYPi=VM`7%*C>ppP8A7g^__{kpwFIv05tkB{5fqbF5tR}HZ^~d|0Bz1-VG&ajlH%gy<_hGW{{OIN<36Lt zy{5g49d?ZeOB(l?HgQg@=?`w)C(yWszi|s+;{pA~1A304GX#z}GBo8g^qMm?MKHI! zFf@sCw;ORZDKoX#vo~@uHD@t4^KrEKv$h#9bg8oSXfQWwF!hNuweoQ^+cGy5I&#gB zIqeC$noEEIwDyXXg@YM1x#7q%L$z^HiI{?{1~*@z?2P=wb`!LwDK;K;Yg}(U+44~F zO5Is3dkZ#kx21PTElgM@KR2^Q^18tN)a6P$99EalQnzo5>R~^_a?ZSIsY4*ojK0Rj zT8-B^*I7=?ZJMsr)RVq7rtvyQQ;Y6g&dDxKy?Kt@Gv>^%V_2@t)ELd&T+KAEMs0d6 z=TrgKss0SJ-3%7xhV(Hwn$K9VkAY*J9-|{uTPQ07`viT)33`kSJZtn>rxdYF@?q?D zVL9l@FkgaUS{5@Kvr89Ytm=Zd|MfItf`whLM4XkB5Vc0~F=ld@O8iY=$mu zYvw_?*b9=&8ge{Ps9Jf?|Sya=+fW{BZ`-5k?E#q?Jm{~PZlA&pt3`5g) zR)%AB42>UH7@F2+GVD)cSREe7GqYul#%$*W%DYoGSvM`RYy7}^G`eYPT;m7U#t$q_ z^HUw!W=@(a&)hA;Fu9JQNra&CVG^Sw)67kcOB@wU0=Z}2IKjc$xYMNZNNnSgn8w4FjfX87ciJ}Y zv}rt^*=OO%IE!&Fv!lYyxBKjwTl{#N6j>+au`@ID@-y^uv2ifFm`#e zc4;tl7c=w-u=d3>c84)EGcd3-_1LrY7%(w2%CJsMX6)2p>L_QJ$idti%G4>#*e}Mw z?8rWgp>avAwi^=zzX%@>I~Qo}=&Y<0JdL|bniizb)adkV)mUvhx2S2RRMSq$=|Nl7 zRt7q<&#Iin%&@D7VOk|aZ#lz~0*1Zu411#jxo0&^6>VCO*0iE@Ps*0;p7?_vjc<4w z-|(K6USs0OH>-b=5yLJOhIRQY>xvlGS2C=xU|b!{yi$W{QzX+|D~9Poj0_BiQu*^7 zxo554qsh>y%fQUS#=r_H0+>O|Vp*7&9a(10Y+UNk!yp9i;>S*R(;=k#V+7pPQrftoyrj7(vU8KD7O^la;^kyxWMyAh&9q04vDc7g z5f|ekZe|9yML{f!f|(X3Ff2@DY}R9J=VI*1V&P;s5Y4#Dg<-!f#}pMu&RGu{mlkph z@Cxw=v2lpXf!dtx9D$s(9Vc_OiC=d*UVgl&@v2VaRc+8Bz1jYAJz4td9gS!E?oMS` zSjV)mo^4?j?~}I3|vgi46L21EE5FT=9n=w zGct2BvM|m_=bMqmJUNqbvIT=4mnnl8sQhJ6XHjG5<7VjN5oG3Yb(EYF+_=1sk%5Cl zN(Wq^aDY-9CkN<|SWpwr+C)fBSb>p&gUdNf#y~(y-Hwq#L@AJOp44eYfyRAOjr#&w zUzF~5IAeLn;y_{3ijt<~j1xnerfLQ9%+sBp+B8+GX^L;t6raZD^~@_(n%_`kg z!o=(-Gtag+jj^eKxwU|?JDO#t2TQZL$OM0>ZY5!Ep&AiUj;?HuX;BP)xlEm`Op^?l zTg*+TgtD~c@yv{nT52jX-$-wcAj^~xwoV1!j&g=xRu<4?+q{B>ToIj7ZcUtQ?2N5Z zjcm=4j-m7HwmGx1aDomOXJBMt=;C1QVrF6B6kuj%WMW(sz^uj4 zTPaf2rFdKQL7t_+J@I2jlhxid1bFD~I(=*bCc&@wSHbFr~@ z#WA#bFn9Vfu2E)~%*HrRfQ5;PiHV(oiD9}c<4gvoMr&p!MrPJ2?krP0I2MI6F>vsJ zHiR^mF}Eo*Oc!BYWy~4Ugn^Gqj6s1xfkDohVfj6bI~HU>MgKF?`f7r5BIm9^1jnxySlNpi7;Bjr3mF)zHG`T` zcte}b`BYkM8p}8v3z}Xfv$fbVFt!A&sby|)05PN(TOt@3TU;0zTS6EZTih5JTY?xE zTf7(;TRa$;TYMUAn3~uaBbvAxnHU>25*hnfFn0JSGNx28PGe4FY~o>@C7H66R%GrLDoZN`ZxOm4-XxD)T_5Ri3Vlt73Q= zSLMqxu1aNPT$S6%&bXSlO^0z^MHJ(D)>c8r)rJ|2t6iGR8CNSedoZr?DP&v|)9lB% zxvV9Zab;GMDbpsd#w^B78cm^$8_IMTH&is*GHw(~W8A3G$j7+RzA1xoV;Dc<#wa$% zjj=UMo8o*K*J?EKGOjgjlww>P)@aALwy3d?aUExy8RI5*bH>$0j*M%Vnpqe(IIA&k z@Mz*>+?L)H#JDBKopDR5FXNWtGR7@x%#2&KrJ1(qN-=J+XkupET+<}YxLvA|lW|8{ zqax!@R$IoMVvV7UJA?QbcZM}bF|H36V_F}>!MHv_m~nj?599hQM#l9y?2PLRSee!r zGc&F)V`5xi!NRz{nvZP*6BF|WPDYjuyaJ3n5;7Tgx|c9*4{Wq&-c+T;xS7j~akG>n z<7W9rX2zXra!fn5`5AYbblNcP;A`Y!+@as%&9upyk$IC{TLR-I9YMxTMvRP`Od44j zcd4>5?oyOz+@WqwAb-38J z8Za_#HD_YlYQ@I1)q$CDs|zFJRyS70t=`N`TYcFWw+3-AZVhK-+#1Qmv^AQEWosN8 z)7Dfj#;uvGj9YV=nYI?NGHxwlVcJ^3&bYOfiD_#+Bl9*U7RGJtjEvj37&*4_urO^C zYh+|x%gMvImY0=ztspzoT5(3kwNj0WjJv8DgBf>wg)?pNYm{f)p2EYpJ%fpHdln<( z_8cb0?Ri>Eo6T7nH(NLIu&$9)W?ZAg$h1bUF_Ce-H9O;a2LZ!=pHg8_0ZGoI@+rp$6ch{OQ?yi(! z+QTBtxFyViagT@_>#qDn#;%EsM=KMVX1roNE+4~mTr-iWmYwm0+%7A|6Jm*6Wp0e8 z^;H>9n{3o)JSp31#B{Q_QJnFVV521CDgVY`##0#{jHevi(-=>?HOeub^hso#{fhC7 zb>dWOrc;b(jrXc>p4F6LK5NtH!+6%EHADHVJ1^haY-XmjRcef9YgL%f)=vyzY+U2q zWWjyTN0IRy8xzMljzY$BDh!P0G~*c0skQPmo)h9>IwxYpcus1yK4asWFh<74H4$wR zOpR+23)vdiq%~$Sor{!UIv3BwcrI0d>0FLDkX=`D8}c^Qj_?=kwSZ&lfQ=o-biyJYUAbe7=&E z>3khO;{|pWrVCumj2HMA87~O%vRn{l0^A&-USLLnpb zg)(OL3)PIQ7nvE^E^@LkT@+wsyeQ1fd{LB<@uDOn^F?V!_KWf?>=!jS7%v(zF<&%c zW4vg|#CXw~k?Eo>BjZH}My88Sj4T&jnVBwnGcjHCV`RD*$jEvzgoWv16f^V1SZ1b+ zNzBX_(|DLK=CLteEMa85SjNnLv6hkT5-TI~B_2k`O9IS{mxTD4E=jO4U6NsDxun3z zcuAF!@she2<0V~Y#!LE)jF$|V7%v$!F<&xeWV~d_!F0)%jpdRP6XPX!PNqv<%#4?O z8JRBm^Ko1XXJ)*V$i#RlnUVEUswCs3LRQ90B}|N$%9xlgRd6s~s$pchRL974nURz6 zGCL#VWlny^%e;(?m-$&3FAFj;UKVC%zAVPVcv+f}>9Q;v(`6+l#>=WKY?n3InJyc$ zGhQ}jVY_U>$$Z&?jp?!rGv{S@Hm1wLtjw1qm>Dm}ax-2|V&=M>%EWZJfRXWXF*DQU zQfB7M6)en`Ygw4DFtIUSVP|B#!pXvTg@=*p3Lhim6+u?EDy6Voxc-4!E>8cMC>s5aa#;Xx*ELUTg z8LuWXvR+MQWWJio%6K)8k@0E)7t_^JM&_#(+>F;4n3%6IF)?0aV_~_*$;^0-pONvJ zAPeI)VOG{_Vl0f;WVjfwDX=nKQ(|VkrpCy0O@oQ?nl=mDH9bbgYo@G>*DU#1t~szV zUUOq+yyn5ibj@3s@meq=Fkee$WxSTf%5*K4iSb$iGvl>l z0j6se%$(P1m|3o~F*07~W@fz3%fxt{pO^8v2p`jRX-4Mja?H%vl~|art1~lQ*Jk9n zuE)rD-JF@_x)l@Cb$eFk>&}c!*WH;JuX`~vUiV>TzV6S+cs-br@p>pD{fD#vAcWj5iWl7;mI7Gu}vJWxSEe$bKW6nfXQu zBjb$<7RDP@jEpyGm>F->Gc(>~WMR6=!pL-!or&=#7bDY69#+Pi0*ov-g&3J{iZe6b zlxE_+Da*)mQ=6OdrZE%CO;bjun^r6=H|?0%Z#pwF-SlQ;zUjxobTgER?PdfM%guOp z_M2%;%s2BGnQs;`vfV6WVZ2$#$aIT=nd24dJ%SwRpmLntMEoTnKTkb53 zx4c*xZ~3w?-U?u6xfRUJcq@{T=~grw^Q{DSrdw%@Ot&(*7;ohyB);Fayy!l>2?AW z^X+6t#@p#koVPO>nQs>}vfVCcWV&6)#CV61k?{^QBkLVj7REc=jLdg<83peMGP2!K zX5zY|#mIQal#%U@ISb<*dq(Cvj!cYqT$xz!xHB@|@nvMWap9m>KUn3NYSvXJoqTDZ+HupNaWy5F_K=Fm|T9k<5&D zW7wGQ#xpYAO=jV^n=Zn9x0HkNZWS}*-C91zdrVx+_t@E(@9{D+-xFkHyeG=Ycu$;% z@t!0j<2`8>#(T0XO!wp&neHhuGT&3>X1b@%#&*wuiTR#63(GwlMy7j?OpNzjm>BQ5 zaWdcYWM;YN%gS^wn1lIVBrD^+ct+NHiHxlG(ivIrAnmj<9&HXmivlqjQ2H|S?+5wvftNd zV!vb_%Mo*>0t~L^TT*H#)m1KOb@eIm>%Xa zvOFwgW_no8$Mmp{k?9d58{;E3R>nu1EKHAh*q9y(@-jUVV`h9L$;$XhhK==+0yEybaBg>;)CdNla ztZa`;nHe9|GBZAAU}SpC#KicRm67=|J2T^BZZ5{he2k2b1-O_Vi!d=i7H4F9EX~CH zSeBLPu`)a3V+}^e$6Cyck9GMN9~(2VKQ?7zdTh(Y^4Niq>9H##<6{pl=EuH*jE{qv znIDHTF+YxEVR{_L%!^HlCiJkEY z44`TJ>k~glrY9kc%umAEn4d(ma6Cz1VtSIv$oM3Ond3=5Bjb|_ z9+oGyVoXn2IT@dFb2B~_WMp|N%+B;wl7sQ7EDO_9c}B*kN{nnzRTvqcYI8F_)njCQ zYQV_&)QFMssR=97Q*%b1hxn)6-CP#-~xz zj87988J{L|Fg{J=VSbv;&iu51nfYl6BjeKwM&_qgj7(4Kco?5Cu`oSjWn_HD!N~fI zi;3}>029+QAy&p`VjRrRBpKPC$+9s$Q{!NKrp?6kOqYrAnE?~?Gb2{UXXZRi&up04 zo;e6IKJ#H>eCEf+^elv#@mT~T)3Ycxre|@COwSS-nVzMvu{_IUVtkgz#PqCyo%vZA z8{@NTMwVx_Y>dyDnHZn5GBQ19XJ>xS!^repfQ9wB2s6`jX-3B9a;%KcmDpLItFkaX z*I{IOuFt~u+?bi^xivG>b9+X{=T2;_&t2KspZl^gJ`ZDLejdTZ^gM={>3O_7BP$oPVlo#_Q9Gvf zjrpY@6XQ!!MwXZ2EQ~K@8JS+nvoXC?VP<-%&dBsqi-q~69t-nJV^+qOmdq?Kt(h5L zIx@4pbY^0F>BY$S(ua-lr5_{X%K%o!mm#byFC& znKLH*Rf1&uTz+qUS~5izRr{4d|k%F{)Ul- z;|&)Z`x{Y4rZ=*TOm7sJnBOQfGrrMaWO}2;%=|`|h4GCMGv^yqX4W?jtjupb7#ZLA zura^!XJUL4%*ga6l#%sK1Pjxfct)l-Ni0ln(wLauWHGY5$>rdFQ^LgbmVuG|Ei)tI zTW&_Cx4ewZZv_~c-ik0YzLj8Pdn?7r{#KER@vSB!<6CV;#<#jGjBgDX8Q&T)Grl!t zVSH=B$n@5VmGP||Bhy<4E~d9`jI3`xnHb;tGcvvnWa4}q%)$6Jo{{lwA|vD5WJad9 zsf; zJueI6dtpYV_o9rw6bQ=J#HVjPLyzncoL6 zFuxCBWO*OK$oxK*k@0;ZBh&k2Mz;59?2Pa87&+e;FfzZdVqtt=&&2$Jk&*EOD+}WX z4o0RAT#W1=co|tfh;lN1kY;52Aj`=7L4}R^gC;NY2LmR?4<>AkA1oLdKUgs`ez0L= z`C!My_`#Wp@q;TH;|C8WrVm~$j34}%m_G!tGJXi-V)+oo$o?UoiRnW+Bh!a0W~L8$ zj7%R2nOQ!RvM_z95@7nsAkO%agOT|o7bD|GK4zwm0<0__MHrbrO0qD0lx1i9sKChd zQHh!5qbfV&M_opykNQlEAB{K}KbkQzezag>{Ak6*{LzM)>7%0n<3|r>=8s++%pd)k zm_7!xFntVXWc(P#%JeaYk?~_Z2jjs}Bq+lCNrHp%lRP8iCq+iaPs&V8pH!KcKWQ*B ze$ruP{G`Xo^2vaa@slYl<0lJd#!uF)ET8NI89%u(F@Ex3Wc=jC$oR>Jk@b@w6Vs;< z7N$?(Ow6C67@0rCu`qo~W@Y@8&dl^Fi4Fn;!9WceJx#PT_mndx&h3*+Z_M#j&H%#5E?7@0q(aWa0+WnubUz|Qo! zl$Y^y4I|U%Iv&O^%#4g*SQ#0=uro7$;bLa_!o$M!MTn8{izp+@7jZ_WFEY%`U*s8C zz9_RYf6?S-{G!jy^2LaS`HKY;(-#|NrY{bRj9;7?nZCF(F@Eu2X8PjI%K9aMgYioQ z8{?N4CZ;cOY>Z!$nAyLiFfxD1VPyJJz{L2an33^IDKqnz3P#2+HO!1(>KPfoGBUD$ zWoBXd%E`#~m5+(>t0*JmS8+zhuab<6U!_?XzsfSQewAlr{Hn^r{#Big<*N}B<5zQL zrmt4aOkeF78NWJmGJbVqWcupC#P-#jnel5dBh%MVM&_>(jLctSnApB1Ffx8kXJ-1E z#mM+Imy!8vJ`?lTVkX9~<%~>UE7_R8*0L~tV`63g#>U9>jf;ut8!sc%Hvv}0Zz7D0 z-^7@BzDaO0eN$&={HD#q{7sjc`I`|V`!_Qdrf>F)%-@`Nn7?^4GJf-AX8IPu$oMUo zf#X{!6U(GWw zvoZY=V`Tg#$;A9inwjO70yE<;RaUlN8jQ@p^qHA|nXoebvSMWZWy{F*%aMucmoE$B zuRtc|U%^ZqzrvYVet32%v`^9nVElEGBW?2Las7#aV1F*5%3VP^d6&&c>Ukcs1OFeAs` z7)HjwsVq!?GnkqG<}fn;EnsB)Tg1lrw~UAJZxtis-x@B~e~j!*|2UZ#|M9Rf{u5+m z{3p!L^-r9M`JWOC(?4|K`XiSeHgBjZ0m4#s~$ zOx*uM7@7VhurU2gW@7!9#?1IHhl%B19wW=YVphg~m7I+K>KGaSGcdFKXJ%#l&&kO0 zUx1P0zbGT)e>rBB{|bCe|1}vI|LZU_|JP?@{cp_3_}`L=>Ay8U(|>1n#{V8njQ_nD zng07QGXD4HV*DS>%KSf^o$-GhGt2)3M%MqSj7IW;#z{ZHXv>GAi@!3s0)bY1|mE_gcnGOFC%+nLjWUlV?zWZOJhR}h?NLprGi|L z4Kh9tq__wqR>HyD*ig;F(b&kq$k^D($;8;$$j!;v*vQAi+}J3{%+}Z_#=_FrCNOm=SRpfGV`B*mV`F1EBXeV8CCH*WM#jb_W)Q*3$kf=x&dk`@#LdXr z*u)DG6K7^>Y?9()X>3wpWNB5Vjv&3R?97c#o?Oh0 zO#vWo2oqytQ#cD#V^bt6b7NC1NFo_zXgWwXlaaZxDF;LpaBwy@l`%3lHZw3XH#Rdd zGd4D}u`o3@bArTpm{}W}`9UmECdS5Qkb|0~IGGxo6+r4#n3x)y)j%vQW~RnwU2ew4 zW@BdN#%42i*2ZRA4#vi2SANFEW*?B4KO<{nb1=xLNRUy{?2L`g2_T7NMwZ6rbdV{z zj7*Kq`7F$h&BY*-%RxjH2UBBnEhA%N3j-rlV+#`_TVo3=6Juiw4<~bDiy$*gV~ZGw zD-DvB1*ro$two86sj)=`#8qczYHZPBWNvKHWo2z_F$Sr#1hH&EMme)FHn#YH4De&( zZfpT1q?Q%DOppN}XS7s;45(paYHVdmvzs>R6I*s9CS(%7mGVwo^AHny69BrG`D8e8pH85>*OSXmoe zJ(ySOGCnVB0~GeA0WKtw((OJi#h$c_pQw#L?4X70u| zP(ZW^GBGu_2{W@awuv(`HnzzyGd8x#v9L9^DS}vZHA2Ojcq2(OpR@} zOpJ|f4vfr=ZBATFjcx86%#Cf{AibcZ+!n~h(%2Tv!r0gr2~rG-sI~+U7nFS3QaKnK z+p?IM8{2Xj*c;mlS(qE!Dw#MM+iF>v8r#_!nHt-RGgW~Rn=M-bPAgQ>CIhmEnZJ&=j9 zu{~IZv9Ue8j;*mhiG{VXJqsjJ#LnE`-H2Y3$HpVr=X%WMgXVFlA(J?66>EYV5FM zVQlPhVq|UXZ~+W^C+8=3;E@0OhETOb|C0#4Y4t zZ0slnSyTzqTMcqXEemsFCj%!_V6gg^8uHi;an?v5T9Rv9U{tk*Tpu zgqx+YOM;oXu}hAbwXsW?jj^!{ly^LmTa1;lv0H|bv9Vi@ow2bSl#jZVnHd|qRhgL@yEV9(8@u&DTq8Ed z#%?n~#>Q?d4#viAJCF{LgSwrB7#q9Yd6^o!y&0JryZu0lgFvz&tjvww5nPOo-LW9O zi7bqb-6_nRjooQXjE&s|LQIX_C;;)H#?NdvsWt8+#1+7#n-cKuRn?5;h>ho{_n+$B~t( zvB#Z_sj&y-v>rbu=Ej~t7M8}IP>|v%M#jdTSPsUTxhP z_L?v;Hui!X)N2hAvt{II>~&;hZ0z-8W@_vW4FgF;urfCG#zrP7q>aY@8s<%-A>qR9{YzWMpZaAj8PiI6;wvv2lVL3uEI1 z4G>og#L{D8Zk%Ai$lN%=1SDp`!PGbb~k)4&XaUu^3 zQ{zNF7RJVjf{cuf6G8RIL@`FD#);C5tc?>v4WNlCj4X{4)j+bK2%V_M%-lH92&BUt zq|TCqv2h}(Z8p)7nXPf6Gb3~3L@$tHKajdWHpa$@;UIO9Ah8%`#>R>9OiYavlR);S zflSV1XKtKW08&!I%F{Tpf{Ced5-THP<0K9irp8I!j7*J__?Vd*Cke8!G)@BL!AVl= zOpTL3MffBoZsx{G8X#F+PR7PbMj&k_%*>6GKu()v&B)R?$qqy~GqW~M@&u_10C9sE znHwiXfQT3-#>PnrAR-B5ZwiQ&&cfI@DGS8P0kQHy1SqB_6|*umPO1h;)Uhx&PG)3e zZk!CtgOk}ASsEvEvamEx=4WPUoGik~)HqoZBrC(j+&Ec*ld*9!DCtesWMpidtOp_t z7W6LNTLiR0cvqi29>N+K+U%)OpJ_;Q`kTRhZs}i6kbNA#wh}<%#Bk-S(qEA zNP)PZGHi+>8(ZTPH5R7EDY{&YjZ;k67#pX6YQHHq%*>5bK!xfQ7m#95V|xlH{HFMT zxS;mIlpsdt#wj7pER9nlIT#zKfKuHQP}5*aD#%_?Lv9MF-83bem#J||0Z6PEM3jQG zm9sN8PN@MIRmaNMIF*T+sc|YRH&f$OP;^fPMfX%8M#jdep#H*CP;+LgB#0}`%-A?p zj)$pnswxvx<5Ue6rpBo{Y)p+)4Oti)r<#IfErb{wr-EAMQ=LGDx^XczPW54AZk*~5 zk_9<;Y8WF+Z1)Hn?ke$y0LSsJIQHp*}`PBQ`Nvt?myoCa!!PXpzHX`mcC z&5Mz>ahe|!TjR745CO7yS`sr`&&DU3{w(?K19={bz-jnfNQ z85^fpa4z|uGa z)Rmi|!ot`%Lj$Bli;=x?hAuN>;|x_HNaAfrGXxEXFBQ#{$28)tZf z#QYhV8fOGDax~5eVPtHa0V>XBfEvLw61kZgXMmE^jBIA6#u<46ER8cj&8iuo^fRN5 ziK%fWBQs;;OcqAQ#+hu4Y>hKH7+D%;@-uQY&J~-XMqyTEFNB_##x{Obrz^Bm<8$_%#!3_ zX`Cg?!Pq!U1w^RxGd9lBWnyfcrO(XNILnZcv2m6OJ7eQ4Gik=gS+D^Y;k7B#@SM=%#E`_ zMgMFiM&`!Zpf=8IO;*On*}9DEjkEPZEKr3x+Zv<|6sxnH7+D%;yK*r$&h}+uZ=4M( zA7+R1GB?f!RZX)&(KtJiiLr5ZGAmQ#>{LOf#@X4-ERD1CI2jvfmoYOn&IZ-xv#UX3 zbxf>{bC}tf8|QE`F*nZPWn^ibBPhk#I7fzwrEw0(RdbY?xfkHz7%KEvXOw5gQBbnJ6=f*NKHqHeVqjS?iR%U{TT##5H$dqD`3raymIWtS+ z+$uK4#(9iPOpWuHnOPg>fx2GvK*I*}1Q^*H=Lvx%q*$05=gBcLH_lT8aa9?a8s~wU z9`m%B85`$;`la&>L9)h-tc~-`nK>Hg*)cIT&I1i=%<}~)2>?le962unq&J$Ksc{~t zT{bV7nW=GJIww=(yc|aE#(DXytc~+(8JHU9Gc&R^&Szs}Zk*4{%G5X?I3!Fi+ zpa#tXUyv#O!i~{X(2|j{aiI+(OXEU2X7Iu&_2RvImKQ%Bn?P z%xsN|d^uPe7lpF0H!g}6WolfM!Nk<`Zc!04YvZC)kO9?L7Y#cEb8jf?f!7#kOx zfpl0fvNbNYWo2nx3~Hz>_GV>lTMyAFk?2OEfOSo8=8kg`hGd3;}W@T<% zBFfI(xI~(nsd0&d7-QoSH4etcC0b%!jY~keX^9m`8>siU#GZw_afuTnZ{rd_Hpa#! zvD}=EOF)Irl3Yff#w7(H1L_#r8kd6l4ogAf6-)UT1sazMu(32QRc2;sT&lsr+_)6f zW?Tx&7E3{moTb)GOpQxz85tXwI5T!`Yb{mx9WX zr3s8IjY~mEU}-uRYvWSTQ0USkM&`z)Wvm>HORJfg8<(*%Ff}d%Rb0z>KwN%irp9F= zjI52z#2J|zmx025nIZ>s<1#f?_QqwPe7ek-lc{l;1uJ7CXzN1bGCOAB#$`?*#h^9K z%c2-L8kfZ|b2ctZV`Xbx1}e3dRWNZiE~{b{Xk5<5#L~E2oQ0!txhykt<8siz+;SZj z#>V9atjvweL7lSY=8Wu(%dME%8<#sXF*Pm+HDH$ev2Zso4`gI)Tn_Tq@&u4X5+hUN z@>Fid#^pJTtc}Y-ak;#NiM?@o89Q_13I=Aj#ucDMy@H34vvCEe*|I{Gg|Tr3XlP*t zsPC{sU4^A_g#jyL;|f!D#>N%qAi@%)#F~+@afK}-Q{xIy-)049AZUdP3rFJ$ZwA)J z6(KBKjVq!VSsGWQu`)HT$OS1bU}kMxQOv~IxB^t;t^{=qRAgW^Y^xY67g3 zV`6Vy2^yDN3F--~)MgZJT&c^<(YO*6bSu4?IU84ks`iypj4X{SV;PwnS0*vCHm*!# zVrpEO!^+#Z5>zX#tY_hDT*b`9-na@>%&!tvmu`xBS3Swt$Tm|a!uZmz|Y+Mz?$lACnj)|#pRSF|Z zSB<#awf*c)pgvA zjcY)|!E2b9m>SoxvM@HT;b3BET*D>6*to{Dae_Y2Id4V(#x?SbHJBRL2rx4?t`Xs4 zYFq;RMyAH~@{Ej)>y?-|8`pz| zkk{)mayPCw0EyXvWbGK48`p!zQP#UMF*UAtXXI^M@5QLmxIUuEo~dzNH4{_gy1K@E zrpEP*#o~?YSz0{Y8aFU9YBg@~U~J@W+)$jzXv)wi+qkhlk;Qa=LgQvx2HwWab&On% zTX+~7QyRC3Co-BdG}bq6tx06G05P`LB(hmDh&S%6VGL>9CBhirxGR&1w{f>8qkQA; zaE7AB-Q|glRwa$xjeD{ZnXDOn8~2tmHX1bUb4g^hVaRRVUz*5hlV8wyAUToA=Am5U z!4QzC2a6LK?Ldsf#fgmeAjZ++L?#D@(8lA%jEx$NCp;6G92w#oPZlvY$~T@0Ok{Kd zDLP%4$mGmm)_As%vAFS^Mk0&zTIR;{GK^Y{=M@+g8_#<)G=?^w&rM`lT1g_K z2T0%bv_wu%2DiqWX^e)Aw{#g98*hQyW4>J;(eAlxzKB{S4;?-E+ r_?RP+aUn?KQ;tN&MIgp=jzq@AAjV6MM8+iyjXaI7L5vAzjc-H&G@*F7 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..51f023e0d609798e72d46bf41309e092d72ccb07 GIT binary patch literal 178 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce9c30a98541e23244876fef9dc67c2639fdd746 GIT binary patch literal 182 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt?xY(U;%025>)|ZOz@Q+~ z5+=wnKgy7SS>U}{^W5C`hFsi?@2&V47~dO9zc*rJV0_Oj&B@5X@SdfSg(sPffx&=- dy~Trpu_cI!vBiynu_d5+ZUJM9ivVMb0|0NrG}izC literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..982ca462b1b047c945d3b7b0123eb42dfd8d48cd GIT binary patch literal 46837 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

n#ux3AxR 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 R&cJYlpFy!nMUA0J8303WB^dw! literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3da0a1c62f19f720590b54fc1de7b027af100945 GIT binary patch literal 680 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 z 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⪙kEpt{TOJfkjtaOIWI?T(Q8Jm)s+e6qU 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..70bf90c0efb66da2a7aa19a820d766cfe3ef3183 GIT binary patch literal 643 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7n+yp0U(2;@|C*i{PB#LmRQ?5Ln7b3hj2sAfj-2~{oS3{{K_ivElY z5GctY4`#73@U$8*FtfDkL&O;w5Hh^6EzIpAj*RL|_k|o84Ho?O4&*jwJ}9)qYe)Ew zFg8{WRyL-6xsF1{BKuecg&265`M7w6_!*>_#F;sor+eGW$}%!A%1X;H2r~#VNH(%? zI|><#9u#2^WfWkQVm4$@VdGiPrd<(?OuNcC8F$r9HDlcC&&s(snTc_4Y(3)vk2uDC zOwDry8TUpf@)<}l-pg)HXS{31&3f0Bjrnc>Bh%dwHpaU#EKGNkm>KV8a4_91VPd{p t&cb-NhKccR9Sh?<_U0KJjQ4UAS(G<0{*RlH!ua2_IfC=QF9YlU2mlu)iK74j literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a83d53ae70ca3d81cda827cc224ec8c5efa4f17 GIT binary patch literal 40539 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d768bf811ffeb0d794b732a82940fa1442af499f GIT binary patch literal 39534 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3d5bf6fb4ef94b452ed1ef0df926fc2bee55e973 GIT binary patch literal 647 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC`d6q=XmbU|^yf8scVXrt9Iz zqBx;7iGh`Yg@M(PQ$b*FC<`+K3m*#ubF+P83Ih`ZI|Gv=8^eYJzWW*37=)Sy%ovy% zm;!~BXWuJP(`Hdp=Mj@;5fb00&CI;dX`dxCbD+2?&n|Z+W+o0MW+r(kt-;31%*4X% z$gQfnE1!WCWCQ~XnAB%xU>0U(2;@|C*i{PB#LmRQ?5Ln7b3hj2sAfj-2~{oS3{{K_ zivElY5GctY4`#73@U$8*FtfDkL&O;w5Hh^6EzIpAj*RL|_k|o84Ho?O4&*jwJ}9)q zYe)EwFg8{WRyL-6xsF1{BKuecg&265`M7w6_!*>_#F;sor+eGW$}%!A%1X;H2r~#V zNH(%?I|><#9u#2^WfWkQVm4$@VdGiPrd<(?OuNcC8F$r9HDlcC&&s(snTc_4Y(3)v zk2uDCOwDry8TUpf@)<}l-pg)HXS{31&3f0Bjrnc>Bh%dwHpaU#EKGNkm>KV8a4_91 xVPd{p&cb-NhKccR9Sh?<_U0KJjQ4UAS(G<0{*RlH!ua2_IfC=QF9YlU2mnZvifsS@ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..09eee10d4fb4b9fe1e70a1ee56825a207ae8034a GIT binary patch literal 40630 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

    LN%a%#4jIY#R+2 z8&~)Q1#jY5o# ztHhf`7#mkQ1{AT?f`jE$>&5}6uT z1%XoJs(L%d#?|bt0gR2Sjold=S6dV^Hm-J#U~F9N(a6T!xH_nbjj?fcmIq_w>cU13 z#>O@5jW&#pYXkxr8`p@5FgC7{EMRP0qvXKYxJFZ&v2l$Ks4QFK&>Y0rxTd&?ld*9v zdnIGzT2LXgR-Bo!ajm2sW8+$tW)9}YwGM2IjcZ*R{TLh9hJq5|+Vp0Brp9$#jl7JF z>m(%@8`sI_F*dGK6Jl&!r=iQ(xX!RCim`E>pA2K;x&TYY#&x05jE(D3W0)G(75FkX zuB-H9Y+TR4#@M)?If$`wJ#Qn3Dd)=ExL&2vk+E^TVVv_pvYREkNea_Kb}iGQ1cYHxz=@lo&8JZm8vCY}`=a=*iT$k%xn^aU(w{vu>1Zv}A1D zsB6dAxY1aIv2mlBBxB=7YaYhNjdmbKj%-Yg8=cvi8aKMJFg9-VRAp@3=r6$3xG~6> zv2kOx8Drzd)J7%7#*KAGOpTj3co`cvaW{uEHf~Y@`EZkt5M$#eeQCzVO-4=fjE$RI zycrue`5H1dZVGEIWNO@0#m?BcsTM@kdowm}=4e!7Y}_mUNh%`S|Mn|KwK{;YaZ+e|0b}E2ApjaQuI2y$ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6c546001331cf4f2f68563229f994b55730dfdb1 GIT binary patch literal 681 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¬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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..643f921b65819c9e8c80a97c51fc68a89053bd51 GIT binary patch literal 705 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygOCpkUpY z&cJYlpFy!nMUA0JnTz3o@4k43y`d}&dqWr)_J%Vu-sfdv+$ZA5qBx;7iGh`Yg@M(P zPeFBW6azDNYaWA8vw#@`GXs-+OC$pm13Lqgbz`m=bE6T9BctNf`(}x3stk;~EEyPg znKLl%vSnc0WzE32%aMU`mwlkPD$g!=CT1oMCT1piD6PT9%FM*VTqvNb%(yFyVOKuG zu3Uy)ISjk<7?&Z`Rm89>nrT-o!>$;nT?q`kf|+)OGVBUr+7*$=sA|i!t2~fX z)nQjD$W(SF4(3EgRZqrUb%~s6G7JY~85j;oGcX*GV_-NS)6B?lKyX4l<6eJO&b`Tu z3s?odeXI-z zMHmipG2HcGI4I0;*N^#b0K-8=rn?~w2RRuI$}rpwXSf^5u#cZ%A1CA87>0u?4EqEN z6^wNm?#46SO=38x#&9>4;UFL5-3*3(+zfZ~815D@9294`TgY%wmf>y|!`&jLyCn>F ziy00|Gv6&|IH<~Sx0+!e3&TDk#=A8P``8%{3NqfUW7x;TaF2=M9vj0wX2yH$3YghA>bJW= literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c148f67f5e9fe4a108519eeaace89e708a51f8f5 GIT binary patch literal 689 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygODuz}%# z@4k43y`d}&dqWr)_J%Vu-sfdv+$ZA5qBx;7iGh`Yg@M(PPeFBW6azDNYaWA8vw#@` zGXs-+OC$pm13Lqgbz`m=bE6T9BctNf`(}x3stk;~EEyPgnKLl%vSnc0WzE32%aMU` zmwlkPD$g!=CT1oMCT1piD6PT9%FM*VTqvNb%(yFyVOKuGu3Uy)ISjk<7?&Z` zRm89>nrT-o!>$;nT?q`kf|+)OGVBUr+7*$=sA|i!t2~fX)nQjD$W(SF4(3EgRZqrU zb%~s6G7JY~85j;oGcX*GV_-NS)6B?lKyX4l<6eJO&b`Tu3s?odeXI-zMHmipG2HcGI4I0;*N^#b z0K-8=rn?~w2RRuI$}rpwXSf^5u#cZ%A1CA87>0u?4EqEN6^wNm?#46SO=38x#&9>4 z;UFL5-3*3(+zfZ~815D@9294`TgY%wmf>y|!`&jLyCn>Fiy00|Gv6&|IH<~Sx0+!e z3&TDk#=A8P``8%{3NqfUW7x;TaF2=M9vj0wX2yH$3YghA D#+kS~ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1849d809a679e56414f4e18dce8ca3c41109e84e GIT binary patch literal 726 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtygNKXamCm z-z3&Y4HFplhO#j14Pju|8_vjhpO=YopNJF7qqYgHNerwEEDWqpe2*HI?u}w#=5Ebn z5b6yuV_;@rl5dG*U}9irU}~&x%oSs9En;zEeAG7ezF896qbUuHyDS+PcbPLV?y_ZI z+-1$cxXY1&ahH9N_@gO3yWE+WnK+o3ndG6g1{*6g6AN>Zz@sUP8Fytd?8;}@mCLXz zhhbM9!>&SxT?GugiWqi9Gwq6H*cHRHD}iBGFw?G3hFu{{yCRYpA5GcIw5vRb^U>6X zU8Nv{*_k+)lNcXO?PT0lm&EyK#vFzNvJ4Cdq!}0v$T2V+km+G$I3U=3IG%B@KP%_n zWJZPqehiFzW0M#k&1qt|FXSZoxM9xTFor5dhQ>sHMg|C!WN3^BGuaq;S`8SOSz7fW z5{wLukqq)ssU()i&087wF|ji24W8)Ca8Qnc@vd1A_v4=CgF-vJc7*Q;V`JrDWn#BflJ;chC!K|aR284UZl8SdsW+$~@@D9&)V zkl~;#!`&=~yG4w5ONxXZ_ck!xEn~P_%y3Ye`EEJGK~;vk)eQSs81@M<-mPKS$Ift2 zknwIE!#*B{drS=X*ck3HGu~roI4F_C_PBR9!#y4bhI`x$4EMMg818X0FdSsraMy!z wZ?qHV`#p2_=E}-4GBCf@bHIm@%Zc&*o>})?0c9%VT>t<8 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a83a677c56df6f1ac395d2ba71e60a08b0985e97 GIT binary patch literal 40517 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f527248ad547015ad8af1181e646da3b235de08f GIT binary patch literal 684 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC`d9GaKuvwdR<0}}%~1Cui|1B2p`1LX|N3{1ho z3=GP%@0F-&vnZ+ah)J^uiSN^9X5Qzt&ytxrSe$`Dm1mbb6EhPB6El-Ml-6KlWoBYw zcIIYaP*vTP&%g>Yh=B!6>N7Ji3o|nWb22cfI_xS1X=G>OV0KnuU{I4eAPaF=Go$!~ zs+MwwDn6w-nU9NCh@U}VBBRd&bTX!gK1YRBh#(~My6e%j7+;C z7@2mJb29F#n`*|m*PoShZ!#0(-q?D^10HdV`PqGv3YMV7gnv#C*4$h4F3;6XV@F7RGz*%`-R{@8u@5 aFfb@@VEi99BZcw5XLAJSe_saH{}BL5g^P>; literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e1a988dc9e80be9a0803e22d021b1e81fdcc5b94 GIT binary patch literal 40608 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b5b94852a57b19bcb357a6cae2cae2e7910e05a1 GIT binary patch literal 25783 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 CEvY#G literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..026adcaad4c56cb1989bd31cbcf3ad21f3965a17 GIT binary patch literal 178 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqJb9BicPktn1f%($8{>XnCWig|j12n)xLNlLN;B*i aXJptf!N{;*QkrSM6a&M)x<(d;{jvZScs2|G literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fd4e66e81f3507b190fb2986a26a45c1c380e302 GIT binary patch literal 26327 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 L>wZCNru|X?)N3(k literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..769d2142c03b10680800b3b6ae883e27fe04c5a2 GIT binary patch literal 26451 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bdab208b69d287128195eccbd084c8cf4ca658c3 GIT binary patch literal 168 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;%025>*37Jz@Q+u zua=K}ey&3E+*}4O7Dfgg9!3U6208Oa7Mo;t1_lLT#(mZEa~StkuyXEaWMbS`-#oX7 PaX+sB>wZCNru|X?W%4m; literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap b/web/public/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ff8674af772af896d7d33c7addc37c57822f8a2 GIT binary patch literal 27790 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 RV%*Owz`9?sv6^YW6ad@#ITio_ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/V.bcmap b/web/public/vendor/pdfjs/cmaps/V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fdec9906621904180f42bd5c91f377397fd6cf95 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=#j{(sKmI}pOXar_}BoKm$jH;!K`8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN54}kYHrkSHZBaieY~}!vPlI zeYKqXWf=BXG42at*k8@KFN|S-4a2@vrhO5N`)e5wFfi_oX4o6XaDa(nUoz9aXodsK clKTxf4zM!p4^LoD6ga@gz_729f#rZa00b2~8~^|S literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/pdf.min.mjs b/web/public/vendor/pdfjs/pdf.min.mjs new file mode 100644 index 00000000..5822350b --- /dev/null +++ b/web/public/vendor/pdfjs/pdf.min.mjs @@ -0,0 +1,28 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ +/** + * pdfjsVersion = 5.7.284 + * pdfjsBuild = 7e5b36c2d + */const t=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type),e=[1/0,1/0,-1/0,-1/0],i=new Float32Array(e),s=[.001,0,0,.001,0,0],n=1.35,r=1,a=2,o=4,l=16,h=32,d=64,c=128,u=256,p={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3},g="pdfjs_internal_editor_",m={DISABLE:-1,NONE:0,FREETEXT:3,HIGHLIGHT:9,STAMP:13,INK:15,POPUP:16,SIGNATURE:101,COMMENT:102},f={RESIZE:1,CREATE:2,FREETEXT_SIZE:11,FREETEXT_COLOR:12,FREETEXT_OPACITY:13,INK_COLOR:21,INK_THICKNESS:22,INK_OPACITY:23,INK_COLOR_AND_OPACITY:24,HIGHLIGHT_COLOR:31,HIGHLIGHT_THICKNESS:32,HIGHLIGHT_FREE:33,HIGHLIGHT_SHOW_ALL:34,DRAW_STEP:41},b={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048},y=0,A=1,v=2,w=3,x=3,C=4,E={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3},T={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26},S=1,_=2,P=3,D=4,M=5,k={ERRORS:0,WARNINGS:1,INFOS:5},I={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotation:80,endAnnotation:81,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91,setStrokeTransparent:92,setFillTransparent:93,rawFillPath:94},F=0,B=1,R=2,O=3,L=4,N={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let U=k.WARNINGS;function setVerbosityLevel(t){Number.isInteger(t)&&(U=t)}function getVerbosityLevel(){return U}function info(t){U>=k.INFOS&&console.info(`Info: ${t}`)}function warn(t){U>=k.WARNINGS&&console.warn(`Warning: ${t}`)}function unreachable(t){throw new Error(t)}function assert(t,e){t||unreachable(e)}function createValidAbsoluteUrl(t,e=null,i=null){if(!t)return null;if(i&&"string"==typeof t){if(i.addDefaultProtocol&&t.startsWith("www.")){const e=t.match(/\./g);e?.length>=2&&(t=`http://${t}`)}if(i.tryConvertEncoding)try{t=function stringToUTF8String(t){return decodeURIComponent(escape(t))}(t)}catch{}}const s=e?URL.parse(t,e):URL.parse(t);return function _isValidProtocol(t){switch(t?.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(s)?s:null}function updateUrlHash(t,e,i=!1){const s=URL.parse(t);if(s){s.hash=e;return s.href}return i&&createValidAbsoluteUrl(t,"http://example.com")?t.split("#",1)[0]+""+(e?`#${e}`:""):""}function stripPath(t){return t.substring(t.lastIndexOf("/")+1)}function shadow(t,e,i,s=!1){Object.defineProperty(t,e,{value:i,enumerable:!s,configurable:!0,writable:!1});return i}const H=function BaseExceptionClosure(){function BaseException(t,e){this.message=t;this.name=e}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();class PasswordException extends H{constructor(t,e){super(t,"PasswordException");this.code=e}}class UnknownErrorException extends H{constructor(t,e){super(t,"UnknownErrorException");this.details=e}}class InvalidPDFException extends H{constructor(t){super(t,"InvalidPDFException")}}class ResponseException extends H{constructor(t,e,i){super(t,"ResponseException");this.status=e;this.missing=i}}class FormatError extends H{constructor(t){super(t,"FormatError")}}class AbortException extends H{constructor(t){super(t,"AbortException")}}function stringToBytes(t){"string"!=typeof t&&unreachable("Invalid argument for stringToBytes");const e=t.length,i=new Uint8Array(e);for(let s=0;s{if("undefined"==typeof document)return!1;const t=document.createElement("input");t.type="color";t.setAttribute("alpha","");t.value="#ff000080";return"#ff0000"!==t.value})())}}class Util{static get hexNums(){return shadow(this,"hexNums",Array.from(Array(256).keys(),t=>t.toString(16).padStart(2,"0")))}static makeHexColor(t,e,i){return`#${this.hexNums[t]}${this.hexNums[e]}${this.hexNums[i]}`}static domMatrixToTransform(t){return[t.a,t.b,t.c,t.d,t.e,t.f]}static scaleMinMax(t,e){let i;if(t[0]){if(t[0]<0){i=e[0];e[0]=e[2];e[2]=i}e[0]*=t[0];e[2]*=t[0];if(t[3]<0){i=e[1];e[1]=e[3];e[3]=i}e[1]*=t[3];e[3]*=t[3]}else{i=e[0];e[0]=e[1];e[1]=i;i=e[2];e[2]=e[3];e[3]=i;if(t[1]<0){i=e[1];e[1]=e[3];e[3]=i}e[1]*=t[1];e[3]*=t[1];if(t[2]<0){i=e[0];e[0]=e[2];e[2]=i}e[0]*=t[2];e[2]*=t[2]}e[0]+=t[4];e[1]+=t[5];e[2]+=t[4];e[3]+=t[5]}static transform(t,e){return[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],t[0]*e[4]+t[2]*e[5]+t[4],t[1]*e[4]+t[3]*e[5]+t[5]]}static multiplyByDOMMatrix(t,e){return[t[0]*e.a+t[2]*e.b,t[1]*e.a+t[3]*e.b,t[0]*e.c+t[2]*e.d,t[1]*e.c+t[3]*e.d,t[0]*e.e+t[2]*e.f+t[4],t[1]*e.e+t[3]*e.f+t[5]]}static applyTransform(t,e,i=0){const s=t[i],n=t[i+1];t[i]=s*e[0]+n*e[2]+e[4];t[i+1]=s*e[1]+n*e[3]+e[5]}static applyTransformToBezier(t,e,i=0){const s=e[0],n=e[1],r=e[2],a=e[3],o=e[4],l=e[5];for(let e=0;e<6;e+=2){const h=t[i+e],d=t[i+e+1];t[i+e]=h*s+d*r+o;t[i+e+1]=h*n+d*a+l}}static applyInverseTransform(t,e){const i=t[0],s=t[1],n=e[0]*e[3]-e[1]*e[2];t[0]=(i*e[3]-s*e[2]+e[2]*e[5]-e[4]*e[3])/n;t[1]=(-i*e[1]+s*e[0]+e[4]*e[1]-e[5]*e[0])/n}static axialAlignedBoundingBox(t,e,i){const s=e[0],n=e[1],r=e[2],a=e[3],o=e[4],l=e[5],h=t[0],d=t[1],c=t[2],u=t[3];let p=s*h+o,g=p,m=s*c+o,f=m,b=a*d+l,y=b,A=a*u+l,v=A;if(0!==n||0!==r){const t=n*h,e=n*c,i=r*d,s=r*u;p+=i;f+=i;m+=s;g+=s;b+=t;v+=t;A+=e;y+=e}i[0]=Math.min(i[0],p,m,g,f);i[1]=Math.min(i[1],b,A,y,v);i[2]=Math.max(i[2],p,m,g,f);i[3]=Math.max(i[3],b,A,y,v)}static inverseTransform(t){const e=t[0]*t[3]-t[1]*t[2];return[t[3]/e,-t[1]/e,-t[2]/e,t[0]/e,(t[2]*t[5]-t[4]*t[3])/e,(t[4]*t[1]-t[5]*t[0])/e]}static singularValueDecompose2dScale(t,e){const i=t[0],s=t[1],n=t[2],r=t[3],a=i**2+s**2,o=i*n+s*r,l=n**2+r**2,h=(a+l)/2,d=Math.sqrt(h**2-(a*l-o**2));e[0]=Math.sqrt(h+d||1);e[1]=Math.sqrt(h-d||1)}static normalizeRect(t){const e=t.slice(0);if(t[0]>t[2]){e[0]=t[2];e[2]=t[0]}if(t[1]>t[3]){e[1]=t[3];e[3]=t[1]}return e}static intersect(t,e){const i=Math.max(Math.min(t[0],t[2]),Math.min(e[0],e[2])),s=Math.min(Math.max(t[0],t[2]),Math.max(e[0],e[2]));if(i>s)return null;const n=Math.max(Math.min(t[1],t[3]),Math.min(e[1],e[3])),r=Math.min(Math.max(t[1],t[3]),Math.max(e[1],e[3]));return n>r?null:[i,n,s,r]}static pointBoundingBox(t,e,i){i[0]=Math.min(i[0],t);i[1]=Math.min(i[1],e);i[2]=Math.max(i[2],t);i[3]=Math.max(i[3],e)}static rectBoundingBox(t,e,i,s,n){n[0]=Math.min(n[0],t,i);n[1]=Math.min(n[1],e,s);n[2]=Math.max(n[2],t,i);n[3]=Math.max(n[3],e,s)}static#t(t,e,i,s,n,r,a,o,l,h){if(l<=0||l>=1)return;const d=1-l,c=l*l,u=c*l,p=d*(d*(d*t+3*l*e)+3*c*i)+u*s,g=d*(d*(d*n+3*l*r)+3*c*a)+u*o;h[0]=Math.min(h[0],p);h[1]=Math.min(h[1],g);h[2]=Math.max(h[2],p);h[3]=Math.max(h[3],g)}static#e(t,e,i,s,n,r,a,o,l,h,d,c){if(Math.abs(l)<1e-12){Math.abs(h)>=1e-12&&this.#t(t,e,i,s,n,r,a,o,-d/h,c);return}const u=h**2-4*d*l;if(u<0)return;const p=Math.sqrt(u),g=2*l;this.#t(t,e,i,s,n,r,a,o,(-h+p)/g,c);this.#t(t,e,i,s,n,r,a,o,(-h-p)/g,c)}static bezierBoundingBox(t,e,i,s,n,r,a,o,l){l[0]=Math.min(l[0],t,a);l[1]=Math.min(l[1],e,o);l[2]=Math.max(l[2],t,a);l[3]=Math.max(l[3],e,o);this.#e(t,i,n,a,e,s,r,o,3*(3*(i-n)-t+a),6*(t-2*i+n),3*(i-t),l);this.#e(t,i,n,a,e,s,r,o,3*(3*(s-r)-e+o),6*(e-2*s+r),3*(s-e),l)}}let z=null,G=null;function normalizeUnicode(t){if(!z){z=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu;G=new Map([["ſt","ſt"]])}return t.replaceAll(z,(t,e,i)=>e?e.normalize("NFKC"):G.get(i))}function getUuid(){if("function"==typeof crypto.randomUUID)return crypto.randomUUID();const t=new Uint8Array(32);crypto.getRandomValues(t);return function bytesToString(t){"object"==typeof t&&void 0!==t?.length||unreachable("Invalid argument for bytesToString");const e=t.length,i=8192;if(e[],makeMap=()=>new Map,makeObj=()=>Object.create(null);function MathClamp(t,e,i){return Math.min(Math.max(t,e),i)}class XfaText{static textContent(t){const e=[],i={items:e,styles:Object.create(null)};!function walk(t){if(!t)return;let i=null;const s=t.name;if("#text"===s)i=t.value;else{if(!XfaText.shouldBuildText(s))return;t?.attributes?.textContent?i=t.attributes.textContent:t.value&&(i=t.value)}null!==i&&e.push({str:i});if(t.children)for(const e of t.children)walk(e)}(t);return i}static shouldBuildText(t){return!("textarea"===t||"input"===t||"option"===t||"select"===t)}}class XfaLayer{static setupStorage(t,e,i,s,n){const r=s.getValue(e,{value:null});switch(i.name){case"textarea":null!==r.value&&(t.textContent=r.value);if("print"===n)break;t.addEventListener("input",t=>{s.setValue(e,{value:t.target.value})});break;case"input":if("radio"===i.attributes.type||"checkbox"===i.attributes.type){r.value===i.attributes.xfaOn?t.setAttribute("checked",!0):r.value===i.attributes.xfaOff&&t.removeAttribute("checked");if("print"===n)break;t.addEventListener("change",t=>{s.setValue(e,{value:t.target.checked?t.target.getAttribute("xfaOn"):t.target.getAttribute("xfaOff")})})}else{null!==r.value&&t.setAttribute("value",r.value);if("print"===n)break;t.addEventListener("input",t=>{s.setValue(e,{value:t.target.value})})}break;case"select":if(null!==r.value){t.setAttribute("value",r.value);for(const t of i.children)t.attributes.value===r.value?t.attributes.selected=!0:Object.hasOwn(t.attributes,"selected")&&delete t.attributes.selected}t.addEventListener("input",t=>{const i=t.target.options,n=-1===i.selectedIndex?"":i[i.selectedIndex].value;s.setValue(e,{value:n})})}}static setAttributes({html:t,element:e,storage:i=null,intent:s,linkService:n}){const{attributes:r}=e,a=t instanceof HTMLAnchorElement;"radio"===r.type&&(r.name=`${r.name}-${s}`);for(const[e,i]of Object.entries(r))if(null!=i)switch(e){case"class":i.length&&t.setAttribute(e,i.join(" "));break;case"dataId":break;case"id":t.setAttribute("data-element-id",i);break;case"style":Object.assign(t.style,i);break;case"textContent":t.textContent=i;break;default:(!a||"href"!==e&&"newWindow"!==e)&&t.setAttribute(e,i)}a&&n.addLinkAttributes(t,r.href,r.newWindow);i&&r.dataId&&this.setupStorage(t,r.dataId,e,i)}static render(t){const e=t.annotationStorage,i=t.linkService,s=t.xfaHtml,n=t.intent||"display",r=document.createElement(s.name);s.attributes&&this.setAttributes({html:r,element:s,intent:n,linkService:i});const a="richText"!==n,o=t.div;o.append(r);if(t.viewport){const e=`matrix(${t.viewport.transform.join(",")})`;o.style.transform=e}a&&o.setAttribute("class","xfaLayer xfaFont");const l=[];if(0===s.children.length){if(s.value){const t=document.createTextNode(s.value);r.append(t);a&&XfaText.shouldBuildText(s.name)&&l.push(t)}return{textDivs:l}}const h=[[s,-1,r]];for(;h.length>0;){const[t,s,r]=h.at(-1);if(s+1===t.children.length){h.pop();continue}const o=t.children[++h.at(-1)[1]];if(null===o)continue;const{name:d}=o;if("#text"===d){const t=document.createTextNode(o.value);l.push(t);r.append(t);continue}const c=o?.attributes?.xmlns?document.createElementNS(o.attributes.xmlns,d):document.createElement(d);r.append(c);o.attributes&&this.setAttributes({html:c,element:o,storage:e,intent:n,linkService:i});if(o.children?.length>0)h.push([o,-1,c]);else if(o.value){const t=document.createTextNode(o.value);a&&XfaText.shouldBuildText(d)&&l.push(t);c.append(t)}}for(const t of o.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))t.setAttribute("readOnly",!0);return{textDivs:l}}static update(t){const e=`matrix(${t.viewport.transform.join(",")})`;t.div.style.transform=e;t.div.hidden=!1}}const V="http://www.w3.org/2000/svg";class PixelsPerInch{static CSS=96;static PDF=72;static PDF_TO_CSS_UNITS=this.CSS/this.PDF}async function fetchData(t,e="text"){if(isValidFetchUrl(t,document.baseURI)){const i=await fetch(t);if(!i.ok)throw new Error(i.statusText);switch(e){case"blob":return i.blob();case"bytes":return i.bytes();case"json":return i.json()}return i.text()}return new Promise((i,s)=>{const n=new XMLHttpRequest;n.open("GET",t,!0);n.responseType="bytes"===e?"arraybuffer":e;n.onreadystatechange=()=>{if(n.readyState===XMLHttpRequest.DONE)if(200!==n.status&&0!==n.status)s(new Error(n.statusText));else{switch(e){case"bytes":i(new Uint8Array(n.response));return;case"blob":case"json":i(n.response);return}i(n.responseText)}};n.send(null)})}class PageViewport{constructor({viewBox:t,userUnit:e,scale:i,rotation:s,offsetX:n=0,offsetY:r=0,dontFlip:a=!1}){this.viewBox=t;this.userUnit=e;this.scale=i;this.rotation=s;this.offsetX=n;this.offsetY=r;i*=e;const o=(t[2]+t[0])/2,l=(t[3]+t[1])/2;let h,d,c,u,p,g,m,f;(s%=360)<0&&(s+=360);switch(s){case 180:h=-1;d=0;c=0;u=1;break;case 90:h=0;d=1;c=1;u=0;break;case 270:h=0;d=-1;c=-1;u=0;break;case 0:h=1;d=0;c=0;u=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}if(a){c=-c;u=-u}if(0===h){p=Math.abs(l-t[1])*i+n;g=Math.abs(o-t[0])*i+r;m=(t[3]-t[1])*i;f=(t[2]-t[0])*i}else{p=Math.abs(o-t[0])*i+n;g=Math.abs(l-t[1])*i+r;m=(t[2]-t[0])*i;f=(t[3]-t[1])*i}this.transform=[h*i,d*i,c*i,u*i,p-h*i*o-c*i*l,g-d*i*o-u*i*l];this.width=m;this.height=f}get rawDims(){const t=this.viewBox;return shadow(this,"rawDims",{pageWidth:t[2]-t[0],pageHeight:t[3]-t[1],pageX:t[0],pageY:t[1]})}clone({scale:t=this.scale,rotation:e=this.rotation,offsetX:i=this.offsetX,offsetY:s=this.offsetY,dontFlip:n=!1}={}){return new PageViewport({viewBox:this.viewBox.slice(),userUnit:this.userUnit,scale:t,rotation:e,offsetX:i,offsetY:s,dontFlip:n})}convertToViewportPoint(t,e){const i=[t,e];Util.applyTransform(i,this.transform);return i}convertToViewportRectangle(t){const e=[t[0],t[1]];Util.applyTransform(e,this.transform);const i=[t[2],t[3]];Util.applyTransform(i,this.transform);return[e[0],e[1],i[0],i[1]]}convertToPdfPoint(t,e){const i=[t,e];Util.applyInverseTransform(i,this.transform);return i}}class RenderingCancelledException extends H{constructor(t,e=0){super(t,"RenderingCancelledException");this.extraDelay=e}}function isDataScheme(t){const e=t.length;let i=0;for(;i{try{return new URL(t)}catch{try{return new URL(decodeURIComponent(t))}catch{try{return new URL(t,"https://foo.bar")}catch{try{return new URL(decodeURIComponent(t),"https://foo.bar")}catch{return null}}}}})(t);if(!i)return e;const decode=t=>{try{let e=decodeURIComponent(t);if(e.includes("/")){e=stripPath(e);if(/^\.pdf$/i.test(e))return t}return e}catch{return t}},s=/\.pdf$/i,n=stripPath(i.pathname);if(s.test(n))return decode(n);if(i.searchParams.size>0){const getLast=t=>[...t].findLast(t=>s.test(t)),t=getLast(i.searchParams.values())??getLast(i.searchParams.keys());if(t)return decode(t)}if(i.hash){const t=/[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i.exec(i.hash);if(t)return decode(t[0])}return e}class StatTimer{#i=new Map;times=[];time(t){this.#i.has(t)&&warn(`Timer is already running for ${t}`);this.#i.set(t,Date.now())}timeEnd(t){this.#i.has(t)||warn(`Timer has not been started for ${t}`);this.times.push({name:t,start:this.#i.get(t),end:Date.now()});this.#i.delete(t)}toString(){const t=Math.max(...this.times.map(t=>t.name.length));return this.times.map(e=>`${e.name.padEnd(t)} ${e.end-e.start}ms\n`).join("")}}function isValidFetchUrl(t,e){const i=e?URL.parse(t,e):URL.parse(t);return/https?:/.test(i?.protocol??"")}function noContextMenu(t){t.preventDefault()}function stopEvent(t){t.preventDefault();t.stopPropagation()}class PDFDateString{static#s;static toDateObject(t){if(t instanceof Date)return t;if(!t||"string"!=typeof t)return null;this.#s||=new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?");const e=this.#s.exec(t);if(!e)return null;const i=parseInt(e[1],10);let s=parseInt(e[2],10);s=s>=1&&s<=12?s-1:0;let n=parseInt(e[3],10);n=n>=1&&n<=31?n:1;let r=parseInt(e[4],10);r=r>=0&&r<=23?r:0;let a=parseInt(e[5],10);a=a>=0&&a<=59?a:0;let o=parseInt(e[6],10);o=o>=0&&o<=59?o:0;const l=e[7]||"Z";let h=parseInt(e[8],10);h=h>=0&&h<=23?h:0;let d=parseInt(e[9],10)||0;d=d>=0&&d<=59?d:0;if("-"===l){r+=h;a+=d}else if("+"===l){r-=h;a-=d}return new Date(Date.UTC(i,s,n,r,a,o))}}function getXfaPageViewport(t,{scale:e=1,rotation:i=0}){const{width:s,height:n}=t.attributes.style,r=[0,0,parseInt(s,10),parseInt(n,10)];return new PageViewport({viewBox:r,userUnit:1,scale:e,rotation:i})}function getRGBA(t){if(t.startsWith("#")){const e=t.slice(1);return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16),e.length>=8?parseInt(e.slice(6,8),16)/255:1]}if(t.startsWith("rgb(")){const[e,i,s]=t.slice(4,-1).split(",").map(t=>parseInt(t,10));return[e,i,s,1]}if(t.startsWith("rgba(")){const e=t.slice(5,-1).split(",");return[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10),parseFloat(e[3])]}const e=t.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+|none))?\)$/);return e?[Math.round(255*parseFloat(e[1])),Math.round(255*parseFloat(e[2])),Math.round(255*parseFloat(e[3])),void 0!==e[4]&&"none"!==e[4]?parseFloat(e[4]):1]:null}function getRGB(t){const e=getRGBA(t);if(!e){warn(`Not a valid color format: "${t}"`);return[0,0,0]}return e.slice(0,3)}function getCurrentTransform(t){const{a:e,b:i,c:s,d:n,e:r,f:a}=t.getTransform();return[e,i,s,n,r,a]}function getCurrentTransformInverse(t){const{a:e,b:i,c:s,d:n,e:r,f:a}=t.getTransform().invertSelf();return[e,i,s,n,r,a]}function setLayerDimensions(t,e,i=!1,s=!0){if(e instanceof PageViewport){const{pageWidth:s,pageHeight:n}=e.rawDims,{style:r}=t,a=FeatureTest.isCSSRoundSupported,o=`var(--total-scale-factor) * ${s}px`,l=`var(--total-scale-factor) * ${n}px`,h=a?`round(down, ${o}, var(--scale-round-x))`:`calc(${o})`,d=a?`round(down, ${l}, var(--scale-round-y))`:`calc(${l})`;if(i&&e.rotation%180!=0){r.width=d;r.height=h}else{r.width=h;r.height=d}}s&&t.setAttribute("data-main-rotation",e.rotation)}class OutputScale{constructor(){const{pixelRatio:t}=OutputScale;this.sx=t;this.sy=t}get scaled(){return 1!==this.sx||1!==this.sy}get symmetric(){return this.sx===this.sy}limitCanvas(t,e,i,s,n=-1){let r=1/0,a=1/0,o=1/0;(i=OutputScale.capPixels(i,n))>0&&(r=Math.sqrt(i/(t*e)));if(-1!==s){a=s/t;o=s/e}const l=Math.min(r,a,o);if(this.sx>l||this.sy>l){this.sx=l;this.sy=l;return!0}return!1}static get pixelRatio(){return globalThis.devicePixelRatio||1}static capPixels(t,e){if(e>=0){const i=Math.ceil(window.screen.availWidth*window.screen.availHeight*this.pixelRatio**2*(1+e/100));return t>0?Math.min(t,i):i}return t}}const j=["image/apng","image/avif","image/bmp","image/gif","image/jpeg","image/png","image/svg+xml","image/webp","image/x-icon"];class ColorScheme{static get isDarkMode(){return shadow(this,"isDarkMode",!!window?.matchMedia?.("(prefers-color-scheme: dark)").matches)}}class CSSConstants{static get commentForegroundColor(){const t=document.createElement("span");t.classList.add("comment","sidebar");const{style:e}=t;e.width=e.height="0";e.display="none";e.color="var(--comment-fg-color)";document.body.append(t);const{color:i}=window.getComputedStyle(t);t.remove();return shadow(this,"commentForegroundColor",getRGB(i))}}function applyOpacity(t,e){const i=255*(1-(e=MathClamp(e??1,0,1)));return t.map(t=>Math.round(t*e+i))}function RGBToHSL(t,e){const i=t[0]/255,s=t[1]/255,n=t[2]/255,r=Math.max(i,s,n),a=Math.min(i,s,n),o=(r+a)/2;if(r===a)e[0]=e[1]=0;else{const t=r-a;e[1]=o<.5?t/(r+a):t/(2-r-a);switch(r){case i:e[0]=60*((s-n)/t+(sn?(s+.05)/(n+.05):(n+.05)/(s+.05)}const $=new Map;function findContrastColor(t,e){const i=t[0]+256*t[1]+65536*t[2]+16777216*e[0]+4294967296*e[1]+1099511627776*e[2];let s=$.get(i);if(s)return s;const n=new Float32Array(9),r=n.subarray(0,3),a=n.subarray(3,6);RGBToHSL(t,a);const o=n.subarray(6,9);RGBToHSL(e,o);const l=o[2]<.5,h=l?12:4.5;a[2]=l?Math.sqrt(a[2]):1-Math.sqrt(1-a[2]);if(contrastRatio(a,o,r)i;){const i=a[2]=(t+e)/2;l===contrastRatio(a,o,r){e.delete()},{signal:e._signal});this.#o.append(i)}get#b(){const t=document.createElement("div");t.className="divider";return t}async addAltText(t){const e=await t.render();this.#f(e);this.#o.append(e,this.#b);this.#l=t}addComment(t,e=null){if(this.#h)return;const i=t.renderForToolbar();if(!i)return;this.#f(i);const s=this.#d=this.#b;if(e){this.#o.insertBefore(i,e);this.#o.insertBefore(s,e)}else this.#o.append(i,s);this.#h=t;t.toolbar=this}addColorPicker(t){if(this.#r)return;this.#r=t;const e=t.renderButton();this.#f(e);this.#o.append(e,this.#b)}async addEditSignatureButton(t){const e=this.#c=await t.renderEditButton(this.#a);this.#f(e);this.#o.append(e,this.#b)}removeButton(t){if("comment"===t){this.#h?.removeToolbarCommentButton();this.#h=null;this.#d?.remove();this.#d=null}}async addButton(t,e){switch(t){case"colorPicker":e&&this.addColorPicker(e);break;case"altText":e&&await this.addAltText(e);break;case"editSignature":e&&await this.addEditSignatureButton(e);break;case"delete":this.addDeleteButton();break;case"comment":e&&this.addComment(e)}}async addButtonBefore(t,e,i){if(!e&&"comment"===t)return;const s=this.#o.querySelector(i);s&&"comment"===t&&this.addComment(e,s)}updateEditSignatureButton(t){this.#c&&(this.#c.title=t)}remove(){this.#n.remove();this.#r?.destroy();this.#r=null}}class FloatingToolbar{#o=null;#n=null;#y;constructor(t){this.#y=t}#A(){const t=this.#n=document.createElement("div");t.className="editToolbar";t.setAttribute("role","toolbar");const e=this.#y._signal;e instanceof AbortSignal&&!e.aborted&&t.addEventListener("contextmenu",noContextMenu,{signal:e});const i=this.#o=document.createElement("div");i.className="buttons";t.append(i);this.#y.hasCommentManager()&&this.#v("commentButton","pdfjs-comment-floating-button","pdfjs-comment-floating-button-label",()=>{this.#y.commentSelection("floating_button")});this.#v("highlightButton","pdfjs-highlight-floating-button1","pdfjs-highlight-floating-button-label",()=>{this.#y.highlightSelection("floating_button")});return t}#w(t,e){let i=0,s=0;for(const n of t){const t=n.y+n.height;if(ti){s=r;i=t}else e?r>s&&(s=r):r=1}static clearPointerType(){CurrentPointers.#T=null}static clearPointerIds(){CurrentPointers.#x=NaN;CurrentPointers.#C=null}static clearTimeStamp(){CurrentPointers.#E=NaN}}class IdManager{#S=0;get id(){return`${g}${this.#S++}`}}class ImageManager{#_=getUuid();#S=0;#P=null;static get _isSVGFittingCanvas(){const t=new OffscreenCanvas(1,3).getContext("2d",{willReadFrequently:!0}),e=new Image;e.src='data:image/svg+xml;charset=UTF-8,';return shadow(this,"_isSVGFittingCanvas",e.decode().then(()=>{t.drawImage(e,0,0,1,1,0,0,1,3);return 0===new Uint32Array(t.getImageData(0,0,1,1).data.buffer)[0]}))}async#D(t,e){this.#P||=new Map;let i=this.#P.get(t);if(null===i)return null;if(i?.bitmap){i.refCounter+=1;return i}try{i||={bitmap:null,id:`image_${this.#_}_${this.#S++}`,refCounter:0,isSvg:!1};let t;if("string"==typeof e){i.url=e;t=await fetchData(e,"blob")}else e instanceof File?t=i.file=e:e instanceof Blob&&(t=e);if("image/svg+xml"===t.type){const e=ImageManager._isSVGFittingCanvas,s=new FileReader,n=new Image,r=new Promise((t,r)=>{n.onload=()=>{i.bitmap=n;i.isSvg=!0;t()};s.onload=async()=>{const t=i.svgUrl=s.result;n.src=await e?`${t}#svgView(preserveAspectRatio(none))`:t};n.onerror=s.onerror=r});s.readAsDataURL(t);await r}else i.bitmap=await createImageBitmap(t);i.refCounter=1}catch(t){warn(t);i=null}this.#P.set(t,i);i&&this.#P.set(i.id,i);return i}async getFromFile(t){const{lastModified:e,name:i,size:s,type:n}=t;return this.#D(`${e}_${i}_${s}_${n}`,t)}async getFromUrl(t){return this.#D(t,t)}async getFromBlob(t,e){const i=await e;return this.#D(t,i)}async getFromId(t){this.#P||=new Map;const e=this.#P.get(t);if(!e)return null;if(e.bitmap){e.refCounter+=1;return e}if(e.file)return this.getFromFile(e.file);if(e.blobPromise){const{blobPromise:t}=e;delete e.blobPromise;return this.getFromBlob(e.id,t)}return this.getFromUrl(e.url)}getFromCanvas(t,e){this.#P||=new Map;let i=this.#P.get(t);if(i?.bitmap){i.refCounter+=1;return i}const s=new OffscreenCanvas(e.width,e.height);s.getContext("2d").drawImage(e,0,0);i={bitmap:s.transferToImageBitmap(),id:`image_${this.#_}_${this.#S++}`,refCounter:1,isSvg:!1};this.#P.set(t,i);this.#P.set(i.id,i);return i}getSvgUrl(t){const e=this.#P.get(t);return e?.isSvg?e.svgUrl:null}deleteId(t){this.#P||=new Map;const e=this.#P.get(t);if(!e)return;e.refCounter-=1;if(0!==e.refCounter)return;const{bitmap:i}=e;if(!e.url&&!e.file){const t=new OffscreenCanvas(i.width,i.height);t.getContext("bitmaprenderer").transferFromImageBitmap(i);e.blobPromise=t.convertToBlob()}i.close?.();e.bitmap=null}isValidId(t){return t.startsWith(`image_${this.#_}_`)}}class CommandManager{#M=[];#k=!1;#I;#F=-1;constructor(t=128){this.#I=t}add({cmd:t,undo:e,post:i,mustExec:s,type:n=NaN,overwriteIfSameType:r=!1,keepUndo:a=!1}){s&&t();if(this.#k)return;const o={cmd:t,undo:e,post:i,type:n};if(-1===this.#F){this.#M.length>0&&(this.#M.length=0);this.#F=0;this.#M.push(o);return}if(r&&this.#M[this.#F].type===n){a&&(o.undo=this.#M[this.#F].undo);this.#M[this.#F]=o;return}const l=this.#F+1;if(l===this.#I)this.#M.splice(0,1);else{this.#F=l;l=0;e--)if(this.#M[e].type!==t){this.#M.splice(e+1,this.#F-e);this.#F=e;return}this.#M.length=0;this.#F=-1}}destroy(){this.#M=null}}class KeyboardManager{constructor(t){this.buffer=[];this.callbacks=new Map;this.allKeys=new Set;const{isMac:e}=FeatureTest.platform;for(const[i,s,n={}]of t)for(const t of i){const i=t.startsWith("mac+");if(e&&i){this.callbacks.set(t.slice(4),{callback:s,options:n});this.allKeys.add(t.split("+").at(-1))}else if(!e&&!i){this.callbacks.set(t,{callback:s,options:n});this.allKeys.add(t.split("+").at(-1))}}}#B(t){t.altKey&&this.buffer.push("alt");t.ctrlKey&&this.buffer.push("ctrl");t.metaKey&&this.buffer.push("meta");t.shiftKey&&this.buffer.push("shift");this.buffer.push(t.key);const e=this.buffer.join("+");this.buffer.length=0;return e}exec(t,e){if(!this.allKeys.has(e.key))return;const i=this.callbacks.get(this.#B(e));if(!i)return;const{callback:s,options:{bubbles:n=!1,args:r=[],checker:a=null}}=i;if(!a||a(t,e)){s.bind(t,...r,e)();n||stopEvent(e)}}}class ColorManager{static _colorsMapping=new Map([["CanvasText",[0,0,0]],["Canvas",[255,255,255]]]);get _colors(){const t=new Map([["CanvasText",null],["Canvas",null]]);!function getColorValues(t){const e=document.createElement("span");e.style.visibility="hidden";e.style.colorScheme="only light";document.body.append(e);for(const i of t.keys()){e.style.color=i;const s=window.getComputedStyle(e).color;t.set(i,getRGB(s))}e.remove()}(t);return shadow(this,"_colors",t)}convert(t){const e=getRGB(t);if(!window.matchMedia("(forced-colors: active)").matches)return e;for(const[t,i]of this._colors)if(i.every((t,i)=>t===e[i]))return ColorManager._colorsMapping.get(t);return e}getHexCode(t){const e=this._colors.get(t);return e?Util.makeHexColor(...e):t}}class AnnotationEditorUIManager{#R=new AbortController;#O=null;#L=null;#N=new Map;#U=new Map;#H=null;#z=null;#G=null;#W=null;#V=new CommandManager;#j=null;#$=null;#X=null;#q=0;#K=new Set;#Y=null;#Q=null;#J=new Set;_editorUndoBar=null;#Z=!1;#tt=!1;#et=!1;#it=null;#st=null;#nt=null;#rt=null;#at=!1;#ot=null;#lt=new IdManager;#ht=!1;#dt=!1;#ct=!1;#ut=null;#pt=null;#gt=null;#mt=null;#ft=null;#bt=m.NONE;#yt=new Set;#At=null;#vt=null;#wt=null;#xt=null;#Ct=null;#Et={isEditing:!1,isEmpty:!0,hasSomethingToUndo:!1,hasSomethingToRedo:!1,hasSelectedEditor:!1,hasSelectedText:!1};#Tt=[0,0];#St=null;#_t=null;#Pt=null;#Dt=null;#Mt=null;static TRANSLATE_SMALL=1;static TRANSLATE_BIG=10;static get _keyboardManager(){const t=AnnotationEditorUIManager.prototype,arrowChecker=t=>t.#_t.contains(document.activeElement)&&"BUTTON"!==document.activeElement.tagName&&t.hasSomethingToControl(),textInputChecker=(t,{target:e})=>{if(e instanceof HTMLInputElement){const{type:t}=e;return"text"!==t&&"number"!==t}return!0},e=this.TRANSLATE_SMALL,i=this.TRANSLATE_BIG;return shadow(this,"_keyboardManager",new KeyboardManager([[["ctrl+a","mac+meta+a"],t.selectAll,{checker:textInputChecker}],[["ctrl+z","mac+meta+z"],t.undo,{checker:textInputChecker}],[["ctrl+y","ctrl+shift+z","mac+meta+shift+z","ctrl+shift+Z","mac+meta+shift+Z"],t.redo,{checker:textInputChecker}],[["Backspace","alt+Backspace","ctrl+Backspace","shift+Backspace","mac+Backspace","mac+alt+Backspace","mac+ctrl+Backspace","Delete","ctrl+Delete","shift+Delete","mac+Delete"],t.delete,{checker:textInputChecker}],[["Enter","mac+Enter"],t.addNewEditorFromKeyboard,{checker:(t,{target:e})=>!(e instanceof HTMLButtonElement)&&t.#_t.contains(e)&&!t.isEnterHandled}],[[" ","mac+ "],t.addNewEditorFromKeyboard,{checker:(t,{target:e})=>!(e instanceof HTMLButtonElement)&&t.#_t.contains(document.activeElement)}],[["Escape","mac+Escape"],t.unselectAll],[["ArrowLeft","mac+ArrowLeft"],t.translateSelectedEditors,{args:[-e,0],checker:arrowChecker}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],t.translateSelectedEditors,{args:[-i,0],checker:arrowChecker}],[["ArrowRight","mac+ArrowRight"],t.translateSelectedEditors,{args:[e,0],checker:arrowChecker}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],t.translateSelectedEditors,{args:[i,0],checker:arrowChecker}],[["ArrowUp","mac+ArrowUp"],t.translateSelectedEditors,{args:[0,-e],checker:arrowChecker}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],t.translateSelectedEditors,{args:[0,-i],checker:arrowChecker}],[["ArrowDown","mac+ArrowDown"],t.translateSelectedEditors,{args:[0,e],checker:arrowChecker}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],t.translateSelectedEditors,{args:[0,i],checker:arrowChecker}]]))}constructor(t,e,i,s,n,r,a,o,l,h,d,c,u,p,g,m){const f=this._signal=this.#R.signal;this.#_t=t;this.#Pt=e;this.#Dt=i;this.#z=s;this.#j=n;this.#vt=r;this.#Ct=o;this._eventBus=a;a._on("editingaction",this.onEditingAction.bind(this),{signal:f});a._on("pagechanging",this.onPageChanging.bind(this),{signal:f});a._on("scalechanging",this.onScaleChanging.bind(this),{signal:f});a._on("rotationchanging",this.onRotationChanging.bind(this),{signal:f});a._on("setpreference",this.onSetPreference.bind(this),{signal:f});a._on("switchannotationeditorparams",t=>this.updateParams(t.type,t.value),{signal:f});window.addEventListener("pointerdown",()=>{this.#dt=!0},{capture:!0,signal:f});window.addEventListener("pointerup",()=>{this.#dt=!1},{capture:!0,signal:f});window.addEventListener("beforeunload",this.#kt.bind(this),{capture:!0,signal:f});this.#It();this.#Ft();this.#Bt();this.#G=o.annotationStorage;this.#it=o.filterFactory;this.#wt=l;this.#rt=h||null;this.#Z=d;this.#tt=c;this.#et=u;this.#ft=p||null;this.viewParameters={realScale:PixelsPerInch.PDF_TO_CSS_UNITS,rotation:0};this.isShiftKeyDown=!1;this._editorUndoBar=g||null;this._supportsPinchToZoom=!1!==m;n?.setSidebarUiManager(this)}destroy(){this.#Mt?.resolve();this.#Mt=null;this.#R?.abort();this.#R=null;this._signal=null;for(const t of this.#U.values())t.destroy();this.#U.clear();this.#N.clear();this.#J.clear();this.#mt?.clear();this.#O=null;this.#yt.clear();this.#V.destroy();this.#z?.destroy();this.#j?.destroy();this.#vt?.destroy();this.#ot?.hide();this.#ot=null;this.#gt?.destroy();this.#gt=null;this.#L=null;if(this.#st){clearTimeout(this.#st);this.#st=null}if(this.#St){clearTimeout(this.#St);this.#St=null}this._editorUndoBar?.destroy();this.#Ct=null}combinedSignal(t){return AbortSignal.any([this._signal,t.signal])}get mlManager(){return this.#ft}get useNewAltTextFlow(){return this.#tt}get useNewAltTextWhenAddingImage(){return this.#et}get hcmFilter(){return shadow(this,"hcmFilter",this.#wt?this.#it.addHCMFilter(this.#wt.foreground,this.#wt.background):"none")}get direction(){return shadow(this,"direction",getComputedStyle(this.#_t).direction)}get _highlightColors(){return shadow(this,"_highlightColors",this.#rt?new Map(this.#rt.split(",").map(t=>{(t=t.split("=").map(t=>t.trim()))[1]=t[1].toUpperCase();return t})):null)}get highlightColors(){const{_highlightColors:t}=this;if(!t)return shadow(this,"highlightColors",null);const e=new Map,i=!!this.#wt;for(const[s,n]of t){const t=s.endsWith("_HCM");i&&t?e.set(s.replace("_HCM",""),n):i||t||e.set(s,n)}return shadow(this,"highlightColors",e)}get highlightColorNames(){return shadow(this,"highlightColorNames",this.highlightColors?new Map(Array.from(this.highlightColors,t=>t.reverse())):null)}getNonHCMColor(t){if(!this._highlightColors)return t;const e=this.highlightColorNames.get(t);return this._highlightColors.get(e)||t}getNonHCMColorName(t){return this.highlightColorNames.get(t)||t}setCurrentDrawingSession(t){if(t){this.unselectAll();this.disableUserSelect(!0)}else this.disableUserSelect(!1);this.#X=t}setMainHighlightColorPicker(t){this.#gt=t}editAltText(t,e=!1){this.#z?.editAltText(this,t,e)}hasCommentManager(){return!!this.#j}editComment(t,e,i,s){this.#j?.showDialog(this,t,e,i,s)}selectComment(t,e){const i=this.#U.get(t),s=i?.getEditorByUID(e);s?.toggleComment(!0,!0)}updateComment(t){this.#j?.updateComment(t.getData())}updatePopupColor(t){this.#j?.updatePopupColor(t)}removeComment(t){this.#j?.removeComments([t.uid])}deleteComment(t,e){const undo=()=>{t.comment=e};this.addCommands({cmd:()=>{this._editorUndoBar?.show(undo,"comment");this.toggleComment(null);t.comment=null},undo,mustExec:!0})}toggleComment(t,e,i=void 0){this.#j?.toggleCommentPopup(t,e,i)}makeCommentColor(t,e){return t&&this.#j?.makeCommentColor(t,e)||null}getCommentDialogElement(){return this.#j?.dialogElement||null}async waitForEditorsRendered(t){if(this.#U.has(t-1))return;const{resolve:e,promise:i}=Promise.withResolvers(),onEditorsRendered=i=>{if(i.pageNumber===t){this._eventBus._off("editorsrendered",onEditorsRendered);e()}};this._eventBus.on("editorsrendered",onEditorsRendered);await i}getSignature(t){this.#vt?.getSignature({uiManager:this,editor:t})}get signatureManager(){return this.#vt}switchToMode(t,e){this._eventBus.on("annotationeditormodechanged",e,{once:!0,signal:this._signal});this._eventBus.dispatch("showannotationeditorui",{source:this,mode:t})}setPreference(t,e){this._eventBus.dispatch("setpreference",{source:this,name:t,value:e})}onSetPreference({name:t,value:e}){if("enableNewAltTextWhenAddingImage"===t)this.#et=e}onPageChanging({pageNumber:t}){this.#q=t-1}deletePage(t){for(const e of this.getEditors(t))e.remove();this.#U.delete(t);this.#q===t&&(this.#q=0)}focusMainContainer(){this.#_t.focus()}findParent(t,e){for(const i of this.#U.values()){const{x:s,y:n,width:r,height:a}=i.div.getBoundingClientRect();if(t>=s&&t<=s+r&&e>=n&&e<=n+a)return i}return null}disableUserSelect(t=!1){this.#Pt.classList.toggle("noUserSelect",t)}addShouldRescale(t){this.#J.add(t)}removeShouldRescale(t){this.#J.delete(t)}onScaleChanging({scale:t}){this.commitOrRemove();this.viewParameters.realScale=t*PixelsPerInch.PDF_TO_CSS_UNITS;for(const t of this.#J)t.onScaleChanging();this.#X?.onScaleChanging()}onRotationChanging({pagesRotation:t}){this.commitOrRemove();this.viewParameters.rotation=t}#Rt({anchorNode:t}){return t.nodeType===Node.TEXT_NODE?t.parentElement:t}#Ot(t){const{currentLayer:e}=this;if(e.hasTextLayer(t))return e;for(const e of this.#U.values())if(e.hasTextLayer(t))return e;return null}highlightSelection(t="",e=!1){const i=document.getSelection();if(!i||i.isCollapsed)return;const{anchorNode:s,anchorOffset:n,focusNode:r,focusOffset:a}=i,o=i.toString(),l=this.#Rt(i).closest(".textLayer"),h=this.getSelectionBoxes(l);if(!h)return;i.empty();const d=this.#Ot(l),c=this.#bt===m.NONE,callback=()=>{const i=d?.createAndAddNewEditor({x:0,y:0},!1,{methodOfCreation:t,boxes:h,anchorNode:s,anchorOffset:n,focusNode:r,focusOffset:a,text:o});c&&this.showAllEditors("highlight",!0,!0);e&&i?.editComment()};c?this.switchToMode(m.HIGHLIGHT,callback):callback()}commentSelection(t=""){this.highlightSelection(t,!0)}#kt(t){this.commitOrRemove();this.currentLayer?.endDrawingSession(!1)}#Lt(){const t=document.getSelection();if(!t||t.isCollapsed)return;const e=this.#Rt(t).closest(".textLayer"),i=this.getSelectionBoxes(e);if(i){this.#ot||=new FloatingToolbar(this);this.#ot.show(e,i,"ltr"===this.direction)}}getAndRemoveDataFromAnnotationStorage(t){if(!this.#G)return null;const e=`${g}${t}`,i=this.#G.getRawValue(e);i&&this.#G.remove(e);return i}addToAnnotationStorage(t){t.isEmpty()||!this.#G||this.#G.has(t.id)||this.#G.setValue(t.id,t)}a11yAlert(t,e=null){const i=this.#Dt;if(i){i.setAttribute("data-l10n-id",t);e?i.setAttribute("data-l10n-args",JSON.stringify(e)):i.removeAttribute("data-l10n-args")}}#Nt(){const t=document.getSelection();if(!t||t.isCollapsed){if(this.#At){this.#ot?.hide();this.#At=null;this.#Ut({hasSelectedText:!1})}return}const{anchorNode:e}=t;if(e===this.#At)return;const i=this.#Rt(t).closest(".textLayer");if(i){this.#ot?.hide();this.#At=e;this.#Ut({hasSelectedText:!0});if(this.#bt===m.HIGHLIGHT||this.#bt===m.NONE){this.#bt===m.HIGHLIGHT&&this.showAllEditors("highlight",!0,!0);this.#at=this.isShiftKeyDown;if(!this.isShiftKeyDown){const t=this.#bt===m.HIGHLIGHT?this.#Ot(i):null;t?.toggleDrawing();if(this.#dt){const e=new AbortController,i=this.combinedSignal(e),pointerup=i=>{if("pointerup"!==i.type||0===i.button){e.abort();t?.toggleDrawing(!0);"pointerup"===i.type&&this.#Ht("main_toolbar")}};window.addEventListener("pointerup",pointerup,{signal:i});window.addEventListener("blur",pointerup,{signal:i})}else{t?.toggleDrawing(!0);this.#Ht("main_toolbar")}}}}else if(this.#At){this.#ot?.hide();this.#At=null;this.#Ut({hasSelectedText:!1})}}#Ht(t=""){this.#bt===m.HIGHLIGHT?this.highlightSelection(t):this.#Z&&this.#Lt()}#It(){document.addEventListener("selectionchange",this.#Nt.bind(this),{signal:this._signal})}#zt(){if(this.#nt)return;this.#nt=new AbortController;const t=this.combinedSignal(this.#nt);window.addEventListener("focus",this.focus.bind(this),{signal:t});window.addEventListener("blur",this.blur.bind(this),{signal:t})}#Gt(){this.#nt?.abort();this.#nt=null}blur(){this.isShiftKeyDown=!1;if(this.#at){this.#at=!1;this.#Ht("main_toolbar")}if(!this.hasSelection)return;const{activeElement:t}=document;for(const e of this.#yt)if(e.div.contains(t)){this.#pt=[e,t];e._focusEventsAllowed=!1;break}}focus(){if(!this.#pt)return;const[t,e]=this.#pt;this.#pt=null;e.addEventListener("focusin",()=>{t._focusEventsAllowed=!0},{once:!0,signal:this._signal});e.focus()}#Bt(){if(this.#ut)return;this.#ut=new AbortController;const t=this.combinedSignal(this.#ut);window.addEventListener("keydown",this.keydown.bind(this),{signal:t});window.addEventListener("keyup",this.keyup.bind(this),{signal:t})}#Wt(){this.#ut?.abort();this.#ut=null}#Vt(){if(this.#$)return;this.#$=new AbortController;const t=this.combinedSignal(this.#$);document.addEventListener("copy",this.copy.bind(this),{signal:t});document.addEventListener("cut",this.cut.bind(this),{signal:t});document.addEventListener("paste",this.paste.bind(this),{signal:t})}#jt(){this.#$?.abort();this.#$=null}#Ft(){const t=this._signal;document.addEventListener("dragover",this.dragOver.bind(this),{signal:t});document.addEventListener("drop",this.drop.bind(this),{signal:t})}addEditListeners(){this.#Bt();this.setEditingState(!0)}removeEditListeners(){this.#Wt();this.setEditingState(!1)}dragOver(t){for(const{type:e}of t.dataTransfer.items)for(const i of this.#Q)if(i.isHandlingMimeForPasting(e)){t.dataTransfer.dropEffect="copy";t.preventDefault();return}}drop(t){for(const e of t.dataTransfer.items)for(const i of this.#Q)if(i.isHandlingMimeForPasting(e.type)){i.paste(e,this.currentLayer);t.preventDefault();return}}copy(t){t.preventDefault();this.#O?.commitOrRemove();if(!this.hasSelection)return;const e=[];for(const t of this.#yt){const i=t.serialize(!0);i&&e.push(i)}0!==e.length&&t.clipboardData.setData("application/pdfjs",JSON.stringify(e))}cut(t){this.copy(t);this.delete()}async paste(t){t.preventDefault();const{clipboardData:e}=t;for(const t of e.items)for(const e of this.#Q)if(e.isHandlingMimeForPasting(t.type)){e.paste(t,this.currentLayer);return}let i=e.getData("application/pdfjs");if(!i)return;try{i=JSON.parse(i)}catch(t){warn(`paste: "${t.message}".`);return}if(!Array.isArray(i))return;this.unselectAll();const s=this.currentLayer;try{const t=[];for(const e of i){const i=await s.deserialize(e);if(!i)return;t.push(i)}const cmd=()=>{for(const e of t)this.#$t(e);this.#Xt(t)},undo=()=>{for(const e of t)e.remove()};this.addCommands({cmd,undo,mustExec:!0})}catch(t){warn(`paste: "${t.message}".`)}}keydown(t){this.isShiftKeyDown||"Shift"!==t.key||(this.isShiftKeyDown=!0);this.#bt===m.NONE||this.isEditorHandlingKeyboard||AnnotationEditorUIManager._keyboardManager.exec(this,t)}keyup(t){if(this.isShiftKeyDown&&"Shift"===t.key){this.isShiftKeyDown=!1;if(this.#at){this.#at=!1;this.#Ht("main_toolbar")}}}onEditingAction({name:t}){switch(t){case"undo":case"redo":case"delete":case"selectAll":this[t]();break;case"highlightSelection":this.highlightSelection("context_menu");break;case"commentSelection":this.commentSelection("context_menu")}}updatePageIndex(t,e){for(const i of this.getEditors(t))i.pageIndex=e;const i=this.#H.get(t);if(i){i.pageIndex=e;this.#U.set(e,i);this.#ht?i.enable():i.disable()}}startUpdatePages(){this.#H=new Map(this.#U);this.#U.clear()}endUpdatePages(){this.#H=null}clonePage(t,e){for(const i of this.getEditors(t)){const t=i.serialize(i.mode!==m.HIGHLIGHT);if(t){t.pageIndex=e;t.id=this.getId();t.isClone=!0;delete t.popupRef;this.#G.setValue(t.id,t)}}}findClonesForPage(t){const e=[],{pageIndex:i}=t;for(const[s,n]of this.#G)if(n.pageIndex===i&&n.isClone){this.#G.remove(s);e.push(t.deserialize(n).then(e=>{if(e){e.isClone=!0;t.addOrRebuild(e)}}))}return Promise.all(e)}#Ut(t){if(Object.entries(t).some(([t,e])=>this.#Et[t]!==e)){this._eventBus.dispatch("editingstateschanged",{source:this,details:Object.assign(this.#Et,t)});this.#bt===m.HIGHLIGHT&&!1===t.hasSelectedEditor&&this.#qt([[f.HIGHLIGHT_FREE,!0]])}}#qt(t){this._eventBus.dispatch("annotationeditorparamschanged",{source:this,details:t})}setEditingState(t){if(t){this.#zt();this.#Vt();this.#Ut({isEditing:this.#bt!==m.NONE,isEmpty:this.#Kt(),hasSomethingToUndo:this.#V.hasSomethingToUndo(),hasSomethingToRedo:this.#V.hasSomethingToRedo(),hasSelectedEditor:!1})}else{this.#Gt();this.#jt();this.#Ut({isEditing:!1});this.disableUserSelect(!1)}}registerEditorTypes(t){if(!this.#Q){this.#Q=t;for(const t of this.#Q)this.#qt(t.defaultPropertiesToUpdate)}}getId(){return this.#lt.id}get currentLayer(){return this.#U.get(this.#q)}getLayer(t){return this.#U.get(t)}get currentPageIndex(){return this.#q}addLayer(t){this.#U.set(t.pageIndex,t);this.#ht?t.enable():t.disable()}removeLayer(t){this.#U.delete(t.pageIndex)}async updateMode(t,e=null,i=!1,s=!1,n=!1,r=!1){if(this.#bt!==t){if(this.#Mt){await this.#Mt.promise;if(!this.#Mt)return}this.#Mt=Promise.withResolvers();this.#X?.commitOrRemove();this.#bt===m.POPUP&&this.#j?.hideSidebar();this.#j?.destroyPopup();this.#bt=t;if(t!==m.NONE){for(const t of this.#N.values())t.addStandaloneCommentButton();t===m.SIGNATURE&&await(this.#vt?.loadSignatures());i&&CurrentPointers.clearPointerType();this.setEditingState(!0);await this.#Yt();this.unselectAll();for(const e of this.#U.values())e.updateMode(t);if(t===m.POPUP){this.#L||=await this.#Ct.getAnnotationsByType(new Set(this.#Q.map(t=>t._editorType)));const t=new Set,e=[];for(const i of this.#N.values()){const{annotationElementId:s,hasComment:n,deleted:r}=i;s&&t.add(s);n&&!r&&e.push(i.getData())}for(const i of this.#L){const{id:s,popupRef:n,contentsObj:r}=i;n&&r?.str&&!t.has(s)&&!this.#K.has(s)&&e.push(i)}this.#j?.showSidebar(e)}if(e){for(const t of this.#N.values())if(t.uid===e){this.setSelected(t);r?t.editComment():n?t.enterInEditMode():t.focus()}else t.unselect();this.#Mt.resolve()}else{s&&this.addNewEditorFromKeyboard();this.#Mt.resolve()}}else{this.setEditingState(!1);this.#Qt();for(const t of this.#N.values())t.hideStandaloneCommentButton();this._editorUndoBar?.hide();this.toggleComment(null);this.#Mt.resolve()}}}addNewEditorFromKeyboard(){this.currentLayer.canCreateNewEmptyEditor()&&this.currentLayer.addNewEditor()}updateToolbar(t){t.mode!==this.#bt&&this._eventBus.dispatch("switchannotationeditormode",{source:this,...t})}updateParams(t,e){if(this.#Q){switch(t){case f.CREATE:this.currentLayer.addNewEditor(e);return;case f.HIGHLIGHT_SHOW_ALL:this._eventBus.dispatch("reporttelemetry",{source:this,details:{type:"editing",data:{type:"highlight",action:"toggle_visibility"}}});(this.#xt||=new Map).set(t,e);this.showAllEditors("highlight",e)}if(this.hasSelection)for(const i of this.#yt)i.updateParams(t,e);else for(const i of this.#Q)i.updateDefaultParams(t,e)}}showAllEditors(t,e,i=!1){for(const i of this.#N.values())i.editorType===t&&i.show(e);(this.#xt?.get(f.HIGHLIGHT_SHOW_ALL)??!0)!==e&&this.#qt([[f.HIGHLIGHT_SHOW_ALL,e]])}enableWaiting(t=!1){if(this.#ct!==t){this.#ct=t;for(const e of this.#U.values()){t?e.disableClick():e.enableClick();e.div.classList.toggle("waiting",t)}}}async#Yt(){if(!this.#ht){this.#ht=!0;const t=[];for(const e of this.#U.values())t.push(e.enable());await Promise.all(t);for(const t of this.#N.values())t.enable()}}#Qt(){this.unselectAll();if(this.#ht){this.#ht=!1;for(const t of this.#U.values())t.disable();for(const t of this.#N.values())t.disable()}}*getEditors(t){for(const e of this.#N.values())e.pageIndex===t&&(yield e)}getEditor(t){return this.#N.get(t)}addEditor(t){this.#N.set(t.id,t)}removeEditor(t){if(t.div.contains(document.activeElement)){this.#st&&clearTimeout(this.#st);this.#st=setTimeout(()=>{this.focusMainContainer();this.#st=null},0)}this.#N.delete(t.id);t.annotationElementId&&this.#mt?.delete(t.annotationElementId);this.unselect(t);t.annotationElementId&&this.#K.has(t.annotationElementId)||this.#G?.remove(t.id)}addDeletedAnnotationElement(t){this.#K.add(t.annotationElementId);this.addChangedExistingAnnotation(t);t.deleted=!0}isDeletedAnnotationElement(t){return this.#K.has(t)}removeDeletedAnnotationElement(t){this.#K.delete(t.annotationElementId);this.removeChangedExistingAnnotation(t);t.deleted=!1}#$t(t){const e=this.#U.get(t.pageIndex);if(e)e.addOrRebuild(t);else{this.addEditor(t);this.addToAnnotationStorage(t)}}setActiveEditor(t){if(this.#O!==t){this.#O=t;t&&this.#qt(t.propertiesToUpdate)}}get#Jt(){let t=null;for(t of this.#yt);return t}updateUI(t){this.#Jt===t&&this.#qt(t.propertiesToUpdate)}updateUIForDefaultProperties(t){this.#qt(t.defaultPropertiesToUpdate)}toggleSelected(t){if(this.#yt.has(t)){this.#yt.delete(t);t.unselect();this.#Ut({hasSelectedEditor:this.hasSelection})}else{this.#yt.add(t);t.select();this.#qt(t.propertiesToUpdate);this.#Ut({hasSelectedEditor:!0})}}setSelected(t){this.updateToolbar({mode:t.mode,editId:t.uid});this.#X?.commitOrRemove();for(const e of this.#yt)e!==t&&e.unselect();this.#j?.destroyPopup();this.#yt.clear();this.#yt.add(t);t.select();this.#qt(t.propertiesToUpdate);this.#Ut({hasSelectedEditor:!0})}isSelected(t){return this.#yt.has(t)}get firstSelectedEditor(){return this.#yt.values().next().value}unselect(t){t.unselect();this.#yt.delete(t);this.#Ut({hasSelectedEditor:this.hasSelection})}get hasSelection(){return 0!==this.#yt.size}get isEnterHandled(){return 1===this.#yt.size&&this.firstSelectedEditor.isEnterHandled}undo(){this.#V.undo();this.#Ut({hasSomethingToUndo:this.#V.hasSomethingToUndo(),hasSomethingToRedo:!0,isEmpty:this.#Kt()});this._editorUndoBar?.hide()}redo(){this.#V.redo();this.#Ut({hasSomethingToUndo:!0,hasSomethingToRedo:this.#V.hasSomethingToRedo(),isEmpty:this.#Kt()})}addCommands(t){this.#V.add(t);this.#Ut({hasSomethingToUndo:!0,hasSomethingToRedo:!1,isEmpty:this.#Kt()})}cleanUndoStack(t){this.#V.cleanType(t)}#Kt(){if(0===this.#N.size)return!0;if(1===this.#N.size)for(const t of this.#N.values())return t.isEmpty();return!1}delete(){this.commitOrRemove();const t=this.currentLayer?.endDrawingSession(!0);if(!this.hasSelection&&!t)return;const e=t?[t]:[...this.#yt],undo=()=>{for(const t of e)this.#$t(t)};this.addCommands({cmd:()=>{this._editorUndoBar?.show(undo,1===e.length?e[0].editorType:e.length);for(const t of e)t.remove()},undo,mustExec:!0})}commitOrRemove(){this.#O?.commitOrRemove()}hasSomethingToControl(){return this.#O||this.hasSelection}#Xt(t){for(const t of this.#yt)t.unselect();this.#yt.clear();for(const e of t)if(!e.isEmpty()){this.#yt.add(e);e.select()}this.#Ut({hasSelectedEditor:this.hasSelection})}selectAll(){for(const t of this.#yt)t.commit();this.#Xt(this.#N.values())}unselectAll(){if(this.#O){this.#O.commitOrRemove();if(this.#bt!==m.NONE)return}if(!this.#X?.commitOrRemove()){this.#j?.destroyPopup();if(this.hasSelection){for(const t of this.#yt)t.unselect();this.#yt.clear();this.#Ut({hasSelectedEditor:!1})}}}translateSelectedEditors(t,e,i=!1){i||this.commitOrRemove();if(!this.hasSelection)return;this.#Tt[0]+=t;this.#Tt[1]+=e;const[s,n]=this.#Tt,r=[...this.#yt];this.#St&&clearTimeout(this.#St);this.#St=setTimeout(()=>{this.#St=null;this.#Tt[0]=this.#Tt[1]=0;this.addCommands({cmd:()=>{for(const t of r)if(this.#N.has(t.id)){t.translateInPage(s,n);t.translationDone()}},undo:()=>{for(const t of r)if(this.#N.has(t.id)){t.translateInPage(-s,-n);t.translationDone()}},mustExec:!1})},1e3);for(const i of r){i.translateInPage(t,e);i.translationDone()}}setUpDragSession(){if(this.hasSelection){this.disableUserSelect(!0);this.#Y=new Map;for(const t of this.#yt)this.#Y.set(t,{savedX:t.x,savedY:t.y,savedPageIndex:t.pageIndex,newX:0,newY:0,newPageIndex:-1})}}endDragSession(){if(!this.#Y)return!1;this.disableUserSelect(!1);const t=this.#Y;this.#Y=null;let e=!1;for(const[{x:i,y:s,pageIndex:n},r]of t){r.newX=i;r.newY=s;r.newPageIndex=n;e||=i!==r.savedX||s!==r.savedY||n!==r.savedPageIndex}if(!e)return!1;const move=(t,e,i,s)=>{if(this.#N.has(t.id)){const n=this.#U.get(s);if(n)t._setParentAndPosition(n,e,i);else{t.pageIndex=s;t.x=e;t.y=i}}};this.addCommands({cmd:()=>{for(const[e,{newX:i,newY:s,newPageIndex:n}]of t)move(e,i,s,n)},undo:()=>{for(const[e,{savedX:i,savedY:s,savedPageIndex:n}]of t)move(e,i,s,n)},mustExec:!0});return!0}dragSelectedEditors(t,e){if(this.#Y)for(const i of this.#Y.keys())i.drag(t,e)}rebuild(t){if(null===t.parent){const e=this.getLayer(t.pageIndex);if(e){e.changeParent(t);e.addOrRebuild(t)}else{this.addEditor(t);this.addToAnnotationStorage(t);t.rebuild()}}else t.parent.addOrRebuild(t)}get isEditorHandlingKeyboard(){return this.getActive()?.shouldGetKeyboardEvents()||1===this.#yt.size&&this.firstSelectedEditor.shouldGetKeyboardEvents()}isActive(t){return this.#O===t}getActive(){return this.#O}getMode(){return this.#bt}isEditingMode(){return this.#bt!==m.NONE}get imageManager(){return shadow(this,"imageManager",new ImageManager)}getSelectionBoxes(t){if(!t)return null;const e=document.getSelection();for(let i=0,s=e.rangeCount;i({x:(e-s)/r,y:1-(t+a-i)/n,width:o/r,height:a/n});break;case"180":a=(t,e,a,o)=>({x:1-(t+a-i)/n,y:1-(e+o-s)/r,width:a/n,height:o/r});break;case"270":a=(t,e,a,o)=>({x:1-(e+o-s)/r,y:(t-i)/n,width:o/r,height:a/n});break;default:a=(t,e,a,o)=>({x:(t-i)/n,y:(e-s)/r,width:a/n,height:o/r})}const o=[];for(let t=0,i=e.rangeCount;tt.stopPropagation(),{signal:i});const onClick=t=>{t.preventDefault();this.#a._uiManager.editAltText(this.#a);this.#le&&this.#a._reportTelemetry({action:"pdfjs.image.alt_text.image_status_label_clicked",data:{label:this.#de}})};t.addEventListener("click",onClick,{capture:!0,signal:i});t.addEventListener("keydown",e=>{if(e.target===t&&"Enter"===e.key){this.#ne=!0;onClick(e)}},{signal:i});await this.#ce();return t}get#de(){return(this.#l?"added":null===this.#l&&this.guessedText&&"review")||"missing"}finish(){if(this.#te){this.#te.focus({focusVisible:this.#ne});this.#ne=!1}}isEmpty(){return this.#le?null===this.#l:!this.#l&&!this.#Zt}hasData(){return this.#le?null!==this.#l||!!this.#ae:this.isEmpty()}get guessedText(){return this.#ae}async setGuessedText(t){if(null===this.#l){this.#ae=t;this.#oe=await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer",{generatedAltText:t});this.#ce()}}toggleAltTextBadge(t=!1){if(this.#le&&!this.#l){if(!this.#re){const t=this.#re=document.createElement("div");t.className="noAltTextBadge";this.#a.div.append(t)}this.#re.classList.toggle("hidden",!t)}else{this.#re?.remove();this.#re=null}}serialize(t){let e=this.#l;t||this.#ae!==e||(e=this.#oe);return{altText:e,decorative:this.#Zt,guessedText:this.#ae,textWithDisclaimer:this.#oe}}get data(){return{altText:this.#l,decorative:this.#Zt}}set data({altText:t,decorative:e,guessedText:i,textWithDisclaimer:s,cancel:n=!1}){if(i){this.#ae=i;this.#oe=s}if(this.#l!==t||this.#Zt!==e){if(!n){this.#l=t;this.#Zt=e}this.#ce()}}toggle(t=!1){if(this.#te){if(!t&&this.#se){clearTimeout(this.#se);this.#se=null}this.#te.disabled=!t}}shown(){this.#a._reportTelemetry({action:"pdfjs.image.alt_text.image_status_label_displayed",data:{label:this.#de}})}destroy(){this.#te?.remove();this.#te=null;this.#ee=null;this.#ie=null;this.#re?.remove();this.#re=null}async#ce(){const t=this.#te;if(!t)return;if(this.#le){t.classList.toggle("done",!!this.#l);t.setAttribute("data-l10n-id",AltText.#he[this.#de]);this.#ee?.setAttribute("data-l10n-id",AltText.#he[`${this.#de}-label`]);if(!this.#l){this.#ie?.remove();return}}else{if(!this.#l&&!this.#Zt){t.classList.remove("done");this.#ie?.remove();return}t.classList.add("done");t.setAttribute("data-l10n-id","pdfjs-editor-alt-text-edit-button")}let e=this.#ie;if(!e){this.#ie=e=document.createElement("span");e.className="tooltip";e.setAttribute("role","tooltip");e.id=`alt-text-tooltip-${this.#a.id}`;const i=100,s=this.#a._uiManager._signal;s.addEventListener("abort",()=>{clearTimeout(this.#se);this.#se=null},{once:!0});t.addEventListener("mouseenter",()=>{this.#se=setTimeout(()=>{this.#se=null;this.#ie.classList.add("show");this.#a._reportTelemetry({action:"alt_text_tooltip"})},i)},{signal:s});t.addEventListener("mouseleave",()=>{if(this.#se){clearTimeout(this.#se);this.#se=null}this.#ie?.classList.remove("show")},{signal:s})}if(this.#Zt)e.setAttribute("data-l10n-id","pdfjs-editor-alt-text-decorative-tooltip");else{e.removeAttribute("data-l10n-id");e.textContent=this.#l}e.parentNode||t.append(e);const i=this.#a.getElementForAltText();i?.setAttribute("aria-describedby",e.id)}}class Comment{#ue=null;#pe=null;#ge=!1;#a=null;#me=null;#fe=null;#be=null;#ye=null;#Ae=!1;#ve=null;constructor(t){this.#a=t}renderForToolbar(){const t=this.#pe=document.createElement("button");t.className="comment";return this.#A(t,!1)}renderForStandalone(){const t=this.#ue=document.createElement("button");t.className="annotationCommentButton";const e=this.#a.commentButtonPosition;if(e){const{style:i}=t;i.insetInlineEnd=`calc(${100*("ltr"===this.#a._uiManager.direction?1-e[0]:e[0])}% - var(--comment-button-dim))`;i.top=`calc(${100*e[1]}% - var(--comment-button-dim))`;const s=this.#a.commentButtonColor;s&&(i.backgroundColor=s)}return this.#A(t,!0)}focusButton(){setTimeout(()=>{(this.#ue??this.#pe)?.focus()},0)}onUpdatedColor(){if(!this.#ue)return;const t=this.#a.commentButtonColor;t&&(this.#ue.style.backgroundColor=t);this.#a._uiManager.updatePopupColor(this.#a)}get commentButtonWidth(){return(this.#ue?.getBoundingClientRect().width??0)/this.#a.parent.boundingClientRect.width}get commentPopupPositionInLayer(){if(this.#ve)return this.#ve;if(!this.#ue)return null;const{x:t,y:e,height:i}=this.#ue.getBoundingClientRect(),{x:s,y:n,width:r,height:a}=this.#a.parent.boundingClientRect;return[(t-s)/r,(e+i-n)/a]}set commentPopupPositionInLayer(t){this.#ve=t}hasDefaultPopupPosition(){return null===this.#ve}removeStandaloneCommentButton(){this.#ue?.remove();this.#ue=null}removeToolbarCommentButton(){this.#pe?.remove();this.#pe=null}setCommentButtonStates({selected:t,hasPopup:e}){if(this.#ue){this.#ue.classList.toggle("selected",t);this.#ue.ariaExpanded=e}}#A(t,e){if(!this.#a._uiManager.hasCommentManager())return null;t.tabIndex="0";t.ariaHasPopup="dialog";if(e){t.ariaControls="commentPopup";t.setAttribute("data-l10n-id","pdfjs-show-comment-button")}else{t.ariaControlsElements=[this.#a._uiManager.getCommentDialogElement()];t.setAttribute("data-l10n-id","pdfjs-editor-add-comment-button")}const i=this.#a._uiManager._signal;if(!(i instanceof AbortSignal)||i.aborted)return t;t.addEventListener("contextmenu",noContextMenu,{signal:i});if(e){t.addEventListener("focusin",t=>{this.#a._focusEventsAllowed=!1;stopEvent(t)},{capture:!0,signal:i});t.addEventListener("focusout",t=>{this.#a._focusEventsAllowed=!0;stopEvent(t)},{capture:!0,signal:i})}t.addEventListener("pointerdown",t=>t.stopPropagation(),{signal:i});const onClick=e=>{e.preventDefault();t===this.#pe?this.edit():this.#a.toggleComment(!0)};t.addEventListener("click",onClick,{capture:!0,signal:i});t.addEventListener("keydown",e=>{if(e.target===t&&"Enter"===e.key){this.#ge=!0;onClick(e)}},{signal:i});t.addEventListener("pointerenter",()=>{this.#a.toggleComment(!1,!0)},{signal:i});t.addEventListener("pointerleave",()=>{this.#a.toggleComment(!1,!1)},{signal:i});return t}edit(t){const e=this.commentPopupPositionInLayer;let i,s;if(e)[i,s]=e;else{[i,s]=this.#a.commentButtonPosition;const{width:t,height:e,x:n,y:r}=this.#a;i=n+i*t;s=r+s*e}const n=this.#a.parent.boundingClientRect,{x:r,y:a,width:o,height:l}=n;this.#a._uiManager.editComment(this.#a,r+i*o,a+s*l,{...t,parentDimensions:n})}finish(){if(this.#pe){this.#pe.focus({focusVisible:this.#ge});this.#ge=!1}}isDeleted(){return this.#Ae||""===this.#be}isEmpty(){return null===this.#be}hasBeenEdited(){return this.isDeleted()||this.#be!==this.#me}serialize(){return this.data}get data(){return{text:this.#be,richText:this.#fe,date:this.#ye,deleted:this.isDeleted()}}set data(t){t!==this.#be&&(this.#fe=null);if(null!==t){this.#be=t;this.#ye=new Date;this.#Ae=!1}else{this.#be="";this.#Ae=!0}}restoreData({text:t,richText:e,date:i}){this.#be=t;this.#fe=e;this.#ye=i;this.#Ae=!1}setInitialText(t,e=null){this.#me=t;this.data=t;this.#ye=null;this.#fe=e}shown(){}destroy(){this.#pe?.remove();this.#pe=null;this.#ue?.remove();this.#ue=null;this.#be="";this.#fe=null;this.#ye=null;this.#a=null;this.#ge=!1;this.#Ae=!1}}class TouchManager{#_t;#we=!1;#xe=null;#Ce;#Ee;#Te;#Se;#_e=null;#Pe;#De=null;#Me;#ke=null;constructor({container:t,isPinchingDisabled:e=null,isPinchingStopped:i=null,onPinchStart:s=null,onPinching:n=null,onPinchEnd:r=null,signal:a}){this.#_t=t;this.#xe=i;this.#Ce=e;this.#Ee=s;this.#Te=n;this.#Se=r;this.#Me=new AbortController;this.#Pe=AbortSignal.any([a,this.#Me.signal]);t.addEventListener("touchstart",this.#Ie.bind(this),{passive:!1,signal:this.#Pe})}get MIN_TOUCH_DISTANCE_TO_PINCH(){return 35/OutputScale.pixelRatio}#Ie(t){if(this.#Ce?.())return;if(1===t.touches.length){if(this.#_e)return;const t=this.#_e=new AbortController,e=AbortSignal.any([this.#Pe,t.signal]),i=this.#_t,s={capture:!0,signal:e,passive:!1},cancelPointerDown=t=>{if("touch"===t.pointerType){this.#_e?.abort();this.#_e=null}};i.addEventListener("pointerdown",t=>{if("touch"===t.pointerType){stopEvent(t);cancelPointerDown(t)}},s);i.addEventListener("pointerup",cancelPointerDown,s);i.addEventListener("pointercancel",cancelPointerDown,s);return}if(!this.#ke){this.#ke=new AbortController;const t=AbortSignal.any([this.#Pe,this.#ke.signal]),e=this.#_t,i={signal:t,capture:!1,passive:!1};e.addEventListener("touchmove",this.#Fe.bind(this),i);const s=this.#Be.bind(this);e.addEventListener("touchend",s,i);e.addEventListener("touchcancel",s,i);i.capture=!0;e.addEventListener("pointerdown",stopEvent,i);e.addEventListener("pointermove",stopEvent,i);e.addEventListener("pointercancel",stopEvent,i);e.addEventListener("pointerup",stopEvent,i);this.#Ee?.()}stopEvent(t);if(2!==t.touches.length||this.#xe?.()){this.#De=null;return}let[e,i]=t.touches;e.identifier>i.identifier&&([e,i]=[i,e]);this.#De={touch0X:e.screenX,touch0Y:e.screenY,touch1X:i.screenX,touch1Y:i.screenY}}#Fe(t){if(!this.#De||2!==t.touches.length)return;stopEvent(t);let[e,i]=t.touches;e.identifier>i.identifier&&([e,i]=[i,e]);const{screenX:s,screenY:n}=e,{screenX:r,screenY:a}=i,o=this.#De,{touch0X:l,touch0Y:h,touch1X:d,touch1Y:c}=o,u=d-l,p=c-h,g=r-s,m=a-n,f=Math.hypot(g,m)||1,b=Math.hypot(u,p)||1;if(!this.#we&&Math.abs(b-f)<=TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH)return;o.touch0X=s;o.touch0Y=n;o.touch1X=r;o.touch1Y=a;if(!this.#we){this.#we=!0;return}const y=[(s+r)/2,(n+a)/2];this.#Te?.(y,b,f)}#Be(t){if(!(t.touches.length>=2)){if(this.#ke){this.#ke.abort();this.#ke=null;this.#Se?.()}if(this.#De){stopEvent(t);this.#De=null;this.#we=!1}}}destroy(){this.#Me?.abort();this.#Me=null;this.#_e?.abort();this.#_e=null}}class AnnotationEditor{#Re=null;#Oe=null;#l=null;#h=null;#ue=null;#Le=!1;#Ne=null;#Ue="";#He=null;#ze=null;#Ge=null;#We=null;#Ve=null;#je="";#$e=!1;#Xe=null;#qe=!1;#Ke=!1;#Ye=!1;#Qe=null;#Je=0;#Ze=0;#ti=null;#ei=null;isSelected=!1;_isCopy=!1;_editToolbar=null;_initialOptions=Object.create(null);_initialData=null;_isVisible=!0;_uiManager=null;_focusEventsAllowed=!0;static _l10n=null;static _l10nResizer=null;#ii=!1;#si=AnnotationEditor._zIndex++;static _borderLineWidth=-1;static _colorManager=new ColorManager;static _zIndex=1;static _telemetryTimeout=1e3;static get _resizerKeyboardManager(){const t=AnnotationEditor.prototype._resizeWithKeyboard,e=AnnotationEditorUIManager.TRANSLATE_SMALL,i=AnnotationEditorUIManager.TRANSLATE_BIG;return shadow(this,"_resizerKeyboardManager",new KeyboardManager([[["ArrowLeft","mac+ArrowLeft"],t,{args:[-e,0]}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],t,{args:[-i,0]}],[["ArrowRight","mac+ArrowRight"],t,{args:[e,0]}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],t,{args:[i,0]}],[["ArrowUp","mac+ArrowUp"],t,{args:[0,-e]}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],t,{args:[0,-i]}],[["ArrowDown","mac+ArrowDown"],t,{args:[0,e]}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],t,{args:[0,i]}],[["Escape","mac+Escape"],AnnotationEditor.prototype._stopResizingWithKeyboard]]))}constructor(t){this.parent=t.parent;this.id=t.id;this.width=this.height=null;this.pageIndex=t.parent.pageIndex;this.name=t.name;this.div=null;this._uiManager=t.uiManager;this.annotationElementId=null;this._willKeepAspectRatio=!1;this._initialOptions.isCentered=t.isCentered;this._structTreeParentId=null;this.annotationElementId=t.annotationElementId||null;this.creationDate=t.creationDate||new Date;this.modificationDate=t.modificationDate||null;this.canAddComment=!0;const{rotation:e,rawDims:{pageWidth:i,pageHeight:s,pageX:n,pageY:r}}=this.parent.viewport;this.rotation=e;this.pageRotation=(360+e-this._uiManager.viewParameters.rotation)%360;this.pageDimensions=[i,s];this.pageTranslation=[n,r];const[a,o]=this.parentDimensions;this.x=t.x/a;this.y=t.y/o;this.isAttachedToDOM=!1;this.deleted=!1}updatePageIndex(t){this.pageIndex=t}get editorType(){return Object.getPrototypeOf(this).constructor._type}get mode(){return Object.getPrototypeOf(this).constructor._editorType}static get isDrawer(){return!1}static get _defaultLineColor(){return shadow(this,"_defaultLineColor",this._colorManager.getHexCode("CanvasText"))}static deleteAnnotationElement(t){const e=new FakeEditor({id:t._uiManager.getId(),parent:t.parent,uiManager:t._uiManager});e.annotationElementId=t.annotationElementId;e.deleted=!0;e._uiManager.addToAnnotationStorage(e)}static initialize(t,e){AnnotationEditor._l10n??=t;AnnotationEditor._l10nResizer||=Object.freeze({topLeft:"pdfjs-editor-resizer-top-left",topMiddle:"pdfjs-editor-resizer-top-middle",topRight:"pdfjs-editor-resizer-top-right",middleRight:"pdfjs-editor-resizer-middle-right",bottomRight:"pdfjs-editor-resizer-bottom-right",bottomMiddle:"pdfjs-editor-resizer-bottom-middle",bottomLeft:"pdfjs-editor-resizer-bottom-left",middleLeft:"pdfjs-editor-resizer-middle-left"});if(-1!==AnnotationEditor._borderLineWidth)return;const i=getComputedStyle(document.documentElement);AnnotationEditor._borderLineWidth=parseFloat(i.getPropertyValue("--outline-width"))||0}static updateDefaultParams(t,e){}static get defaultPropertiesToUpdate(){return[]}static isHandlingMimeForPasting(t){return!1}static paste(t,e){unreachable("Not implemented")}get propertiesToUpdate(){return[]}get _isDraggable(){return this.#ii}set _isDraggable(t){this.#ii=t;this.div?.classList.toggle("draggable",t)}get uid(){return this.annotationElementId||this.id}get isEnterHandled(){return!0}center(){const[t,e]=this.pageDimensions;switch(this.parentRotation){case 90:this.x-=this.height*e/(2*t);this.y+=this.width*t/(2*e);break;case 180:this.x+=this.width/2;this.y+=this.height/2;break;case 270:this.x+=this.height*e/(2*t);this.y-=this.width*t/(2*e);break;default:this.x-=this.width/2;this.y-=this.height/2}this.fixAndSetPosition()}addCommands(t){this._uiManager.addCommands(t)}get currentLayer(){return this._uiManager.currentLayer}setInBackground(){this.div.style.zIndex=0}setInForeground(){this.div.style.zIndex=this.#si}setParent(t){if(null!==t){this.pageIndex=t.pageIndex;this.pageDimensions=t.pageDimensions}else{this.#ni();this.#We?.remove();this.#We=null}this.parent=t}focusin(t){this._focusEventsAllowed&&(this.#$e?this.#$e=!1:this.parent.setSelected(this))}focusout(t){if(!this._focusEventsAllowed)return;if(!this.isAttachedToDOM)return;const e=t.relatedTarget;if(!e?.closest(`#${this.id}`)){t.preventDefault();this.parent?.isMultipleSelection||this.commitOrRemove()}}commitOrRemove(){this.isEmpty()?this.remove():this.commit()}commit(){this.isInEditMode()&&this.addToAnnotationStorage()}addToAnnotationStorage(){this._uiManager.addToAnnotationStorage(this)}setAt(t,e,i,s){const[n,r]=this.parentDimensions;[i,s]=this.screenToPageTranslation(i,s);this.x=(t+i)/n;this.y=(e+s)/r;this.fixAndSetPosition()}_moveAfterPaste(t,e){if(this.isClone){delete this.isClone;return}const[i,s]=this.parentDimensions;this.setAt(t*i,e*s,this.width*i,this.height*s);this._onTranslated()}#ri([t,e],i,s){[i,s]=this.screenToPageTranslation(i,s);this.x+=i/t;this.y+=s/e;this._onTranslating(this.x,this.y);this.fixAndSetPosition()}translate(t,e){this.#ri(this.parentDimensions,t,e)}translateInPage(t,e){this.#Xe||=[this.x,this.y,this.width,this.height];this.#ri(this.pageDimensions,t,e);this.div.scrollIntoView({block:"nearest"})}translationDone(){this._onTranslated(this.x,this.y)}drag(t,e){this.#Xe||=[this.x,this.y,this.width,this.height];const{div:i,parentDimensions:[s,n]}=this;this.x+=t/s;this.y+=e/n;if(this.parent&&(this.x<0||this.x>1||this.y<0||this.y>1)){const{x:t,y:e}=this.div.getBoundingClientRect();if(this.parent.findNewParent(this,t,e)){this.x-=Math.floor(this.x);this.y-=Math.floor(this.y)}}let{x:r,y:a}=this;const[o,l]=this.getBaseTranslation();r+=o;a+=l;const{style:h}=i;h.left=`${(100*r).toFixed(2)}%`;h.top=`${(100*a).toFixed(2)}%`;this._onTranslating(r,a);i.scrollIntoView({block:"nearest"})}_onTranslating(t,e){}_onTranslated(t,e){}get _hasBeenMoved(){return!!this.#Xe&&(this.#Xe[0]!==this.x||this.#Xe[1]!==this.y)}get _hasBeenResized(){return!!this.#Xe&&(this.#Xe[2]!==this.width||this.#Xe[3]!==this.height)}getBaseTranslation(){const[t,e]=this.parentDimensions,{_borderLineWidth:i}=AnnotationEditor,s=i/t,n=i/e;switch(this.rotation){case 90:return[-s,n];case 180:return[s,n];case 270:return[s,-n];default:return[-s,-n]}}get _mustFixPosition(){return!0}fixAndSetPosition(t=this.rotation){const{div:{style:e},pageDimensions:[i,s]}=this;let{x:n,y:r,width:a,height:o}=this;a*=i;o*=s;n*=i;r*=s;if(this._mustFixPosition)switch(t){case 0:n=MathClamp(n,0,i-a);r=MathClamp(r,0,s-o);break;case 90:n=MathClamp(n,0,i-o);r=MathClamp(r,a,s);break;case 180:n=MathClamp(n,a,i);r=MathClamp(r,o,s);break;case 270:n=MathClamp(n,o,i);r=MathClamp(r,0,s-a)}this.x=n/=i;this.y=r/=s;const[l,h]=this.getBaseTranslation();n+=l;r+=h;e.left=`${(100*n).toFixed(2)}%`;e.top=`${(100*r).toFixed(2)}%`;this.moveInDOM()}static#ai(t,e,i){switch(i){case 90:return[e,-t];case 180:return[-t,-e];case 270:return[-e,t];default:return[t,e]}}screenToPageTranslation(t,e){return AnnotationEditor.#ai(t,e,this.parentRotation)}pageTranslationToScreen(t,e){return AnnotationEditor.#ai(t,e,360-this.parentRotation)}#oi(t){switch(t){case 90:{const[t,e]=this.pageDimensions;return[0,-t/e,e/t,0]}case 180:return[-1,0,0,-1];case 270:{const[t,e]=this.pageDimensions;return[0,t/e,-e/t,0]}default:return[1,0,0,1]}}get parentScale(){return this._uiManager.viewParameters.realScale}get parentRotation(){return(this._uiManager.viewParameters.rotation+this.pageRotation)%360}get parentDimensions(){const{parentScale:t,pageDimensions:[e,i]}=this;return[e*t,i*t]}setDims(){const{div:{style:t},width:e,height:i}=this;t.width=`${(100*e).toFixed(2)}%`;t.height=`${(100*i).toFixed(2)}%`}getInitialTranslation(){return[0,0]}#li(){if(this.#He)return;this.#He=document.createElement("div");this.#He.classList.add("resizers");const t=this._willKeepAspectRatio?["topLeft","topRight","bottomRight","bottomLeft"]:["topLeft","topMiddle","topRight","middleRight","bottomRight","bottomMiddle","bottomLeft","middleLeft"],e=this._uiManager._signal;for(const i of t){const t=document.createElement("div");this.#He.append(t);t.classList.add("resizer",i);t.setAttribute("data-resizer-name",i);t.addEventListener("pointerdown",this.#hi.bind(this,i),{signal:e});t.addEventListener("contextmenu",noContextMenu,{signal:e});t.tabIndex=-1}this.div.prepend(this.#He)}#hi(t,e){e.preventDefault();const{isMac:i}=FeatureTest.platform;if(0!==e.button||e.ctrlKey&&i)return;this.#l?.toggle(!1);const s=this._isDraggable;this._isDraggable=!1;this.#ze=[e.screenX,e.screenY];const n=new AbortController,r=this._uiManager.combinedSignal(n);this.parent.togglePointerEvents(!1);window.addEventListener("pointermove",this.#di.bind(this,t),{passive:!0,capture:!0,signal:r});window.addEventListener("touchmove",stopEvent,{passive:!1,signal:r});window.addEventListener("contextmenu",noContextMenu,{signal:r});this.#Ge={savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height};const a=this.parent.div.style.cursor,o=this.div.style.cursor;this.div.style.cursor=this.parent.div.style.cursor=window.getComputedStyle(e.target).cursor;const pointerUpCallback=()=>{n.abort();this.parent.togglePointerEvents(!0);this.#l?.toggle(!0);this._isDraggable=s;this.parent.div.style.cursor=a;this.div.style.cursor=o;this.#ci()};window.addEventListener("pointerup",pointerUpCallback,{signal:r});window.addEventListener("blur",pointerUpCallback,{signal:r})}#ui(t,e,i,s){this.width=i;this.height=s;this.x=t;this.y=e;this.setDims();this.fixAndSetPosition();this._onResized()}_onResized(){}#ci(){if(!this.#Ge)return;const{savedX:t,savedY:e,savedWidth:i,savedHeight:s}=this.#Ge;this.#Ge=null;const n=this.x,r=this.y,a=this.width,o=this.height;n===t&&r===e&&a===i&&o===s||this.addCommands({cmd:this.#ui.bind(this,n,r,a,o),undo:this.#ui.bind(this,t,e,i,s),mustExec:!0})}static _round(t){return Math.round(1e4*t)/1e4}#di(t,e){const[i,s]=this.parentDimensions,n=this.x,r=this.y,a=this.width,o=this.height,l=AnnotationEditor.MIN_SIZE/i,h=AnnotationEditor.MIN_SIZE/s,d=this.#oi(this.rotation),transf=(t,e)=>[d[0]*t+d[2]*e,d[1]*t+d[3]*e],c=this.#oi(360-this.rotation);let u,p,g=!1,m=!1;switch(t){case"topLeft":g=!0;u=(t,e)=>[0,0];p=(t,e)=>[t,e];break;case"topMiddle":u=(t,e)=>[t/2,0];p=(t,e)=>[t/2,e];break;case"topRight":g=!0;u=(t,e)=>[t,0];p=(t,e)=>[0,e];break;case"middleRight":m=!0;u=(t,e)=>[t,e/2];p=(t,e)=>[0,e/2];break;case"bottomRight":g=!0;u=(t,e)=>[t,e];p=(t,e)=>[0,0];break;case"bottomMiddle":u=(t,e)=>[t/2,e];p=(t,e)=>[t/2,0];break;case"bottomLeft":g=!0;u=(t,e)=>[0,e];p=(t,e)=>[t,0];break;case"middleLeft":m=!0;u=(t,e)=>[0,e/2];p=(t,e)=>[t,e/2]}const f=u(a,o),b=p(a,o);let y=transf(...b);const A=AnnotationEditor._round(n+y[0]),v=AnnotationEditor._round(r+y[1]);let w,x,C=1,E=1;if(e.fromKeyboard)({deltaX:w,deltaY:x}=e);else{const{screenX:t,screenY:i}=e,[s,n]=this.#ze;[w,x]=this.screenToPageTranslation(t-s,i-n);this.#ze[0]=t;this.#ze[1]=i}[w,x]=(T=w/i,S=x/s,[c[0]*T+c[2]*S,c[1]*T+c[3]*S]);var T,S;if(g){const t=Math.hypot(a,o);C=E=Math.max(Math.min(Math.hypot(b[0]-f[0]-w,b[1]-f[1]-x)/t,1/a,1/o),l/a,h/o)}else m?C=MathClamp(Math.abs(b[0]-f[0]-w),l,1)/a:E=MathClamp(Math.abs(b[1]-f[1]-x),h,1)/o;const _=AnnotationEditor._round(a*C),P=AnnotationEditor._round(o*E);y=transf(...p(_,P));const D=A-y[0],M=v-y[1];this.#Xe||=[this.x,this.y,this.width,this.height];this.width=_;this.height=P;this.x=D;this.y=M;this.setDims();this.fixAndSetPosition();this._onResizing()}_onResizing(){}altTextFinish(){this.#l?.finish()}get toolbarButtons(){return null}async addEditToolbar(){if(this._editToolbar||this.#Ke)return this._editToolbar;this._editToolbar=new EditorToolbar(this);this.div.append(this._editToolbar.render());const{toolbarButtons:t}=this;if(t)for(const[e,i]of t)await this._editToolbar.addButton(e,i);this.hasComment||this._editToolbar.addButton("comment",this.addCommentButton());this._editToolbar.addButton("delete");return this._editToolbar}addCommentButtonInToolbar(){this._editToolbar?.addButtonBefore("comment",this.addCommentButton(),".deleteButton")}removeCommentButtonFromToolbar(){this._editToolbar?.removeButton("comment")}removeEditToolbar(){this._editToolbar?.remove();this._editToolbar=null;this.#l?.destroy()}addContainer(t){const e=this._editToolbar?.div;e?e.before(t):this.div.append(t)}getClientDimensions(){return this.div.getBoundingClientRect()}createAltText(){if(!this.#l){AltText.initialize(AnnotationEditor._l10n);this.#l=new AltText(this);if(this.#Re){this.#l.data=this.#Re;this.#Re=null}}return this.#l}get altTextData(){return this.#l?.data}set altTextData(t){this.#l&&(this.#l.data=t)}get guessedAltText(){return this.#l?.guessedText}async setGuessedAltText(t){await(this.#l?.setGuessedText(t))}serializeAltText(t){return this.#l?.serialize(t)}hasAltText(){return!!this.#l&&!this.#l.isEmpty()}hasAltTextData(){return this.#l?.hasData()??!1}focusCommentButton(){this.#h?.focusButton()}addCommentButton(){return this.canAddComment?this.#h||=new Comment(this):null}addStandaloneCommentButton(){if(this._uiManager.hasCommentManager())if(this.#ue)this._uiManager.isEditingMode()&&this.#ue.classList.remove("hidden");else if(this.hasComment){this.#ue=this.#h.renderForStandalone();this.div.append(this.#ue)}}removeStandaloneCommentButton(){this.#h.removeStandaloneCommentButton();this.#ue=null}hideStandaloneCommentButton(){this.#ue?.classList.add("hidden")}get comment(){if(!this.#h)return null;const{data:{richText:t,text:e,date:i,deleted:s}}=this.#h;return{text:e,richText:t,date:i,deleted:s,color:this.getNonHCMColor(),opacity:this.opacity??1}}set comment(t){this.#h||=new Comment(this);"object"==typeof t&&null!==t?this.#h.restoreData(t):this.#h.data=t;if(this.hasComment){this.removeCommentButtonFromToolbar();this.addStandaloneCommentButton();this._uiManager.updateComment(this)}else{this.addCommentButtonInToolbar();this.removeStandaloneCommentButton();this._uiManager.removeComment(this)}}setCommentData({comment:t,popupRef:e,richText:i}){if(!e)return;this.#h||=new Comment(this);this.#h.setInitialText(t,i);if(!this.annotationElementId)return;const s=this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId);s&&this.updateFromAnnotationLayer(s)}get hasEditedComment(){return this.#h?.hasBeenEdited()}get hasDeletedComment(){return this.#h?.isDeleted()}get hasComment(){return!!this.#h&&!this.#h.isEmpty()&&!this.#h.isDeleted()}async editComment(t){this.#h||=new Comment(this);this.#h.edit(t)}toggleComment(t,e=void 0){this.hasComment&&this._uiManager.toggleComment(this,t,e)}setSelectedCommentButton(t){this.#h.setSelectedButton(t)}addComment(t){if(this.hasEditedComment){const e=180,i=100,[,,,s]=t.rect,[n]=this.pageDimensions,[r]=this.pageTranslation,a=r+n+1,o=s-i,l=a+e;t.popup={contents:this.comment.text,deleted:this.comment.deleted,rect:[a,o,l,s]}}}updateFromAnnotationLayer({popup:{contents:t,deleted:e}}){this.#h.data=e?null:t}get parentBoundingClientRect(){return this.parent.boundingClientRect}render(){const t=this.div=document.createElement("div");t.setAttribute("data-editor-rotation",(360-this.rotation)%360);t.className=this.name;t.setAttribute("id",this.id);t.tabIndex=this.#Le?-1:0;t.setAttribute("role","application");this.defaultL10nId&&t.setAttribute("data-l10n-id",this.defaultL10nId);this._isVisible||t.classList.add("hidden");this.setInForeground();this.#pi();const[e,i]=this.parentDimensions;if(this.parentRotation%180!=0){t.style.maxWidth=`${(100*i/e).toFixed(2)}%`;t.style.maxHeight=`${(100*e/i).toFixed(2)}%`}const[s,n]=this.getInitialTranslation();this.translate(s,n);bindEvents(this,t,["keydown","pointerdown","dblclick"]);this.isResizable&&this._uiManager._supportsPinchToZoom&&(this.#ei||=new TouchManager({container:t,isPinchingDisabled:()=>!this.isSelected,onPinchStart:this.#gi.bind(this),onPinching:this.#mi.bind(this),onPinchEnd:this.#fi.bind(this),signal:this._uiManager._signal}));this.addStandaloneCommentButton();this._uiManager._editorUndoBar?.hide();return t}#gi(){this.#Ge={savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height};this.#l?.toggle(!1);this.parent.togglePointerEvents(!1)}#mi(t,e,i){let s=i/e*.7+1-.7;if(1===s)return;const n=this.#oi(this.rotation),transf=(t,e)=>[n[0]*t+n[2]*e,n[1]*t+n[3]*e],[r,a]=this.parentDimensions,o=this.x,l=this.y,h=this.width,d=this.height,c=AnnotationEditor.MIN_SIZE/r,u=AnnotationEditor.MIN_SIZE/a;s=Math.max(Math.min(s,1/h,1/d),c/h,u/d);const p=AnnotationEditor._round(h*s),g=AnnotationEditor._round(d*s);if(p===h&&g===d)return;this.#Xe||=[o,l,h,d];const m=transf(h/2,d/2),f=AnnotationEditor._round(o+m[0]),b=AnnotationEditor._round(l+m[1]),y=transf(p/2,g/2);this.x=f-y[0];this.y=b-y[1];this.width=p;this.height=g;this.setDims();this.fixAndSetPosition();this._onResizing()}#fi(){this.#l?.toggle(!0);this.parent.togglePointerEvents(!0);this.#ci()}pointerdown(t){const{isMac:e}=FeatureTest.platform;if(0!==t.button||t.ctrlKey&&e)t.preventDefault();else{this.#$e=!0;this._isDraggable?this.#bi(t):this.#yi(t)}}#yi(t){const{isMac:e}=FeatureTest.platform;t.ctrlKey&&!e||t.shiftKey||t.metaKey&&e?this.parent.toggleSelected(this):this.parent.setSelected(this)}#bi(t){const{isSelected:e}=this;this._uiManager.setUpDragSession();let i=!1;const s=new AbortController,n=this._uiManager.combinedSignal(s),r={capture:!0,passive:!1,signal:n},cancelDrag=t=>{s.abort();this.#Ne=null;this.#$e=!1;this._uiManager.endDragSession()||this.#yi(t);i&&this._onStopDragging()};if(e){this.#Je=t.clientX;this.#Ze=t.clientY;this.#Ne=t.pointerId;this.#Ue=t.pointerType;window.addEventListener("pointermove",t=>{if(!i){i=!0;this._uiManager.toggleComment(this,!0,!1);this._onStartDragging()}const{clientX:e,clientY:s,pointerId:n}=t;if(n!==this.#Ne){stopEvent(t);return}const[r,a]=this.screenToPageTranslation(e-this.#Je,s-this.#Ze);this.#Je=e;this.#Ze=s;this._uiManager.dragSelectedEditors(r,a)},r);window.addEventListener("touchmove",stopEvent,r);window.addEventListener("pointerdown",t=>{t.pointerType===this.#Ue&&(this.#ei||t.isPrimary)&&cancelDrag(t);stopEvent(t)},r)}const pointerUpCallback=t=>{this.#Ne&&this.#Ne!==t.pointerId?stopEvent(t):cancelDrag(t)};window.addEventListener("pointerup",pointerUpCallback,{signal:n});window.addEventListener("blur",pointerUpCallback,{signal:n})}_onStartDragging(){}_onStopDragging(){}moveInDOM(){this.#Qe&&clearTimeout(this.#Qe);this.#Qe=setTimeout(()=>{this.#Qe=null;this.parent?.moveEditorInDOM(this)},0)}_setParentAndPosition(t,e,i){t.changeParent(this);this.x=e;this.y=i;this.fixAndSetPosition();this._onTranslated()}getRect(t,e,i=this.rotation){const s=this.parentScale,[n,r]=this.pageDimensions,[a,o]=this.pageTranslation,l=t/s,h=e/s,d=this.x*n,c=this.y*r,u=this.width*n,p=this.height*r;switch(i){case 0:return[d+l+a,r-c-h-p+o,d+l+u+a,r-c-h+o];case 90:return[d+h+a,r-c+l+o,d+h+p+a,r-c+l+u+o];case 180:return[d-l-u+a,r-c+h+o,d-l+a,r-c+h+p+o];case 270:return[d-h-p+a,r-c-l-u+o,d-h+a,r-c-l+o];default:throw new Error("Invalid rotation")}}getRectInCurrentCoords(t,e){const[i,s,n,r]=t,a=n-i,o=r-s;switch(this.rotation){case 0:return[i,e-r,a,o];case 90:return[i,e-s,o,a];case 180:return[n,e-s,a,o];case 270:return[n,e-r,o,a];default:throw new Error("Invalid rotation")}}getPDFRect(){return this.getRect(0,0)}getNonHCMColor(){return this.color&&AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color))}onUpdatedColor(){this.#h?.onUpdatedColor()}getData(){const{comment:{text:t,color:e,date:i,opacity:s,deleted:n,richText:r},uid:a,pageIndex:o,creationDate:l,modificationDate:h}=this;return{id:a,pageIndex:o,rect:this.getPDFRect(),richText:r,contentsObj:{str:t},creationDate:l,modificationDate:i||h,popupRef:!n,color:e,opacity:s}}onceAdded(t){}isEmpty(){return!1}enableEditMode(){if(this.isInEditMode())return!1;this.parent.setEditingState(!1);this.#Ke=!0;return!0}disableEditMode(){if(!this.isInEditMode())return!1;this.parent.setEditingState(!0);this.#Ke=!1;return!0}isInEditMode(){return this.#Ke}shouldGetKeyboardEvents(){return this.#Ye}needsToBeRebuilt(){return this.div&&!this.isAttachedToDOM}get isOnScreen(){const{top:t,left:e,bottom:i,right:s}=this.getClientDimensions(),{innerHeight:n,innerWidth:r}=window;return e0&&t0}#pi(){if(this.#Ve||!this.div)return;this.#Ve=new AbortController;const t=this._uiManager.combinedSignal(this.#Ve);this.div.addEventListener("focusin",this.focusin.bind(this),{signal:t});this.div.addEventListener("focusout",this.focusout.bind(this),{signal:t})}rebuild(){this.#pi()}rotate(t){}resize(){}serializeDeleted(){return{id:this.annotationElementId,deleted:!0,pageIndex:this.pageIndex,popupRef:this._initialData?.popupRef||""}}serialize(t=!1,e=null){return{annotationType:this.mode,pageIndex:this.pageIndex,rect:this.getPDFRect(),rotation:this.rotation,structTreeParentId:this._structTreeParentId,popupRef:this._initialData?.popupRef||""}}static async deserialize(t,e,i){const s=new this.prototype.constructor({parent:e,id:i.getId(),uiManager:i,annotationElementId:t.annotationElementId,creationDate:t.creationDate,modificationDate:t.modificationDate});s.rotation=t.rotation;s.#Re=t.accessibilityData;s._isCopy=t.isCopy||!1;const[n,r]=s.pageDimensions,[a,o,l,h]=s.getRectInCurrentCoords(t.rect,r);s.x=a/n;s.y=o/r;s.width=l/n;s.height=h/r;return s}get hasBeenModified(){return!!this.annotationElementId&&(this.deleted||null!==this.serialize())}remove(){this.#Ve?.abort();this.#Ve=null;this.isEmpty()||this.commit();this.parent?this.parent.remove(this):this._uiManager.removeEditor(this);this.hideCommentPopup();if(this.#Qe){clearTimeout(this.#Qe);this.#Qe=null}this.#ni();this.removeEditToolbar();if(this.#ti){for(const t of this.#ti.values())clearTimeout(t);this.#ti=null}this.parent=null;this.#ei?.destroy();this.#ei=null;this.#We?.remove();this.#We=null}get isResizable(){return!1}makeResizable(){if(this.isResizable){this.#li();this.#He.classList.remove("hidden")}}get toolbarPosition(){return null}get commentButtonPosition(){return"ltr"===this._uiManager.direction?[1,0]:[0,0]}get commentButtonPositionInPage(){const{commentButtonPosition:[t,e]}=this,[i,s,n,r]=this.getPDFRect();return[AnnotationEditor._round(i+(n-i)*t),AnnotationEditor._round(s+(r-s)*(1-e))]}get commentButtonColor(){return this._uiManager.makeCommentColor(this.getNonHCMColor(),this.opacity)}get commentPopupPosition(){return this.#h.commentPopupPositionInLayer}set commentPopupPosition(t){this.#h.commentPopupPositionInLayer=t}hasDefaultPopupPosition(){return this.#h.hasDefaultPopupPosition()}get commentButtonWidth(){return this.#h.commentButtonWidth}get elementBeforePopup(){return this.div}setCommentButtonStates(t){this.#h?.setCommentButtonStates(t)}keydown(t){if(!this.isResizable||t.target!==this.div||"Enter"!==t.key)return;this._uiManager.setSelected(this);this.#Ge={savedX:this.x,savedY:this.y,savedWidth:this.width,savedHeight:this.height};const e=this.#He.children;if(!this.#Oe){this.#Oe=Array.from(e);const t=this.#Ai.bind(this),i=this.#vi.bind(this),s=this._uiManager._signal;for(const e of this.#Oe){const n=e.getAttribute("data-resizer-name");e.setAttribute("role","spinbutton");e.addEventListener("keydown",t,{signal:s});e.addEventListener("blur",i,{signal:s});e.addEventListener("focus",this.#wi.bind(this,n),{signal:s});e.setAttribute("data-l10n-id",AnnotationEditor._l10nResizer[n])}}const i=this.#Oe[0];let s=0;for(const t of e){if(t===i)break;s++}const n=(360-this.rotation+this.parentRotation)%360/90*(this.#Oe.length/4);if(n!==s){if(ns)for(let t=0;t{this.div?.classList.contains("selectedEditor")&&this._editToolbar?.show()})}}focus(){this.div&&!this.div.contains(document.activeElement)&&setTimeout(()=>this.div?.focus({preventScroll:!0}),0)}unselect(){if(this.isSelected){this.isSelected=!1;this.#He?.classList.add("hidden");this.div?.classList.remove("selectedEditor");this.div?.contains(document.activeElement)&&this._uiManager.currentLayer.div.focus({preventScroll:!0});this._editToolbar?.hide();this.#l?.toggleAltTextBadge(!0);this.hideCommentPopup()}}hideCommentPopup(){this.hasComment&&this._uiManager.toggleComment(null)}updateParams(t,e){}disableEditing(){}enableEditing(){}get canChangeContent(){return!1}enterInEditMode(){if(this.canChangeContent){this.enableEditMode();this.div.focus()}}dblclick(t){if("BUTTON"!==t.target.nodeName){this.enterInEditMode();this.parent.updateToolbar({mode:this.constructor._editorType,editId:this.uid})}}getElementForAltText(){return this.div}get contentDiv(){return this.div}get isEditing(){return this.#qe}set isEditing(t){this.#qe=t;if(this.parent)if(t){this.parent.setSelected(this);this.parent.setActiveEditor(this)}else this.parent.setActiveEditor(null)}static get MIN_SIZE(){return 16}static canCreateNewEmptyEditor(){return!0}get telemetryInitialData(){return{action:"added"}}get telemetryFinalData(){return null}_reportTelemetry(t,e=!1){if(e){this.#ti||=new Map;const{action:e}=t;let i=this.#ti.get(e);i&&clearTimeout(i);i=setTimeout(()=>{this._reportTelemetry(t);this.#ti.delete(e);0===this.#ti.size&&(this.#ti=null)},AnnotationEditor._telemetryTimeout);this.#ti.set(e,i);return}t.type||=this.editorType;this._uiManager._eventBus.dispatch("reporttelemetry",{source:this,details:{type:"editing",data:t}})}show(t=this._isVisible){this.div.classList.toggle("hidden",!t);this._isVisible=t}enable(){this.div&&(this.div.tabIndex=0);this.#Le=!1}disable(){this.div&&(this.div.tabIndex=-1);this.#Le=!0}updateFakeAnnotationElement(t){if(this.#We||this.deleted)if(this.deleted){this.#We.remove();this.#We=null}else(this.hasEditedComment||this._hasBeenMoved||this._hasBeenResized)&&this.#We.updateEdited({rect:this.getPDFRect(),popup:this.comment});else this.#We=t.addFakeAnnotation(this)}renderAnnotationElement(t){if(this.deleted){t.hide();return null}let e=t.container.querySelector(".annotationContent");if(e){if("CANVAS"===e.nodeName){const t=e;e=document.createElement("div");e.classList.add("annotationContent",this.editorType);t.before(e)}}else{e=document.createElement("div");e.classList.add("annotationContent",this.editorType);t.container.prepend(e)}return e}resetAnnotationElement(t){const{firstElementChild:e}=t.container;"DIV"===e?.nodeName&&e.classList.contains("annotationContent")&&e.remove()}}class FakeEditor extends AnnotationEditor{constructor(t){super(t);this.annotationElementId=t.annotationElementId;this.deleted=!0}serialize(){return this.serializeDeleted()}}const X=3285377520,q=4294901760,K=65535;class MurmurHash3_64{constructor(t){this.h1=t?4294967295&t:X;this.h2=t?4294967295&t:X}update(t){let e,i;if("string"==typeof t){e=new Uint8Array(2*t.length);i=0;for(let s=0,n=t.length;s>>8;e[i++]=255&n}}}else{if(!ArrayBuffer.isView(t))throw new Error("Invalid data format, must be a string or TypedArray.");e=t.slice();i=e.byteLength}const s=i>>2,n=i-4*s,r=new Uint32Array(e.buffer,0,s);let a=0,o=0,l=this.h1,h=this.h2;const d=3432918353,c=461845907,u=11601,p=13715;for(let t=0;t>>17;a=a*c&q|a*p&K;l^=a;l=l<<13|l>>>19;l=5*l+3864292196}else{o=r[t];o=o*d&q|o*u&K;o=o<<15|o>>>17;o=o*c&q|o*p&K;h^=o;h=h<<13|h>>>19;h=5*h+3864292196}a=0;switch(n){case 3:a^=e[4*s+2]<<16;case 2:a^=e[4*s+1]<<8;case 1:a^=e[4*s];a=a*d&q|a*u&K;a=a<<15|a>>>17;a=a*c&q|a*p&K;1&s?l^=a:h^=a}this.h1=l;this.h2=h}hexdigest(){let t=this.h1,e=this.h2;t^=e>>>1;t=3981806797*t&q|36045*t&K;e=4283543511*e&q|(2950163797*(e<<16|t>>>16)&q)>>>16;t^=e>>>1;t=444984403*t&q|60499*t&K;e=3301882366*e&q|(3120437893*(e<<16|t>>>16)&q)>>>16;t^=e>>>1;return(t>>>0).toString(16).padStart(8,"0")+(e>>>0).toString(16).padStart(8,"0")}}const Y=Object.freeze({map:null,hash:"",transfer:void 0});class AnnotationStorage{#Ci=!1;#Ei=null;#Ti=null;#Si=new Map;onSetModified=null;onResetModified=null;onAnnotationEditor=null;getValue(t,e){const i=this.#Si.get(t);return void 0===i?e:Object.assign(e,i)}getRawValue(t){return this.#Si.get(t)}remove(t){const e=this.#Si.get(t);if(void 0!==e){e instanceof AnnotationEditor&&this.#Ti.delete(e.annotationElementId);this.#Si.delete(t);0===this.#Si.size&&this.resetModified();this.#Si.values().some(t=>t instanceof AnnotationEditor)||this.onAnnotationEditor?.(null)}}setValue(t,e){const i=this.#Si.get(t);let s=!1;if(void 0!==i){for(const[t,n]of Object.entries(e))if(i[t]!==n){s=!0;i[t]=n}}else{s=!0;this.#Si.set(t,e)}s&&this.#_i();if(e instanceof AnnotationEditor){(this.#Ti||=new Map).set(e.annotationElementId,e);this.onAnnotationEditor?.(e.constructor._type)}}has(t){return this.#Si.has(t)}get size(){return this.#Si.size}#_i(){if(!this.#Ci){this.#Ci=!0;this.onSetModified?.()}}resetModified(){if(this.#Ci){this.#Ci=!1;this.onResetModified?.()}}get print(){return new PrintAnnotationStorage(this)}get serializable(){if(0===this.#Si.size)return Y;const t=new Map,e=new MurmurHash3_64,i=[],s=Object.create(null);let n=!1;for(const[i,r]of this.#Si){const a=r instanceof AnnotationEditor?r.serialize(!1,s):r;if(r.page){r.pageIndex=r.page._pageIndex;delete r.page}if(a){t.set(i,a);e.update(`${i}:${JSON.stringify(a)}`);n||=!!a.bitmap}}if(n)for(const e of t.values())e.bitmap&&i.push(e.bitmap);return t.size>0?{map:t,hash:e.hexdigest(),transfer:i}:Y}get editorStats(){let t=null;const e=new Map;let i=0,s=0;for(const n of this.#Si.values()){if(!(n instanceof AnnotationEditor)){n.popup&&(n.popup.deleted?s+=1:i+=1);continue}n.isCommentDeleted?s+=1:n.hasEditedComment&&(i+=1);const r=n.telemetryFinalData;if(!r)continue;const{type:a}=r;e.has(a)||e.set(a,Object.getPrototypeOf(n).constructor);t||=Object.create(null);const o=t[a]||=new Map;for(const[t,e]of Object.entries(r)){if("type"===t)continue;const i=o.getOrInsertComputed(t,makeMap);i.set(e,(i.get(e)??0)+1)}}if(s>0||i>0){t||=Object.create(null);t.comments={deleted:s,edited:i}}if(!t)return null;for(const[i,s]of e)t[i]=s.computeTelemetryFinalData(t[i]);return t}resetModifiedIds(){this.#Ei=null}updateEditor(t,e){const i=this.#Ti?.get(t);if(i){i.updateFromAnnotationLayer(e);return!0}return!1}getEditor(t){return this.#Ti?.get(t)||null}get modifiedIds(){if(this.#Ei)return this.#Ei;const t=[];if(this.#Ti)for(const e of this.#Ti.values())e.serialize()&&t.push(e.annotationElementId);let e="";if(t.length){const i=new MurmurHash3_64;i.update(t.join(","));e=i.hexdigest()}return this.#Ei={ids:new Set(t),hash:e}}[Symbol.iterator](){return this.#Si.entries()}}class PrintAnnotationStorage extends AnnotationStorage{#Pi=Y;constructor(t){super();const{serializable:e}=t;if(e===Y)return;const{map:i,hash:s,transfer:n}=e,r=structuredClone(i,n?{transfer:n}:null);this.#Pi={map:r,hash:s,transfer:[]}}get print(){unreachable("Should not call PrintAnnotationStorage.print")}get serializable(){return this.#Pi}get modifiedIds(){return shadow(this,"modifiedIds",{ids:new Set,hash:""})}}const Q="__forcedDependency",{floor:J,ceil:Z}=Math;function expandBBox(t,e,i,s,n,r){t[4*e+0]=Math.min(t[4*e+0],i);t[4*e+1]=Math.min(t[4*e+1],s);t[4*e+2]=Math.max(t[4*e+2],n);t[4*e+3]=Math.max(t[4*e+3],r)}const tt=new Uint32Array(new Uint8Array([255,255,0,0]).buffer)[0];class BBoxReader{#Di;#Mi;constructor(t,e){this.#Di=t;this.#Mi=e}get length(){return this.#Di.length}isEmpty(t){return this.#Di[t]===tt}minX(t){return this.#Mi[4*t+0]/256}minY(t){return this.#Mi[4*t+1]/256}maxX(t){return(this.#Mi[4*t+2]+1)/256}maxY(t){return(this.#Mi[4*t+3]+1)/256}}const ensureDebugMetadata=(t,e)=>t?.getOrInsertComputed(e,()=>({dependencies:new Set,isRenderingOperation:!1}));class CanvasBBoxTracker{#ki=[[1,0,0,1,0,0]];#Ii=[-1/0,-1/0,1/0,1/0];#Fi=new Float64Array(e);_pendingBBoxIdx=-1;#Bi;#Ri;#Oi;#Di;_savesStack=[];_markedContentStack=[];constructor(t,e){this.#Bi=t.width;this.#Ri=t.height;this.#Li(e)}growOperationsCount(t){t>=this.#Di.length&&this.#Li(t,this.#Di)}#Li(t,e){const i=new ArrayBuffer(4*t);this.#Oi=new Uint8ClampedArray(i);this.#Di=new Uint32Array(i);if(e&&e.length>0){this.#Di.set(e);this.#Di.fill(tt,e.length)}else this.#Di.fill(tt)}get clipBox(){return this.#Ii}save(t){this.#Ii={__proto__:this.#Ii};this._savesStack.push(t);return this}restore(t,e){const i=Object.getPrototypeOf(this.#Ii);if(null===i)return this;this.#Ii=i;const s=this._savesStack.pop();if(void 0!==s){e?.(s,t);this.#Di[t]=this.#Di[s]}return this}recordOpenMarker(t){this._savesStack.push(t);return this}getOpenMarker(){return 0===this._savesStack.length?null:this._savesStack.at(-1)}recordCloseMarker(t,e){const i=this._savesStack.pop();if(void 0!==i){e?.(i,t);this.#Di[t]=this.#Di[i]}return this}beginMarkedContent(t){this._markedContentStack.push(t);return this}endMarkedContent(t,e){const i=this._markedContentStack.pop();if(void 0!==i){e?.(i,t);this.#Di[t]=this.#Di[i]}return this}pushBaseTransform(t){this.#ki.push(Util.multiplyByDOMMatrix(this.#ki.at(-1),t.getTransform()));return this}popBaseTransform(){this.#ki.length>1&&this.#ki.pop();return this}resetBBox(t){if(this._pendingBBoxIdx!==t){this._pendingBBoxIdx=t;this.#Fi.set(e,0)}return this}recordClipBox(t,i,s,n,r,a){const o=Util.multiplyByDOMMatrix(this.#ki.at(-1),i.getTransform()),l=e.slice();Util.axialAlignedBoundingBox([s,r,n,a],o,l);const h=Util.intersect(this.#Ii,l);if(h){this.#Ii[0]=h[0];this.#Ii[1]=h[1];this.#Ii[2]=h[2];this.#Ii[3]=h[3]}else{this.#Ii[0]=this.#Ii[1]=1/0;this.#Ii[2]=this.#Ii[3]=-1/0}return this}recordBBox(t,i,s,n,r,a){const o=this.#Ii;if(o[0]===1/0)return this;const l=Util.multiplyByDOMMatrix(this.#ki.at(-1),i.getTransform());if(o[0]===-1/0){Util.axialAlignedBoundingBox([s,r,n,a],l,this.#Fi);return this}const h=e.slice();Util.axialAlignedBoundingBox([s,r,n,a],l,h);this.#Fi[0]=MathClamp(h[0],o[0],this.#Fi[0]);this.#Fi[1]=MathClamp(h[1],o[1],this.#Fi[1]);this.#Fi[2]=MathClamp(h[2],this.#Fi[2],o[2]);this.#Fi[3]=MathClamp(h[3],this.#Fi[3],o[3]);return this}recordFullPageBBox(t){this.#Fi[0]=Math.max(0,this.#Ii[0]);this.#Fi[1]=Math.max(0,this.#Ii[1]);this.#Fi[2]=Math.min(this.#Bi,this.#Ii[2]);this.#Fi[3]=Math.min(this.#Ri,this.#Ii[3]);return this}recordOperation(t,e=!1,i){if(this._pendingBBoxIdx!==t)return this;const s=J(256*this.#Fi[0]/this.#Bi),n=J(256*this.#Fi[1]/this.#Ri),r=Z(256*this.#Fi[2]/this.#Bi),a=Z(256*this.#Fi[3]/this.#Ri);expandBBox(this.#Oi,t,s,n,r,a);if(i)for(const e of i)for(const i of e)i!==t&&expandBBox(this.#Oi,i,s,n,r,a);e||(this._pendingBBoxIdx=-1);return this}bboxToClipBoxDropOperation(t){if(this._pendingBBoxIdx===t){this._pendingBBoxIdx=-1;this.#Ii[0]=Math.max(this.#Ii[0],this.#Fi[0]);this.#Ii[1]=Math.max(this.#Ii[1],this.#Fi[1]);this.#Ii[2]=Math.min(this.#Ii[2],this.#Fi[2]);this.#Ii[3]=Math.min(this.#Ii[3],this.#Fi[3])}return this}take(){return new BBoxReader(this.#Di,this.#Oi)}takeDebugMetadata(){throw new Error("Unreachable")}recordSimpleData(t,e){return this}recordIncrementalData(t,e){return this}resetIncrementalData(t,e){return this}recordNamedData(t,e){return this}recordSimpleDataFromNamed(t,e,i){return this}recordFutureForcedDependency(t,e){return this}inheritSimpleDataAsFutureForcedDependencies(t){return this}inheritPendingDependenciesAsFutureForcedDependencies(){return this}recordCharacterBBox(t,e,i,s=1,n=0,r=0,a){return this}getSimpleIndex(t){}recordDependencies(t,e){return this}recordNamedDependency(t,e){return this}recordShowTextOperation(t,e=!1){return this}}class CanvasDependencyTracker{#Ni={__proto__:null};#Ui={__proto__:null,transform:[],moveText:[],sameLineText:[],[Q]:[]};#Hi=new Map;#zi=new Set;#Gi=new Map;#Wi;#Vi;#ji;constructor(t,e=!1){this.#ji=t;if(e){this.#Wi=new Map;this.#Vi=(t,e)=>{ensureDebugMetadata(this.#Wi,e).dependencies.add(t)}}}get clipBox(){return this.#ji.clipBox}growOperationsCount(t){this.#ji.growOperationsCount(t)}save(t){this.#Ni={__proto__:this.#Ni};this.#Ui={__proto__:this.#Ui,transform:{__proto__:this.#Ui.transform},moveText:{__proto__:this.#Ui.moveText},sameLineText:{__proto__:this.#Ui.sameLineText},[Q]:{__proto__:this.#Ui[Q]}};this.#ji.save(t);return this}restore(t){this.#ji.restore(t,this.#Vi);const e=Object.getPrototypeOf(this.#Ni);if(null===e)return this;this.#Ni=e;this.#Ui=Object.getPrototypeOf(this.#Ui);return this}recordOpenMarker(t){this.#ji.recordOpenMarker(t,this.#Vi);return this}getOpenMarker(){return this.#ji.getOpenMarker()}recordCloseMarker(t){this.#ji.recordCloseMarker(t,this.#Vi);return this}beginMarkedContent(t){this.#ji.beginMarkedContent(t);return this}endMarkedContent(t){this.#ji.endMarkedContent(t,this.#Vi);return this}pushBaseTransform(t){this.#ji.pushBaseTransform(t);return this}popBaseTransform(){this.#ji.popBaseTransform();return this}recordSimpleData(t,e){this.#Ni[t]=e;return this}recordIncrementalData(t,e){this.#Ui[t].push(e);return this}resetIncrementalData(t,e){this.#Ui[t].length=0;return this}recordNamedData(t,e){this.#Hi.set(t,e);return this}recordSimpleDataFromNamed(t,e,i){this.#Ni[t]=this.#Hi.get(e)??i}recordFutureForcedDependency(t,e){this.recordIncrementalData(Q,e);return this}inheritSimpleDataAsFutureForcedDependencies(t){for(const e of t)e in this.#Ni&&this.recordFutureForcedDependency(e,this.#Ni[e]);return this}inheritPendingDependenciesAsFutureForcedDependencies(){for(const t of this.#zi)this.recordFutureForcedDependency(Q,t);return this}resetBBox(t){this.#ji.resetBBox(t);return this}recordClipBox(t,e,i,s,n,r){this.#ji.recordClipBox(t,e,i,s,n,r);return this}recordBBox(t,e,i,s,n,r){this.#ji.recordBBox(t,e,i,s,n,r);return this}recordCharacterBBox(t,e,i,s=1,n=0,r=0,a){const o=i.bbox;let l,h;if(o){l=o[2]!==o[0]&&o[3]!==o[1]&&this.#Gi.get(i);if(!1!==l){h=[0,0,0,0];Util.axialAlignedBoundingBox(o,i.fontMatrix,h);1===s&&0===n&&0===r||Util.scaleMinMax([s,0,0,-s,n,r],h);if(l)return this.recordBBox(t,e,h[0],h[2],h[1],h[3])}}if(!a)return this.recordFullPageBBox(t);const d=a();if(o&&h&&void 0===l){l=h[0]<=n-d.actualBoundingBoxLeft&&h[2]>=n+d.actualBoundingBoxRight&&h[1]<=r-d.actualBoundingBoxAscent&&h[3]>=r+d.actualBoundingBoxDescent;this.#Gi.set(i,l);if(l)return this.recordBBox(t,e,h[0],h[2],h[1],h[3])}return this.recordBBox(t,e,n-d.actualBoundingBoxLeft,n+d.actualBoundingBoxRight,r-d.actualBoundingBoxAscent,r+d.actualBoundingBoxDescent)}recordFullPageBBox(t){this.#ji.recordFullPageBBox(t);return this}getSimpleIndex(t){return this.#Ni[t]}recordDependencies(t,e){const i=this.#zi,s=this.#Ni,n=this.#Ui;for(const t of e)t in this.#Ni?i.add(s[t]):t in n&&n[t].forEach(i.add,i);return this}recordNamedDependency(t,e){this.#Hi.has(e)&&this.#zi.add(this.#Hi.get(e));return this}recordOperation(t,e=!1){this.recordDependencies(t,[Q]);if(this.#Wi){const e=ensureDebugMetadata(this.#Wi,t),{dependencies:i}=e;this.#zi.forEach(i.add,i);this.#ji._savesStack.forEach(i.add,i);this.#ji._markedContentStack.forEach(i.add,i);i.delete(t);e.isRenderingOperation=!0}const i=!e&&t===this.#ji._pendingBBoxIdx;this.#ji.recordOperation(t,e,[this.#zi,this.#ji._savesStack,this.#ji._markedContentStack]);i&&this.#zi.clear();return this}recordShowTextOperation(t,e=!1){const i=Array.from(this.#zi);this.recordOperation(t,e);this.recordIncrementalData("sameLineText",t);for(const t of i)this.recordIncrementalData("sameLineText",t);return this}bboxToClipBoxDropOperation(t,e=!1){const i=!e&&t===this.#ji._pendingBBoxIdx;this.#ji.bboxToClipBoxDropOperation(t);i&&this.#zi.clear();return this}take(){this.#Gi.clear();return this.#ji.take()}takeDebugMetadata(){return this.#Wi}}class CanvasNestedDependencyTracker{#$i;#Xi;#qi;#Ki=0;#Yi=0;constructor(t,e,i){if(t instanceof CanvasNestedDependencyTracker&&t.#qi===!!i)return t;this.#$i=t;this.#Xi=e;this.#qi=!!i}get clipBox(){return this.#$i.clipBox}growOperationsCount(){throw new Error("Unreachable")}save(t){this.#Yi++;this.#$i.save(this.#Xi);return this}restore(t){if(this.#Yi>0){this.#$i.restore(this.#Xi);this.#Yi--}return this}recordOpenMarker(t){this.#Ki++;return this}getOpenMarker(){return this.#Ki>0?this.#Xi:this.#$i.getOpenMarker()}recordCloseMarker(t){this.#Ki--;return this}beginMarkedContent(t){return this}endMarkedContent(t){return this}pushBaseTransform(t){this.#$i.pushBaseTransform(t);return this}popBaseTransform(){this.#$i.popBaseTransform();return this}recordSimpleData(t,e){this.#$i.recordSimpleData(t,this.#Xi);return this}recordIncrementalData(t,e){this.#$i.recordIncrementalData(t,this.#Xi);return this}resetIncrementalData(t,e){this.#$i.resetIncrementalData(t,this.#Xi);return this}recordNamedData(t,e){return this}recordSimpleDataFromNamed(t,e,i){this.#$i.recordSimpleDataFromNamed(t,e,this.#Xi);return this}recordFutureForcedDependency(t,e){this.#$i.recordFutureForcedDependency(t,this.#Xi);return this}inheritSimpleDataAsFutureForcedDependencies(t){this.#$i.inheritSimpleDataAsFutureForcedDependencies(t);return this}inheritPendingDependenciesAsFutureForcedDependencies(){this.#$i.inheritPendingDependenciesAsFutureForcedDependencies();return this}resetBBox(t){this.#qi||this.#$i.resetBBox(this.#Xi);return this}recordClipBox(t,e,i,s,n,r){this.#qi||this.#$i.recordClipBox(this.#Xi,e,i,s,n,r);return this}recordBBox(t,e,i,s,n,r){this.#qi||this.#$i.recordBBox(this.#Xi,e,i,s,n,r);return this}recordCharacterBBox(t,e,i,s,n,r,a){this.#qi||this.#$i.recordCharacterBBox(this.#Xi,e,i,s,n,r,a);return this}recordFullPageBBox(t){this.#qi||this.#$i.recordFullPageBBox(this.#Xi);return this}getSimpleIndex(t){return this.#$i.getSimpleIndex(t)}recordDependencies(t,e){this.#$i.recordDependencies(this.#Xi,e);return this}recordNamedDependency(t,e){this.#$i.recordNamedDependency(this.#Xi,e);return this}recordOperation(t){this.#$i.recordOperation(this.#Xi,!0);return this}recordShowTextOperation(t){this.#$i.recordShowTextOperation(this.#Xi,!0);return this}bboxToClipBoxDropOperation(t){this.#qi||this.#$i.bboxToClipBoxDropOperation(this.#Xi,!0);return this}take(){throw new Error("Unreachable")}takeDebugMetadata(){throw new Error("Unreachable")}}const et=["path","transform","filter","strokeColor","strokeAlpha","lineWidth","lineCap","lineJoin","miterLimit","dash"],it=["path","transform","filter","fillColor","fillAlpha","globalCompositeOperation","SMask"],st=["transform","SMask","filter","fillAlpha","strokeAlpha","globalCompositeOperation"],nt=["filter","fillColor","fillAlpha"],rt=["transform","leading","charSpacing","wordSpacing","hScale","textRise","moveText","textMatrix","font","fontObj","filter","fillColor","textRenderingMode","SMask","fillAlpha","strokeAlpha","globalCompositeOperation","sameLineText"],at=["transform"],ot=["transform","fillColor"];class CanvasImagesTracker{#Bi;#Ri;#Qi=4;#Ji=0;#Mi=new CanvasImagesTracker.#Zi(6*this.#Qi);static#Zi=FeatureTest.isFloat16ArraySupported?Float16Array:Float32Array;constructor(t){this.#Bi=t.width;this.#Ri=t.height}record(t,i,s,n){if(this.#Ji===this.#Qi){this.#Qi*=2;const t=new CanvasImagesTracker.#Zi(6*this.#Qi);t.set(this.#Mi);this.#Mi=t}const r=Util.domMatrixToTransform(t.getTransform());let a;if(n[0]!==1/0){const t=e.slice();Util.axialAlignedBoundingBox([0,-s,i,0],r,t);const o=Util.intersect(n,t);if(!o)return;const[l,h,d,c]=o;if(l!==t[0]||h!==t[1]||d!==t[2]||c!==t[3]){const t=Math.atan2(r[1],r[0]),e=Math.abs(Math.sin(t)),i=Math.abs(Math.cos(t));if(e<1e-6||i<1e-6||Math.abs(e-i)<1e-6)a=[l,h,l,c,d,h];else{const t=d-l,s=c-h,n=e*e,r=i*i,o=i*e,u=r-n,p=(s*r-t*o)/u;a=[l+(s*o-t*n)/u,h,l,h+p,d,c-p]}}}if(!a){a=[0,-s,0,0,i,-s];Util.applyTransform(a,r,0);Util.applyTransform(a,r,2);Util.applyTransform(a,r,4)}a[0]/=this.#Bi;a[1]/=this.#Ri;a[2]/=this.#Bi;a[3]/=this.#Ri;a[4]/=this.#Bi;a[5]/=this.#Ri;this.#Mi.set(a,6*this.#Ji);this.#Ji++}take(){return this.#Mi.subarray(0,6*this.#Ji)}}class FontLoader{#ts=new Set;constructor({ownerDocument:t=globalThis.document,styleElement:e=null}){this._document=t;this.nativeFontFaces=new Set;this.styleElement=null;this.loadingRequests=[];this.loadTestFontId=0}addNativeFontFace(t){this.nativeFontFaces.add(t);this._document.fonts.add(t)}removeNativeFontFace(t){this.nativeFontFaces.delete(t);this._document.fonts.delete(t)}insertRule(t){if(!this.styleElement){this.styleElement=this._document.createElement("style");this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement)}const e=this.styleElement.sheet;e.insertRule(t,e.cssRules.length)}clear(){for(const t of this.nativeFontFaces)this._document.fonts.delete(t);this.nativeFontFaces.clear();this.#ts.clear();if(this.styleElement){this.styleElement.remove();this.styleElement=null}}async loadSystemFont({systemFontInfo:t,disableFontFace:e,_inspectFont:i}){if(t&&!this.#ts.has(t.loadedName)){assert(!e,"loadSystemFont shouldn't be called when `disableFontFace` is set.");if(this.isFontLoadingAPISupported){const{loadedName:e,src:s,style:n}=t,r=new FontFace(e,s,n);this.addNativeFontFace(r);try{await r.load();this.#ts.add(e);i?.(t)}catch{warn(`Cannot load system font: ${t.baseFontName}, installing it could help to improve PDF rendering.`);this.removeNativeFontFace(r)}return}unreachable("Not implemented: loadSystemFont without the Font Loading API.")}}async bind(t){if(t.attached||t.missingFile&&!t.systemFontInfo)return;t.attached=!0;if(t.systemFontInfo){await this.loadSystemFont(t);return}if(this.isFontLoadingAPISupported){const e=t.createNativeFontFace();if(e){this.addNativeFontFace(e);try{await e.loaded}catch(i){warn(`Failed to load font '${e.family}': '${i}'.`);t.disableFontFace=!0;throw i}}return}const e=t.createFontFaceRule();if(e){this.insertRule(e);if(this.isSyncFontLoadingSupported)return;await new Promise(e=>{const i=this._queueLoadingCallback(e);this._prepareFontLoadEvent(t,i)})}}get isFontLoadingAPISupported(){return shadow(this,"isFontLoadingAPISupported",!!this._document?.fonts)}get isSyncFontLoadingSupported(){return shadow(this,"isSyncFontLoadingSupported",t||FeatureTest.platform.isFirefox)}_queueLoadingCallback(t){const{loadingRequests:e}=this,i={done:!1,complete:function completeRequest(){assert(!i.done,"completeRequest() cannot be called twice.");i.done=!0;for(;e.length>0&&e[0].done;){const t=e.shift();setTimeout(t.callback,0)}},callback:t};e.push(i);return i}get _loadTestFont(){return shadow(this,"_loadTestFont",atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="))}_prepareFontLoadEvent(t,e){function int32(t,e){return t.charCodeAt(e)<<24|t.charCodeAt(e+1)<<16|t.charCodeAt(e+2)<<8|255&t.charCodeAt(e+3)}function spliceString(t,e,i,s){return t.substring(0,e)+s+t.substring(e+i)}let i,s;const n=this._document.createElement("canvas");n.width=1;n.height=1;const r=n.getContext("2d");let a=0;const o=`lt${Date.now()}${this.loadTestFontId++}`;let l=this._loadTestFont;l=spliceString(l,976,o.length,o);const h=1482184792;let d=int32(l,16);for(i=0,s=o.length-3;i>24&255,t>>16&255,t>>8&255,255&t)}(d));const c=`@font-face {font-family:"${o}";src:${`url(data:font/opentype;base64,${btoa(l)});`}}`;this.insertRule(c);const u=this._document.createElement("div");u.style.visibility="hidden";u.style.width=u.style.height="10px";u.style.position="absolute";u.style.top=u.style.left="0px";for(const e of[t.loadedName,o]){const t=this._document.createElement("span");t.textContent="Hi";t.style.fontFamily=e;u.append(t)}this._document.body.append(u);!function isFontReady(t,e){if(++a>30){warn("Load test font never loaded.");e();return}r.font="30px "+t;r.fillText(".",0,20);r.getImageData(0,0,1,1).data[3]>0?e():setTimeout(isFontReady.bind(null,t,e))}(o,()=>{u.remove();e.complete()})}}class FontFaceObject{compiledGlyphs=Object.create(null);#es;constructor(t,e=null,i,s){this.#es=t;this._inspectFont=e;i&&(this.charProcOperatorList=i);s&&Object.assign(this,s)}createNativeFontFace(){if(!this.data||this.disableFontFace)return null;let t;if(this.cssFontInfo){const e={weight:this.cssFontInfo.fontWeight};this.cssFontInfo.italicAngle&&(e.style=`oblique ${this.cssFontInfo.italicAngle}deg`);t=new FontFace(this.cssFontInfo.fontFamily,this.data,e)}else t=new FontFace(this.loadedName,this.data,{});this._inspectFont?.(this);return t}createFontFaceRule(){if(!this.data||this.disableFontFace)return null;const t=`url(data:${this.mimetype};base64,${this.data.toBase64()});`;let e;if(this.cssFontInfo){let i=`font-weight: ${this.cssFontInfo.fontWeight};`;this.cssFontInfo.italicAngle&&(i+=`font-style: oblique ${this.cssFontInfo.italicAngle}deg;`);e=`@font-face {font-family:"${this.cssFontInfo.fontFamily}";${i}src:${t}}`}else e=`@font-face {font-family:"${this.loadedName}";src:${t}}`;this._inspectFont?.(this,t);return e}getPathGenerator(t,e){if(void 0!==this.compiledGlyphs[e])return this.compiledGlyphs[e];const i=this.loadedName+"_path_"+e;let s;try{s=t.get(i)}catch(t){warn(`getPathGenerator - ignoring character: "${t}".`)}const n=makePathFromDrawOPS(s?.path);this.fontExtraProperties||t.delete(i);return this.compiledGlyphs[e]=n}get black(){return this.#es.black}get bold(){return this.#es.bold}get disableFontFace(){return this.#es.disableFontFace}set disableFontFace(t){shadow(this,"disableFontFace",!!t)}get fontExtraProperties(){return this.#es.fontExtraProperties}get isInvalidPDFjsFont(){return this.#es.isInvalidPDFjsFont}get isType3Font(){return this.#es.isType3Font}get italic(){return this.#es.italic}get missingFile(){return this.#es.missingFile}get remeasure(){return this.#es.remeasure}get vertical(){return this.#es.vertical}get ascent(){return this.#es.ascent}get defaultWidth(){return this.#es.defaultWidth}get descent(){return this.#es.descent}get bbox(){return this.#es.bbox}get fontMatrix(){return this.#es.fontMatrix}get fallbackName(){return this.#es.fallbackName}get loadedName(){return this.#es.loadedName}get mimetype(){return this.#es.mimetype}get name(){return this.#es.name}get data(){return this.#es.data}clearData(){this.#es.clearData()}get cssFontInfo(){return this.#es.cssFontInfo}get systemFontInfo(){return this.#es.systemFontInfo}get defaultVMetrics(){return this.#es.defaultVMetrics}}class CSS_FONT_INFO{static strings=["fontFamily","fontWeight","italicAngle"]}class SYSTEM_FONT_INFO{static strings=["css","loadedName","baseFontName","src"]}class FONT_INFO{static bools=["black","bold","disableFontFace","fontExtraProperties","isInvalidPDFjsFont","isType3Font","italic","missingFile","remeasure","vertical"];static numbers=["ascent","defaultWidth","descent"];static strings=["fallbackName","loadedName","mimetype","name"];static OFFSET_NUMBERS=Math.ceil(2*this.bools.length/8);static OFFSET_BBOX=this.OFFSET_NUMBERS+8*this.numbers.length;static OFFSET_FONT_MATRIX=this.OFFSET_BBOX+1+8;static OFFSET_DEFAULT_VMETRICS=this.OFFSET_FONT_MATRIX+1+48;static OFFSET_STRINGS=this.OFFSET_DEFAULT_VMETRICS+1+6}class PATTERN_INFO{static KIND=0;static HAS_BBOX=1;static HAS_BACKGROUND=2;static SHADING_TYPE=3;static N_COORD=4;static N_COLOR=8;static N_STOP=12;static N_FIGURES=16}class CssFontInfo{#is;#ss=new TextDecoder;#ns;constructor(t){this.#is=t;this.#ns=new DataView(t)}#rs(t){assert(t>i&3;return 0===s?void 0:2===s}get black(){return this.#as(0)}get bold(){return this.#as(1)}get disableFontFace(){return this.#as(2)}get fontExtraProperties(){return this.#as(3)}get isInvalidPDFjsFont(){return this.#as(4)}get isType3Font(){return this.#as(5)}get italic(){return this.#as(6)}get missingFile(){return this.#as(7)}get remeasure(){return this.#as(8)}get vertical(){return this.#as(9)}#os(t){assert(t0){i=e.slice();for(let t=0,e=h.length;t"object"==typeof t&&Number.isInteger(t?.num)&&t.num>=0&&Number.isInteger(t?.gen)&&t.gen>=0,lt=function _isValidExplicitDest(t,e,i){if(!Array.isArray(i)||i.length<2)return!1;const[s,n,...r]=i;if(!t(s)&&!Number.isInteger(s))return!1;if(!e(n))return!1;const a=r.length;let o=!0;switch(n.name){case"XYZ":if(a<2||a>3)return!1;break;case"Fit":case"FitB":return 0===a;case"FitH":case"FitBH":case"FitV":case"FitBV":if(a>1)return!1;break;case"FitR":if(4!==a)return!1;o=!1;break;default:return!1}for(const t of r)if(!("number"==typeof t||o&&null===t))return!1;return!0}.bind(null,isRefProxy,t=>"object"==typeof t&&"string"==typeof t?.name);class LoopbackPort{#ds=new Map;#cs=Promise.resolve();postMessage(t,e){const i={data:structuredClone(t,e?{transfer:e}:null)};this.#cs.then(()=>{for(const[t]of this.#ds)t.call(this,i)})}addEventListener(t,e,i=null){let s=null;if(i?.signal instanceof AbortSignal){const{signal:n}=i;if(n.aborted){warn("LoopbackPort - cannot use an `aborted` signal.");return}const onAbort=()=>this.removeEventListener(t,e);s=()=>n.removeEventListener("abort",onAbort);n.addEventListener("abort",onAbort)}this.#ds.set(e,s)}removeEventListener(t,e){const i=this.#ds.get(e);i?.();this.#ds.delete(e)}terminate(){for(const[,t]of this.#ds)t?.();this.#ds.clear()}}const ht=1,dt=2,ct=1,ut=2,pt=3,gt=4,mt=5,ft=6,bt=7,yt=8;function onFn(){}function wrapReason(t){if(t instanceof AbortException||t instanceof InvalidPDFException||t instanceof PasswordException||t instanceof ResponseException||t instanceof UnknownErrorException)return t;t instanceof Error||"object"==typeof t&&null!==t||unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(t.name){case"AbortException":return new AbortException(t.message);case"InvalidPDFException":return new InvalidPDFException(t.message);case"PasswordException":return new PasswordException(t.message,t.code);case"ResponseException":return new ResponseException(t.message,t.status,t.missing);case"UnknownErrorException":return new UnknownErrorException(t.message,t.details)}return new UnknownErrorException(t.message,t.toString())}class MessageHandler{#us=new AbortController;constructor(t,e,i){this.sourceName=t;this.targetName=e;this.comObj=i;this.callbackId=1;this.streamId=1;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);i.addEventListener("message",this.#ps.bind(this),{signal:this.#us.signal})}#ps({data:t}){if(t.targetName!==this.sourceName)return;if(t.stream){this.#gs(t);return}if(t.callback){const e=t.callbackId,i=this.callbackCapabilities[e];if(!i)throw new Error(`Cannot resolve callback ${e}`);delete this.callbackCapabilities[e];if(t.callback===ht)i.resolve(t.data);else{if(t.callback!==dt)throw new Error("Unexpected callback case");i.reject(wrapReason(t.reason))}return}const e=this.actionHandler[t.action];if(!e)throw new Error(`Unknown action from worker: ${t.action}`);if(t.callbackId){const i=this.sourceName,s=t.sourceName,n=this.comObj;Promise.try(e,t.data).then(function(e){n.postMessage({sourceName:i,targetName:s,callback:ht,callbackId:t.callbackId,data:e})},function(e){n.postMessage({sourceName:i,targetName:s,callback:dt,callbackId:t.callbackId,reason:wrapReason(e)})});return}t.streamId?this.#ms(t):e(t.data)}on(t,e){const i=this.actionHandler;if(i[t])throw new Error(`There is already an actionName called "${t}"`);i[t]=e}send(t,e,i){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:t,data:e},i)}sendWithPromise(t,e,i){const s=this.callbackId++,n=Promise.withResolvers();this.callbackCapabilities[s]=n;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:t,callbackId:s,data:e},i)}catch(t){n.reject(t)}return n.promise}sendWithStream(t,e,i,s){const n=this.streamId++,r=this.sourceName,a=this.targetName,o=this.comObj;return new ReadableStream({start:i=>{const l=Promise.withResolvers();this.streamControllers[n]={controller:i,startCall:l,pullCall:null,cancelCall:null,isClosed:!1};o.postMessage({sourceName:r,targetName:a,action:t,streamId:n,data:e,desiredSize:i.desiredSize},s);return l.promise},pull:t=>{const e=Promise.withResolvers();this.streamControllers[n].pullCall=e;o.postMessage({sourceName:r,targetName:a,stream:ft,streamId:n,desiredSize:t.desiredSize});return e.promise},cancel:t=>{assert(t instanceof Error,"cancel must have a valid reason");const e=Promise.withResolvers();this.streamControllers[n].cancelCall=e;this.streamControllers[n].isClosed=!0;o.postMessage({sourceName:r,targetName:a,stream:ct,streamId:n,reason:wrapReason(t)});return e.promise}},i)}#ms(t){const e=t.streamId,i=this.sourceName,s=t.sourceName,n=this.comObj,r=this,a=this.actionHandler[t.action],o={enqueue(t,r=1,a){if(this.isCancelled)return;const o=this.desiredSize;this.desiredSize-=r;if(o>0&&this.desiredSize<=0){this.sinkCapability=Promise.withResolvers();this.ready=this.sinkCapability.promise}n.postMessage({sourceName:i,targetName:s,stream:gt,streamId:e,chunk:t},a)},close(){if(!this.isCancelled){this.isCancelled=!0;n.postMessage({sourceName:i,targetName:s,stream:pt,streamId:e});delete r.streamSinks[e]}},error(t){assert(t instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;n.postMessage({sourceName:i,targetName:s,stream:mt,streamId:e,reason:wrapReason(t)})}},sinkCapability:Promise.withResolvers(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:t.desiredSize,ready:null};o.sinkCapability.resolve();o.ready=o.sinkCapability.promise;this.streamSinks[e]=o;Promise.try(a,t.data,o).then(function(){n.postMessage({sourceName:i,targetName:s,stream:yt,streamId:e,success:!0})},function(t){n.postMessage({sourceName:i,targetName:s,stream:yt,streamId:e,reason:wrapReason(t)})})}#gs(t){const e=t.streamId,i=this.sourceName,s=t.sourceName,n=this.comObj,r=this.streamControllers[e],a=this.streamSinks[e];switch(t.stream){case yt:t.success?r.startCall.resolve():r.startCall.reject(wrapReason(t.reason));break;case bt:t.success?r.pullCall.resolve():r.pullCall.reject(wrapReason(t.reason));break;case ft:if(!a){n.postMessage({sourceName:i,targetName:s,stream:bt,streamId:e,success:!0});break}a.desiredSize<=0&&t.desiredSize>0&&a.sinkCapability.resolve();a.desiredSize=t.desiredSize;Promise.try(a.onPull||onFn).then(function(){n.postMessage({sourceName:i,targetName:s,stream:bt,streamId:e,success:!0})},function(t){n.postMessage({sourceName:i,targetName:s,stream:bt,streamId:e,reason:wrapReason(t)})});break;case gt:assert(r,"enqueue should have stream controller");if(r.isClosed)break;r.controller.enqueue(t.chunk);break;case pt:assert(r,"close should have stream controller");if(r.isClosed)break;r.isClosed=!0;r.controller.close();this.#fs(r,e);break;case mt:assert(r,"error should have stream controller");r.controller.error(wrapReason(t.reason));this.#fs(r,e);break;case ut:t.success?r.cancelCall.resolve():r.cancelCall.reject(wrapReason(t.reason));this.#fs(r,e);break;case ct:if(!a)break;const o=wrapReason(t.reason);Promise.try(a.onCancel||onFn,o).then(function(){n.postMessage({sourceName:i,targetName:s,stream:ut,streamId:e,success:!0})},function(t){n.postMessage({sourceName:i,targetName:s,stream:ut,streamId:e,reason:wrapReason(t)})});a.sinkCapability.reject(o);a.isCancelled=!0;delete this.streamSinks[e];break;default:throw new Error("Unexpected stream case")}}async#fs(t,e){await Promise.allSettled([t.startCall?.promise,t.pullCall?.promise,t.cancelCall?.promise]);delete this.streamControllers[e]}destroy(){this.#us?.abort();this.#us=null}}class BaseBinaryDataFactory{#bs=Object.freeze({cMapUrl:"CMap",standardFontDataUrl:"font",wasmUrl:"wasm"});constructor({cMapUrl:t=null,standardFontDataUrl:e=null,wasmUrl:i=null}){this.cMapUrl=t;this.standardFontDataUrl=e;this.wasmUrl=i}async fetch({kind:t,filename:e}){switch(t){case"cMapUrl":case"standardFontDataUrl":case"wasmUrl":break;default:unreachable(`Not implemented: ${t}`)}const i=this[t];if(!i)throw new Error(`Ensure that the \`${t}\` API parameter is provided.`);const s=`${i}${e}`;return this._fetch(s,t).catch(e=>{throw new Error(`Unable to load ${this.#bs[t]} data at: ${s}`)})}async _fetch(t,e){unreachable("Abstract method `_fetch` called.")}}class DOMBinaryDataFactory extends BaseBinaryDataFactory{async _fetch(t,e){const i="cMapUrl"!==e||t.endsWith(".bcmap")?"bytes":"text",s=await fetchData(t,i);return s instanceof Uint8Array?s:stringToBytes(s)}}class BaseCanvasFactory{#ys=!1;constructor({enableHWA:t=!1}){this.#ys=t}create(t,e){if(t<=0||e<=0)throw new Error("Invalid canvas size");const i=this._createCanvas(t,e);return{canvas:i,context:i.getContext("2d",{willReadFrequently:!this.#ys})}}reset({canvas:t},e,i){if(!t)throw new Error("Canvas is not specified");if(e<=0||i<=0)throw new Error("Invalid canvas size");t.width=e;t.height=i}destroy(t){const{canvas:e}=t;if(!e)throw new Error("Canvas is not specified");e.width=e.height=0;t.canvas=null;t.context=null}_createCanvas(t,e){unreachable("Abstract method `_createCanvas` called.")}}class DOMCanvasFactory extends BaseCanvasFactory{constructor({ownerDocument:t=globalThis.document,enableHWA:e=!1}){super({enableHWA:e});this._document=t}_createCanvas(t,e){const i=this._document.createElement("canvas");i.width=t;i.height=e;return i}}class BaseFilterFactory{addFilter(t){return"none"}addHCMFilter(t,e){return"none"}addAlphaFilter(t){return"none"}addLuminosityFilter(t){return"none"}addHighlightHCMFilter(t,e,i,s,n){return"none"}destroy(t=!1){}}class DOMFilterFactory extends BaseFilterFactory{#As;#vs;#ws;#xs;#Cs;#Es;#S=0;constructor({docId:t,ownerDocument:e=globalThis.document}){super();this.#xs=t;this.#Cs=e}get#P(){return this.#vs||=new Map}get#Ts(){return this.#Es||=new Map}get#Ss(){if(!this.#ws){const t=this.#Cs.createElement("div"),{style:e}=t;e.visibility="hidden";e.contain="strict";e.width=e.height=0;e.position="absolute";e.top=e.left=0;e.zIndex=-1;const i=this.#Cs.createElementNS(V,"svg");i.setAttribute("width",0);i.setAttribute("height",0);this.#ws=this.#Cs.createElementNS(V,"defs");t.append(i);i.append(this.#ws);this.#Cs.body.append(t)}return this.#ws}#_s(t){if(1===t.length){const e=t[0],i=new Array(256);for(let t=0;t<256;t++)i[t]=e[t]/255;const s=i.join(",");return[s,s,s]}const[e,i,s]=t,n=new Array(256),r=new Array(256),a=new Array(256);for(let t=0;t<256;t++){n[t]=e[t]/255;r[t]=i[t]/255;a[t]=s[t]/255}return[n.join(","),r.join(","),a.join(",")]}#Ps(t){if(void 0===this.#As){this.#As="";const t=this.#Cs.URL;t!==this.#Cs.baseURI&&(isDataScheme(t)?warn('#createUrl: ignore "data:"-URL for performance reasons.'):this.#As=updateUrlHash(t,""))}return`url(${this.#As}#${t})`}addFilter(t){if(!t)return"none";let e=this.#P.get(t);if(e)return e;const[i,s,n]=this.#_s(t),r=1===t.length?i:`${i}${s}${n}`;e=this.#P.get(r);if(e){this.#P.set(t,e);return e}const a=`g_${this.#xs}_transfer_map_${this.#S++}`,o=this.#Ps(a);this.#P.set(t,o);this.#P.set(r,o);const l=this.#Ds(a);this.#Ms(i,s,n,l);return o}addHCMFilter(t,e){const i=`${t}-${e}`,s="base";let n=this.#Ts.get(s);if(n?.key===i)return n.url;if(n){n.filter?.remove();n.key=i;n.url="none";n.filter=null}else{n={key:i,url:"none",filter:null};this.#Ts.set(s,n)}if(!t||!e)return n.url;const r=this.#ks(t);t=Util.makeHexColor(...r);const a=this.#ks(e);e=Util.makeHexColor(...a);this.#Ss.style.color="";if("#000000"===t&&"#ffffff"===e||t===e)return n.url;const o=new Array(256);for(let t=0;t<=255;t++){const e=t/255;o[t]=e<=.03928?e/12.92:((e+.055)/1.055)**2.4}const l=o.join(","),h=`g_${this.#xs}_hcm_filter`,d=n.filter=this.#Ds(h);this.#Ms(l,l,l,d);this.#Is(d);const getSteps=(t,e)=>{const i=r[t]/255,s=a[t]/255,n=new Array(e+1);for(let t=0;t<=e;t++)n[t]=i+t/e*(s-i);return n.join(",")};this.#Ms(getSteps(0,5),getSteps(1,5),getSteps(2,5),d);n.url=this.#Ps(h);return n.url}addAlphaFilter(t){let e=this.#P.get(t);if(e)return e;const[i]=this.#_s([t]),s=`alpha_${i}`;e=this.#P.get(s);if(e){this.#P.set(t,e);return e}const n=`g_${this.#xs}_alpha_map_${this.#S++}`,r=this.#Ps(n);this.#P.set(t,r);this.#P.set(s,r);const a=this.#Ds(n);this.#Fs(i,a);return r}addLuminosityFilter(t){let e,i,s=this.#P.get(t||"luminosity");if(s)return s;if(t){[e]=this.#_s([t]);i=`luminosity_${e}`}else i="luminosity";s=this.#P.get(i);if(s){this.#P.set(t,s);return s}const n=`g_${this.#xs}_luminosity_map_${this.#S++}`,r=this.#Ps(n);this.#P.set(t,r);this.#P.set(i,r);const a=this.#Ds(n);this.#Bs(a);t&&this.#Fs(e,a);return r}addHighlightHCMFilter(t,e,i,s,n){const r=`${e}-${i}-${s}-${n}`;let a=this.#Ts.get(t);if(a?.key===r)return a.url;if(a){a.filter?.remove();a.key=r;a.url="none";a.filter=null}else{a={key:r,url:"none",filter:null};this.#Ts.set(t,a)}if(!e||!i)return a.url;const[o,l]=[e,i].map(this.#ks.bind(this));let h=Math.round(.2126*o[0]+.7152*o[1]+.0722*o[2]),d=Math.round(.2126*l[0]+.7152*l[1]+.0722*l[2]),[c,u]=[s,n].map(this.#ks.bind(this));d{const s=new Array(256),n=(d-h)/i,r=t/255,a=(e-t)/(255*i);let o=0;for(let t=0;t<=i;t++){const e=Math.round(h+t*n),i=r+t*a;for(let t=o;t<=e;t++)s[t]=i;o=e+1}for(let t=o;t<256;t++)s[t]=s[o-1];return s.join(",")},p=`g_${this.#xs}_hcm_${t}_filter`,g=a.filter=this.#Ds(p);this.#Is(g);this.#Ms(getSteps(c[0],u[0],5),getSteps(c[1],u[1],5),getSteps(c[2],u[2],5),g);a.url=this.#Ps(p);return a.url}destroy(t=!1){if(!t||!this.#Es?.size){this.#ws?.parentNode.parentNode.remove();this.#ws=null;this.#vs?.clear();this.#vs=null;this.#Es?.clear();this.#Es=null;this.#S=0}}#Bs(t){const e=this.#Cs.createElementNS(V,"feColorMatrix");e.setAttribute("type","matrix");e.setAttribute("values","0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0");t.append(e)}#Is(t){const e=this.#Cs.createElementNS(V,"feColorMatrix");e.setAttribute("type","matrix");e.setAttribute("values","0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0");t.append(e)}#Ds(t){const e=this.#Cs.createElementNS(V,"filter");e.setAttribute("color-interpolation-filters","sRGB");e.setAttribute("id",t);this.#Ss.append(e);return e}#Rs(t,e,i){const s=this.#Cs.createElementNS(V,e);s.setAttribute("type","discrete");s.setAttribute("tableValues",i);t.append(s)}#Ms(t,e,i,s){const n=this.#Cs.createElementNS(V,"feComponentTransfer");s.append(n);this.#Rs(n,"feFuncR",t);this.#Rs(n,"feFuncG",e);this.#Rs(n,"feFuncB",i)}#Fs(t,e){const i=this.#Cs.createElementNS(V,"feComponentTransfer");e.append(i);this.#Rs(i,"feFuncA",t)}#ks(t){this.#Ss.style.color=t;return getRGB(getComputedStyle(this.#Ss).getPropertyValue("color"))}}t&&warn("Please use the `legacy` build in Node.js environments.");class NodeFilterFactory extends BaseFilterFactory{}class NodeCanvasFactory extends BaseCanvasFactory{_createCanvas(t,e){return process.getBuiltinModule("module").createRequire(import.meta.url)("@napi-rs/canvas").createCanvas(t,e)}}class NodeBinaryDataFactory extends BaseBinaryDataFactory{async _fetch(t,e){return async function node_utils_fetchData(t){const e=process.getBuiltinModule("fs/promises"),i=await e.readFile(t);return new Uint8Array(i)}(t)}}const At=new class WebGPU{#Os=null;#Ls=null;#Ns=null;#Us=null;async#Hs(){if(!globalThis.navigator?.gpu)return!1;try{const t=await navigator.gpu.requestAdapter();if(!t)return!1;this.#Us=navigator.gpu.getPreferredCanvasFormat();this.#Ls=await t.requestDevice();return!0}catch{return!1}}init(){return this.#Os||=this.#Hs()}get isReady(){return null!==this.#Ls}loadMeshShader(){if(!this.#Ls||this.#Ns)return;const t=this.#Ls.createShaderModule({code:"\nstruct Uniforms {\n offsetX : f32,\n offsetY : f32,\n scaleX : f32,\n scaleY : f32,\n paddedWidth : f32,\n paddedHeight : f32,\n borderSize : f32,\n _pad : f32,\n};\n\n@group(0) @binding(0) var u : Uniforms;\n\nstruct VertexInput {\n @location(0) position : vec2,\n @location(1) color : vec4,\n};\n\nstruct VertexOutput {\n @builtin(position) position : vec4,\n @location(0) color : vec3,\n};\n\n@vertex\nfn vs_main(in : VertexInput) -> VertexOutput {\n var out : VertexOutput;\n let cx = (in.position.x + u.offsetX) * u.scaleX;\n let cy = (in.position.y + u.offsetY) * u.scaleY;\n out.position = vec4(\n ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0,\n 1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0,\n 0.0,\n 1.0\n );\n out.color = in.color.rgb;\n return out;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4 {\n return vec4(in.color, 1.0);\n}\n"});this.#Ns=this.#Ls.createRenderPipeline({layout:"auto",vertex:{module:t,entryPoint:"vs_main",buffers:[{arrayStride:8,attributes:[{shaderLocation:0,offset:0,format:"float32x2"}]},{arrayStride:4,attributes:[{shaderLocation:1,offset:0,format:"unorm8x4"}]}]},fragment:{module:t,entryPoint:"fs_main",targets:[{format:this.#Us}]},primitive:{topology:"triangle-list"}})}draw(t,e,i,s,n,r,a,o){this.loadMeshShader();const l=this.#Ls,{offsetX:h,offsetY:d,scaleX:c,scaleY:u}=s,p=l.createBuffer({size:Math.max(t.byteLength,4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST});t.byteLength>0&&l.queue.writeBuffer(p,0,t);const g=l.createBuffer({size:Math.max(e.byteLength,4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST});e.byteLength>0&&l.queue.writeBuffer(g,0,e);const m=l.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});l.queue.writeBuffer(m,0,new Float32Array([h,d,c,u,r,a,o,0]));const f=l.createBindGroup({layout:this.#Ns.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:m}}]}),b=new OffscreenCanvas(r,a),y=b.getContext("webgpu");y.configure({device:l,format:this.#Us,alphaMode:n?"opaque":"premultiplied"});const A=n?{r:n[0]/255,g:n[1]/255,b:n[2]/255,a:1}:{r:0,g:0,b:0,a:0},v=l.createCommandEncoder(),w=v.beginRenderPass({colorAttachments:[{view:y.getCurrentTexture().createView(),clearValue:A,loadOp:"clear",storeOp:"store"}]});if(i>0){w.setPipeline(this.#Ns);w.setBindGroup(0,f);w.setVertexBuffer(0,p);w.setVertexBuffer(1,g);w.draw(i)}w.end();l.queue.submit([v.finish()]);p.destroy();g.destroy();m.destroy();return b.transferToImageBitmap()}};const vt="Fill",wt="Stroke",xt="Shading";function applyBoundingBox(t,e){if(!e)return;const i=e[2]-e[0],s=e[3]-e[1],n=new Path2D;n.rect(e[0],e[1],i,s);t.clip(n)}class BaseShadingPattern{isModifyingCurrentTransform(){return!1}getPattern(){unreachable("Abstract method `getPattern` called.")}}class RadialAxialShadingPattern extends BaseShadingPattern{constructor(t){super();this._type=t[1];this._bbox=t[2];this._colorStops=t[3];this._p0=t[4];this._p1=t[5];this._r0=t[6];this._r1=t[7];this.matrix=null}isOriginBased(){return 0===this._p0[0]&&0===this._p0[1]&&(!this.isRadial()||0===this._p1[0]&&0===this._p1[1])}isRadial(){return"radial"===this._type}areConic(){if(!this.isRadial())return!1;const t=Math.hypot(this._p0[0]-this._p1[0],this._p0[1]-this._p1[1]);return t+this._r1>this._r0&&t+this._r0>this._r1}_createGradient(t,e=null){let i,s=this._p0,n=this._p1;if(e){s=s.slice();n=n.slice();Util.applyTransform(s,e);Util.applyTransform(n,e)}if("axial"===this._type)i=t.createLinearGradient(s[0],s[1],n[0],n[1]);else if("radial"===this._type){let r=this._r0,a=this._r1;if(e){const t=new Float32Array(2);Util.singularValueDecompose2dScale(e,t);r*=t[0];a*=t[0]}i=t.createRadialGradient(s[0],s[1],r,n[0],n[1],a)}for(const t of this._colorStops)i.addColorStop(t[0],t[1]);return i}_createReversedGradient(t,e=null){let i=this._p1,s=this._p0;if(e){i=i.slice();s=s.slice();Util.applyTransform(i,e);Util.applyTransform(s,e)}let n=this._r1,r=this._r0;if(e){const t=new Float32Array(2);Util.singularValueDecompose2dScale(e,t);n*=t[0];r*=t[0]}const a=t.createRadialGradient(i[0],i[1],n,s[0],s[1],r),o=this._colorStops.map(([t,e])=>[1-t,e]).reverse();for(const[t,e]of o)a.addColorStop(t,e);return a}getPattern(t,e,i,s){let n;if(s===wt||s===vt){if(this.isOriginBased()){let s=Util.transform(i,e.baseTransform);this.matrix&&(s=Util.transform(s,this.matrix));const n=.001,r=Math.hypot(s[0],s[1]),a=Math.hypot(s[2],s[3]),o=(s[0]*s[2]+s[1]*s[3])/(r*a);if(Math.abs(o)l[2*s+1]){u=i;i=s;s=u;u=r;r=a;a=u}if(l[2*s+1]>l[2*n+1]){u=s;s=n;n=u;u=a;a=o;o=u}if(l[2*i+1]>l[2*s+1]){u=i;i=s;s=u;u=r;r=a;a=u}const p=(l[2*i]+e.offsetX)*e.scaleX,g=(l[2*i+1]+e.offsetY)*e.scaleY,m=(l[2*s]+e.offsetX)*e.scaleX,f=(l[2*s+1]+e.offsetY)*e.scaleY,b=(l[2*n]+e.offsetX)*e.scaleX,y=(l[2*n+1]+e.offsetY)*e.scaleY;if(g>=y)return;const A=h[4*r],v=h[4*r+1],w=h[4*r+2],x=h[4*a],C=h[4*a+1],E=h[4*a+2],T=h[4*o],S=h[4*o+1],_=h[4*o+2],P=Math.round(g),D=Math.round(y);let M,k,I,F,B,R,O,L;for(let t=P;t<=D;t++){if(ty?1:f===y?0:(f-t)/(f-y);M=m-(m-b)*e;k=x-(x-T)*e;I=C-(C-S)*e;F=E-(E-_)*e}let e;e=ty?1:(g-t)/(g-y);B=p-(p-b)*e;R=A-(A-T)*e;O=v-(v-S)*e;L=w-(w-_)*e;const i=Math.round(Math.min(M,B)),s=Math.round(Math.max(M,B));let n=c*t+4*i;for(let t=i;t<=s;t++){e=(M-t)/(M-B);e<0?e=0:e>1&&(e=1);d[n++]=k-(k-R)*e|0;d[n++]=I-(I-O)*e|0;d[n++]=F-(F-L)*e|0;d[n++]=255}}}class MeshShadingPattern extends BaseShadingPattern{constructor(t){super();this._posData=t[2];this._colData=t[3];this._vertexCount=t[4];this._bounds=t[5];this._bbox=t[6];this._background=t[7];this.matrix=null;!function loadMeshShader(){At.loadMeshShader()}()}_createMeshCanvas(t,e,i){const s=Math.floor(this._bounds[0]),n=Math.floor(this._bounds[1]),r=Math.ceil(this._bounds[2])-s,a=Math.ceil(this._bounds[3])-n,o=Math.min(Math.ceil(Math.abs(r*t[0]*1.1)),3e3)||1,l=Math.min(Math.ceil(Math.abs(a*t[1]*1.1)),3e3)||1,h=r?r/o:1,d=a?a/l:1,c={coords:this._posData,colors:this._colData,offsetX:-s,offsetY:-n,scaleX:1/h,scaleY:1/d},u=o+4,p=l+4,g=i.create(u,p);if(function isGPUReady(){return At.isReady}()&&this._vertexCount>48)g.context.drawImage(function drawMeshWithGPU(t,e,i,s,n,r,a,o){return At.draw(t,e,i,s,n,r,a,o)}(this._posData,this._colData,this._vertexCount,c,e,u,p,2),0,0);else{const t=g.context.createImageData(o,l);if(e){const i=t.data;for(let t=0,s=i.length;tl+1e-6||e>h+1e-6)return null;const d=Math.floor((i-a)/l)+1,c=Math.ceil((i+t-n)/l)-1,u=Math.floor((s-o)/h)+1,p=Math.ceil((s+e-r)/h)-1;return c<=d&&p<=u?[d,u]:null}updatePatternDims(t,e){const i=Util.inverseTransform(this.patternBaseMatrix),s=[t[0],t[1]],n=[t[2],t[3]];Util.applyTransform(s,i);Util.applyTransform(n,i);e[0]=Math.abs(n[0]-s[0]);e[1]=Math.abs(n[1]-s[1]);e[2]=Math.min(s[0],n[0]);e[3]=Math.min(s[1],n[1])}_renderTileCanvas(t,e,i,s){const[n,r,a,o]=this.bbox,l=t.canvasFactory.create(i.size,s.size),h=l.context,d=this.canvasGraphicsFactory.createCanvasGraphics(h,e);d.groupLevel=t.groupLevel;this.setFillAndStrokeStyleToContext(d,this.paintType,this.color);h.translate(-i.scale*n,-s.scale*r);d.transform(0,i.scale,0,0,s.scale,0,0);h.save();d.dependencyTracker?.save();this.clipBbox(d,n,r,a,o);d.baseTransform=getCurrentTransform(d.ctx);d.executeOperatorList(this.operatorList);d.endDrawing();d.dependencyTracker?.restore();h.restore();return l}_getCombinedScales(){const t=new Float32Array(2);Util.singularValueDecompose2dScale(this.matrix,t);const[e,i]=t;Util.singularValueDecompose2dScale(this.baseTransform,t);return[e*t[0],i*t[1]]}drawPattern(t,e,i=!1,[s,n],r){const[a,o,l,h]=this.bbox,d=t.dependencyTracker;d&&(t.dependencyTracker=new CanvasNestedDependencyTracker(d,r));t.save();i?t.ctx.clip(e,"evenodd"):t.ctx.clip(e);t.ctx.setTransform(...this.patternBaseMatrix);t.ctx.translate(s*this.xstep,n*this.ystep);if(this.needsIsolation||1!==t.ctx.globalAlpha||"source-over"!==t.ctx.globalCompositeOperation||t.inSMaskMode){const e=l-a,i=h-o,[s,n]=this._getCombinedScales(),d=this.getSizeAndScale(e,this.ctx.canvas.width,s),c=this.getSizeAndScale(i,this.ctx.canvas.height,n),u=this._renderTileCanvas(t,r,d,c);t.ctx.drawImage(u.canvas,a,o,e,i);t.canvasFactory.destroy(u)}else{this.setFillAndStrokeStyleToContext(t,this.paintType,this.color);this.clipBbox(t,a,o,l,h);t.baseTransformStack.push(t.baseTransform);t.baseTransform=getCurrentTransform(t.ctx);t.executeOperatorList(this.operatorList);t.baseTransform=t.baseTransformStack.pop()}t.restore();d&&(t.dependencyTracker=d)}createPatternCanvas(t,e){const[i,s,n,r]=this.bbox,a=n-i,o=r-s;let{xstep:l,ystep:h}=this;l=Math.abs(l);h=Math.abs(h);info("TilingType: "+this.tilingType);const[d,c]=this._getCombinedScales();let u=a,p=o,g=!1,m=!1;Math.ceil(l*d)>=Math.ceil(a*d)?u=l:g=!0;Math.ceil(h*c)>=Math.ceil(o*c)?p=h:m=!0;const f=this.getSizeAndScale(u,this.ctx.canvas.width,d),b=this.getSizeAndScale(p,this.ctx.canvas.height,c),y=this._renderTileCanvas(t,e,f,b);if(g||m){const e=y.canvas;g&&(u=l);m&&(p=h);const n=this.getSizeAndScale(u,this.ctx.canvas.width,d),r=this.getSizeAndScale(p,this.ctx.canvas.height,c),f=n.size,b=r.size,A=t.canvasFactory.create(f,b),v=A.context,w=g?Math.floor(a/l):0,x=m?Math.floor(o/h):0;for(let t=0;t<=w;t++)for(let i=0;i<=x;i++)v.drawImage(e,f*t,b*i,f,b,0,0,f,b);t.canvasFactory.destroy(y);return{canvas:A.canvas,canvasEntry:A,scaleX:n.scale,scaleY:r.scale,offsetX:i,offsetY:s}}return{canvas:y.canvas,canvasEntry:y,scaleX:f.scale,scaleY:b.scale,offsetX:i,offsetY:s}}getSizeAndScale(t,e,i){const s=Math.max(TilingPattern.MAX_PATTERN_SIZE,e);let n=Math.ceil(t*i);n>=s?n=s:i=n/t;return{scale:i,size:n}}clipBbox(t,e,i,s,n){const r=s-e,a=n-i,o=new Path2D;o.rect(e,i,r,a);Util.axialAlignedBoundingBox([e,i,s,n],getCurrentTransform(t.ctx),t.current.minMax);t.ctx.clip(o);t.current.updateClipFromPath()}setFillAndStrokeStyleToContext(t,e,i){const s=t.ctx,n=t.current;n.patternFill=n.patternStroke=!1;switch(e){case Ct:const{fillStyle:t,strokeStyle:r}=this.ctx;s.fillStyle=n.fillColor=t;s.strokeStyle=n.strokeColor=r;break;case Et:s.fillStyle=s.strokeStyle=i;n.fillColor=n.strokeColor=i;break;default:throw new FormatError(`Unsupported paint type: ${e}`)}}isModifyingCurrentTransform(){return!1}getPattern(t,e,i,s,n){const r=s!==xt?Util.transform(i,this.patternBaseMatrix):i,a=this.createPatternCanvas(e,n);let o=new DOMMatrix(r);o=o.translate(a.offsetX,a.offsetY);o=o.scale(1/a.scaleX,1/a.scaleY);const l=t.createPattern(a.canvas,"repeat");e.canvasFactory.destroy(a.canvasEntry);l.setTransform(o);return l}}function convertBlackAndWhiteToRGBA({src:t,srcPos:e=0,dest:i,width:s,height:n,nonBlackColor:r=4294967295,inverseDecode:a=!1}){const o=FeatureTest.isLittleEndian?4278190080:255,[l,h]=a?[r,o]:[o,r],d=s>>3,c=7&s,u=l^h,p=t.length;i=new Uint32Array(i.buffer);let g=0;for(let s=0;s>7&1)&u;i[g+1]=l^-(s>>6&1)&u;i[g+2]=l^-(s>>5&1)&u;i[g+3]=l^-(s>>4&1)&u;i[g+4]=l^-(s>>3&1)&u;i[g+5]=l^-(s>>2&1)&u;i[g+6]=l^-(s>>1&1)&u;i[g+7]=l^-(1&s)&u}if(0===c)continue;const s=e>7-t&1)&u}return{srcPos:e,destPos:g}}const Tt=16,St=new DOMMatrix,_t=new Float32Array(2);function drawImageAtIntegerCoords(t,e,i,s,n,r,a,o,l,h){const[d,c,u,p,g,m]=getCurrentTransform(t);if(0===c&&0===u){const f=a*d+g,b=Math.round(f),y=o*p+m,A=Math.round(y),v=(a+l)*d+g,w=Math.abs(Math.round(v)-b)||1,x=(o+h)*p+m,C=Math.abs(Math.round(x)-A)||1;t.setTransform(Math.sign(d),0,0,Math.sign(p),b,A);t.drawImage(e,i,s,n,r,0,0,w,C);t.setTransform(d,c,u,p,g,m);return[w,C]}if(0===d&&0===p){const f=o*u+g,b=Math.round(f),y=a*c+m,A=Math.round(y),v=(o+h)*u+g,w=Math.abs(Math.round(v)-b)||1,x=(a+l)*c+m,C=Math.abs(Math.round(x)-A)||1;t.setTransform(0,Math.sign(c),Math.sign(u),0,b,A);t.drawImage(e,i,s,n,r,0,0,C,w);t.setTransform(d,c,u,p,g,m);return[C,w]}t.drawImage(e,i,s,n,r,a,o,l,h);return[Math.hypot(d,c)*l,Math.hypot(u,p)*h]}class CanvasExtraState{alphaIsShape=!1;fontSize=0;fontSizeScale=1;textMatrix=null;textMatrixScale=1;fontMatrix=s;leading=0;x=0;y=0;lineX=0;lineY=0;charSpacing=0;wordSpacing=0;textHScale=1;textRenderingMode=y;textRise=0;fillColor="#000000";strokeColor="#000000";tilingPatternDims=null;patternFill=!1;patternStroke=!1;fillAlpha=1;strokeAlpha=1;lineWidth=1;activeSMask=null;transferMaps="none";minMax=i.slice();constructor(t,e){this.clipBox=new Float32Array([0,0,t,e])}clone(){const t=Object.create(this);t.clipBox=this.clipBox.slice();t.minMax=this.minMax.slice();t.tilingPatternDims=this.tilingPatternDims?.slice();return t}getPathBoundingBox(t=vt,e=null){const i=this.minMax.slice();if(t===wt){e||unreachable("Stroke bounding box must include transform.");Util.singularValueDecompose2dScale(e,_t);const t=_t[0]*this.lineWidth/2,s=_t[1]*this.lineWidth/2;i[0]-=t;i[1]-=s;i[2]+=t;i[3]+=s}return i}updateClipFromPath(){const t=Util.intersect(this.clipBox,this.getPathBoundingBox());this.startNewPathAndClipBox(t||[0,0,0,0])}isEmptyClip(){return this.minMax[0]===1/0}startNewPathAndClipBox(t){this.clipBox.set(t,0);this.minMax.set(i,0)}getClippedPathBoundingBox(t=vt,e=null){return Util.intersect(this.clipBox,this.getPathBoundingBox(t,e))}}function putBinaryImageData(t,e){if(e instanceof ImageData){t.putImageData(e,0,0);return}const i=e.height,s=e.width,n=i%Tt,r=(i-n)/Tt,a=0===n?r:r+1,o=t.createImageData(s,Tt);let l,h=0;const d=e.data,c=o.data;let u,p,g,m;if(e.kind===E.GRAYSCALE_1BPP){const e=d.byteLength,i=new Uint32Array(c.buffer,0,c.byteLength>>2),m=i.length,f=s+7>>3,b=4294967295,y=FeatureTest.isLittleEndian?4278190080:255;for(u=0;uf?s:8*t-7,a=-8&r;let o=0,c=0;for(;n>=1}}for(;l=r){g=n;m=s*g}l=0;for(p=m;p--;){c[l++]=d[h++];c[l++]=d[h++];c[l++]=d[h++];c[l++]=255}t.putImageData(o,0,u*Tt)}}}function putBinaryImageMask(t,e){if(e.bitmap){t.drawImage(e.bitmap,0,0);return}const i=e.height,s=e.width,n=i%Tt,r=(i-n)/Tt,a=0===n?r:r+1,o=t.createImageData(s,Tt);let l=0;const h=e.data,d=o.data;for(let e=0;e10&&"function"==typeof i,d=h?Date.now()+15:0;let c=0;const u=this.commonObjs,p=this.objs;let g,m;for(;;){if(void 0!==s){if(o===s.nextBreakPoint){s.breakIt(o,i);return o}if(s.shouldSkip(o)){if(++o===l)return o;continue}}if(!n||n(o)){g=a[o];m=r[o]??null;if(g!==I.dependency)null===m?this[g](o):this[g](o,...m);else for(const t of m){this.dependencyTracker?.recordNamedData(t,o);const e=t.startsWith("g_")?u:p;if(!e.has(t)){e.get(t,i);return o}}}o++;if(o===l)return o;if(h&&++c>10){if(Date.now()>d){i();return o}c=0}}}#zs(){for(;this.stateStack.length||this.inSMaskMode;)this.restore();this.current.activeSMask=null;this.ctx.restore();if(this.transparentCanvas){this.ctx=this.compositeCtx;this.ctx.save();this.ctx.setTransform(1,0,0,1,0,0);this.ctx.drawImage(this.transparentCanvas,0,0);this.ctx.restore();this.canvasFactory.destroy(this.transparentCanvasEntry);this.transparentCanvas=null;this.transparentCanvasEntry=null}}endDrawing(){this.#zs();for(const t of this.smaskGroupCanvases)this.canvasFactory.destroy(t);this.smaskGroupCanvases.length=0;this._clearPreparedSMask();this.tempSMask=null;this.smaskStack.length=0;this.cachedPatterns.clear();for(const t of this._cachedBitmapsMap.values()){for(const e of t.values())"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement&&(e.width=e.height=0);t.clear()}this._cachedBitmapsMap.clear();this.#Gs()}#Gs(){if(this.pageColors){const t=this.filterFactory.addHCMFilter(this.pageColors.foreground,this.pageColors.background);if("none"!==t){const e=this.ctx.filter;this.ctx.filter=t;this.ctx.drawImage(this.ctx.canvas,0,0);this.ctx.filter=e}}}_scaleImage(t,e){const i=t.width??t.displayWidth,s=t.height??t.displayHeight,n=[];let r=Math.max(Math.hypot(e[0],e[1]),1),a=Math.max(Math.hypot(e[2],e[3]),1),o=i,l=s;for(;r>2&&o>1||a>2&&l>1;){let t=o,e=l;if(r>2&&o>1){t=Math.ceil(o/2);r/=o/t}if(a>2&&l>1){e=Math.ceil(l/2);a/=l/e}n.push({newWidth:t,newHeight:e});o=t;l=e}if(0===n.length)return{img:t,paintWidth:i,paintHeight:s,tmpCanvas:null};if(1===n.length){const{newWidth:e,newHeight:r}=n[0],a=this.canvasFactory.create(e,r);a.context.drawImage(t,0,0,i,s,0,0,e,r);return{img:a.canvas,paintWidth:e,paintHeight:r,tmpCanvas:a}}let h=this.canvasFactory.create(1,1),d=this.canvasFactory.create(1,1),c=i,u=s,p=t;for(const{newWidth:t,newHeight:e}of n){this.canvasFactory.reset(d,t,e);d.context.drawImage(p,0,0,c,u,0,0,t,e);[h,d]=[d,h];p=h.canvas;c=t;u=e}this.canvasFactory.destroy(d);return{img:h.canvas,paintWidth:c,paintHeight:u,tmpCanvas:h}}_createMaskCanvas(t,e){const s=this.ctx,{width:n,height:r}=e,a=this.current.fillColor,o=this.current.patternFill,l=getCurrentTransform(s);let h,d,c,u;if((e.bitmap||e.data)&&e.count>1){const i=e.bitmap||e.data.buffer;d=JSON.stringify(o?l:[l.slice(0,4),a]);h=this._cachedBitmapsMap.getOrInsertComputed(i,makeMap);const s=h.get(d);if(s&&!o){const e=Math.round(Math.min(l[0],l[2])+l[4]),i=Math.round(Math.min(l[1],l[3])+l[5]);this.dependencyTracker?.recordDependencies(t,ot);return{canvas:s,offsetX:e,offsetY:i}}c=s}if(!c){u=this.canvasFactory.create(n,r);putBinaryImageMask(u.context,e)}let p=Util.transform(l,[1/n,0,0,-1/r,0,0]);p=Util.transform(p,[1,0,0,1,0,-r]);const g=i.slice();Util.axialAlignedBoundingBox([0,0,n,r],p,g);const[m,f,b,y]=g,A=Math.round(b-m)||1,v=Math.round(y-f)||1,w=this.canvasFactory.create(A,v),x=w.context,C=m,E=f;x.translate(-C,-E);x.transform(...p);let T=null;if(!c){const t=this._scaleImage(u.canvas,getCurrentTransformInverse(x));c=t.img;T=t.tmpCanvas;if(c!==u.canvas){this.canvasFactory.destroy(u);u=null}if(h&&o){h.set(d,c);T=null;u=null}}x.imageSmoothingEnabled=getImageSmoothingEnabled(getCurrentTransform(x),e.interpolate);drawImageAtIntegerCoords(x,c,0,0,c.width,c.height,0,0,n,r);T&&this.canvasFactory.destroy(T);u&&this.canvasFactory.destroy(u);x.globalCompositeOperation="source-in";const S=Util.transform(getCurrentTransformInverse(x),[1,0,0,1,-C,-E]);x.fillStyle=o?a.getPattern(s,this,S,vt,t):a;x.fillRect(0,0,n,r);h&&!o&&h.set(d,w.canvas);this.dependencyTracker?.recordDependencies(t,ot);return{canvas:w.canvas,canvasEntry:h&&!o?null:w,offsetX:Math.round(C),offsetY:Math.round(E)}}setLineWidth(t,e){this.dependencyTracker?.recordSimpleData("lineWidth",t);e!==this.current.lineWidth&&(this._cachedScaleForStroking[0]=-1);this.current.lineWidth=e;this.ctx.lineWidth=e}setLineCap(t,e){this.dependencyTracker?.recordSimpleData("lineCap",t);this.ctx.lineCap=Pt[e]}setLineJoin(t,e){this.dependencyTracker?.recordSimpleData("lineJoin",t);this.ctx.lineJoin=Dt[e]}setMiterLimit(t,e){this.dependencyTracker?.recordSimpleData("miterLimit",t);this.ctx.miterLimit=e}setDash(t,e,i){this.dependencyTracker?.recordSimpleData("dash",t);const s=this.ctx;if(void 0!==s.setLineDash){s.setLineDash(e);s.lineDashOffset=i}}setRenderingIntent(t,e){}setFlatness(t,e){}setGState(t,e){for(const[i,s]of e)switch(i){case"LW":this.setLineWidth(t,s);break;case"LC":this.setLineCap(t,s);break;case"LJ":this.setLineJoin(t,s);break;case"ML":this.setMiterLimit(t,s);break;case"D":this.setDash(t,s[0],s[1]);break;case"RI":this.setRenderingIntent(t,s);break;case"FL":this.setFlatness(t,s);break;case"Font":this.setFont(t,s[0],s[1]);break;case"CA":this.dependencyTracker?.recordSimpleData("strokeAlpha",t);this.current.strokeAlpha=s;break;case"ca":this.dependencyTracker?.recordSimpleData("fillAlpha",t);this.ctx.globalAlpha=this.current.fillAlpha=s;break;case"BM":this.dependencyTracker?.recordSimpleData("globalCompositeOperation",t);this.ctx.globalCompositeOperation=s;break;case"SMask":this.dependencyTracker?.recordSimpleData("SMask",t);this.current.activeSMask=s?this.tempSMask:null;this.current.activeSMask&&(this.current.activeSMask.blendMode=this.ctx.globalCompositeOperation);this.tempSMask=null;this.checkSMaskState(t);break;case"TR":this.dependencyTracker?.recordSimpleData("filter",t);this.ctx.filter=this.current.transferMaps=this.filterFactory.addFilter(s)}}get inSMaskMode(){return!!this.suspendedCtx}_clearPreparedSMask(){if(this.smaskPreparedEntry){this.canvasFactory.destroy(this.smaskPreparedEntry);this.smaskPreparedEntry=null}this.smaskPreparedFor=null;this.smaskPreparedOffsetX=0;this.smaskPreparedOffsetY=0}_ensurePreparedSMask(t,e,i){if(t!==this.smaskPreparedFor){this._clearPreparedSMask();this._prepareSMaskCanvas(t,e,i)}}checkSMaskState(t){const e=this.inSMaskMode;this.current.activeSMask&&!e?this.beginSMaskMode(t):!this.current.activeSMask&&e?this.endSMaskMode():this.current.activeSMask&&e&&this._ensurePreparedSMask(this.current.activeSMask,this.ctx.canvas.width,this.ctx.canvas.height)}_prepareSMaskCanvas(t,e,i){const{canvas:s,subtype:n,backdrop:r,transferMap:a}=t,o="Luminosity"===n||"Alpha"===n&&a;if(!r&&!o){this.smaskPreparedFor=t;return}let l,h,d;if(r&&o){const o=this.canvasFactory.create(e,i),c=o.context;c.drawImage(s,t.offsetX,t.offsetY);c.globalCompositeOperation="destination-atop";c.fillStyle=r;c.fillRect(0,0,e,i);c.globalCompositeOperation="source-over";l=this.canvasFactory.create(e,i);const u=l.context;u.filter="Alpha"===n?this.filterFactory.addAlphaFilter(a):this.filterFactory.addLuminosityFilter(a);u.drawImage(o.canvas,0,0);u.filter="none";this.canvasFactory.destroy(o);h=d=0}else if(o){l=this.canvasFactory.create(s.width,s.height);const e=l.context;e.filter="Alpha"===n?this.filterFactory.addAlphaFilter(a):this.filterFactory.addLuminosityFilter(a);e.drawImage(s,0,0);e.filter="none";({offsetX:h,offsetY:d}=t)}else{l=this.canvasFactory.create(e,i);const n=l.context;n.drawImage(s,t.offsetX,t.offsetY);n.globalCompositeOperation="destination-atop";n.fillStyle=r;n.fillRect(0,0,e,i);n.globalCompositeOperation="source-over";h=d=0}this.smaskPreparedEntry=l;this.smaskPreparedFor=t;this.smaskPreparedOffsetX=h;this.smaskPreparedOffsetY=d}beginSMaskMode(t){if(this.inSMaskMode)throw new Error("beginSMaskMode called while already in smask mode");const{width:e,height:i}=this.ctx.canvas,s=this.canvasFactory.create(e,i);this.smaskScratchCanvas=s;this.suspendedCtx=this.ctx;const n=this.ctx=s.context;n.setTransform(this.suspendedCtx.getTransform());copyCtxState(this.suspendedCtx,n);!function mirrorContextOperations(t,e){if(t._removeMirroring)throw new Error("Context is already forwarding operations.");t.__originalSave=t.save;t.__originalRestore=t.restore;t.__originalRotate=t.rotate;t.__originalScale=t.scale;t.__originalTranslate=t.translate;t.__originalTransform=t.transform;t.__originalSetTransform=t.setTransform;t.__originalResetTransform=t.resetTransform;t.__originalClip=t.clip;t.__originalMoveTo=t.moveTo;t.__originalLineTo=t.lineTo;t.__originalBezierCurveTo=t.bezierCurveTo;t.__originalRect=t.rect;t.__originalClosePath=t.closePath;t.__originalBeginPath=t.beginPath;t._removeMirroring=()=>{t.save=t.__originalSave;t.restore=t.__originalRestore;t.rotate=t.__originalRotate;t.scale=t.__originalScale;t.translate=t.__originalTranslate;t.transform=t.__originalTransform;t.setTransform=t.__originalSetTransform;t.resetTransform=t.__originalResetTransform;t.clip=t.__originalClip;t.moveTo=t.__originalMoveTo;t.lineTo=t.__originalLineTo;t.bezierCurveTo=t.__originalBezierCurveTo;t.rect=t.__originalRect;t.closePath=t.__originalClosePath;t.beginPath=t.__originalBeginPath;delete t._removeMirroring};t.save=function(){e.save();this.__originalSave()};t.restore=function(){e.restore();this.__originalRestore()};t.translate=function(t,i){e.translate(t,i);this.__originalTranslate(t,i)};t.scale=function(t,i){e.scale(t,i);this.__originalScale(t,i)};t.transform=function(t,i,s,n,r,a){e.transform(t,i,s,n,r,a);this.__originalTransform(t,i,s,n,r,a)};t.setTransform=function(t,i,s,n,r,a){if(void 0===i){e.setTransform(t);this.__originalSetTransform(t)}else{e.setTransform(t,i,s,n,r,a);this.__originalSetTransform(t,i,s,n,r,a)}};t.resetTransform=function(){e.resetTransform();this.__originalResetTransform()};t.rotate=function(t){e.rotate(t);this.__originalRotate(t)};t.clip=function(t){e.clip(t);this.__originalClip(t)};t.moveTo=function(t,i){e.moveTo(t,i);this.__originalMoveTo(t,i)};t.lineTo=function(t,i){e.lineTo(t,i);this.__originalLineTo(t,i)};t.bezierCurveTo=function(t,i,s,n,r,a){e.bezierCurveTo(t,i,s,n,r,a);this.__originalBezierCurveTo(t,i,s,n,r,a)};t.rect=function(t,i,s,n){e.rect(t,i,s,n);this.__originalRect(t,i,s,n)};t.closePath=function(){e.closePath();this.__originalClosePath()};t.beginPath=function(){e.beginPath();this.__originalBeginPath()}}(n,this.suspendedCtx);this._ensurePreparedSMask(this.current.activeSMask,e,i);this.setGState(t,[["BM","source-over"]])}endSMaskMode(){if(!this.inSMaskMode)throw new Error("endSMaskMode called while not in smask mode");this.ctx._removeMirroring();copyCtxState(this.ctx,this.suspendedCtx);this.ctx=this.suspendedCtx;this.suspendedCtx=null;this.canvasFactory.destroy(this.smaskScratchCanvas);this.smaskScratchCanvas=null;this._clearPreparedSMask()}compose(t){if(!this.current.activeSMask)return;if(t){t[0]=Math.floor(t[0]);t[1]=Math.floor(t[1]);t[2]=Math.ceil(t[2]);t[3]=Math.ceil(t[3])}else t=[0,0,this.ctx.canvas.width,this.ctx.canvas.height];const e=this.current.activeSMask,i=this.suspendedCtx;this.composeSMask(i,e,this.ctx,t);this.ctx.save();this.ctx.setTransform(1,0,0,1,0,0);this.ctx.clearRect(t[0],t[1],t[2]-t[0],t[3]-t[1]);this.ctx.restore()}composeSMask(t,e,i,s){const n=s[0],r=s[1],a=s[2]-n,o=s[3]-r;if(0===a||0===o)return;const l=this.smaskPreparedEntry;if(l){const t=n-this.smaskPreparedOffsetX,e=r-this.smaskPreparedOffsetY;i.save();i.globalAlpha=1;i.setTransform(1,0,0,1,0,0);const s=new Path2D;s.rect(n,r,a,o);i.clip(s);i.globalCompositeOperation="destination-in";i.drawImage(l.canvas,t,e,a,o,n,r,a,o);i.restore()}else this.genericComposeSMask(e.context,i,a,o,n,r,e.offsetX,e.offsetY);t.save();t.globalAlpha=1;t.globalCompositeOperation=e.blendMode||"source-over";t.setTransform(1,0,0,1,0,0);t.drawImage(i.canvas,n,r,a,o,n,r,a,o);t.restore()}genericComposeSMask(t,e,i,s,n,r,a,o){const l=t.canvas,h=n-a,d=r-o;e.save();e.globalAlpha=1;e.setTransform(1,0,0,1,0,0);const c=new Path2D;c.rect(n,r,i,s);e.clip(c);e.globalCompositeOperation="destination-in";e.drawImage(l,h,d,i,s,n,r,i,s);e.restore()}save(t){this.inSMaskMode&©CtxState(this.ctx,this.suspendedCtx);this.ctx.save();const e=this.current;this.stateStack.push(e);this.current=e.clone();this.dependencyTracker?.save(t)}restore(t){this.dependencyTracker?.restore(t);if(0!==this.stateStack.length){this.current=this.stateStack.pop();this.ctx.restore();if(this.inSMaskMode){copyCtxState(this.suspendedCtx,this.ctx);this.ctx.setTransform(this.suspendedCtx.getTransform())}this.checkSMaskState(t);this.pendingClip=null;this._cachedScaleForStroking[0]=-1;this._cachedGetSinglePixelWidth=null}else this.inSMaskMode&&this.endSMaskMode()}transform(t,e,i,s,n,r,a){this.dependencyTracker?.recordIncrementalData("transform",t);this.ctx.transform(e,i,s,n,r,a);this._cachedScaleForStroking[0]=-1;this._cachedGetSinglePixelWidth=null}constructPath(t,e,i,s){let[n]=i;if(!s){n||=i[0]=new Path2D;e!==I.stroke&&e!==I.closeStroke&&(this.current.tilingPatternDims=null);this[e](t,n);return}if(null!==this.dependencyTracker){const i=e===I.stroke?this.current.lineWidth/2:0;this.dependencyTracker.resetBBox(t).recordBBox(t,this.ctx,s[0]-i,s[2]+i,s[1]-i,s[3]+i).recordDependencies(t,["transform"])}n instanceof Path2D||(n=i[0]=makePathFromDrawOPS(n));Util.axialAlignedBoundingBox(s,getCurrentTransform(this.ctx),this.current.minMax);const r=this.current.tilingPatternDims;if(r&&e!==I.stroke&&e!==I.closeStroke&&this.current.fillColor instanceof TilingPattern){const t=Util.intersect(this.current.clipBox,this.current.minMax);t?this.current.fillColor.updatePatternDims(t,r):this.current.tilingPatternDims=null}this[e](t,n);this._pathStartIdx=t}closePath(t){this.ctx.closePath()}stroke(t,e,i=!0){const s=this.ctx,n=this.current.strokeColor;s.globalAlpha=this.current.strokeAlpha;if(this.contentVisible)if("object"==typeof n&&n?.getPattern){const i=n.isModifyingCurrentTransform()?s.getTransform():null;s.save();s.strokeStyle=n.getPattern(s,this,getCurrentTransformInverse(s),wt,t);if(i){const t=new Path2D;t.addPath(e,s.getTransform().invertSelf().multiplySelf(i));e=t}this.rescaleAndStroke(e,!1);s.restore()}else this.rescaleAndStroke(e,!0);this.dependencyTracker?.recordDependencies(t,et);i&&this.consumePath(t,e,this.current.getClippedPathBoundingBox(wt,getCurrentTransform(this.ctx)));s.globalAlpha=this.current.fillAlpha}closeStroke(t,e){this.stroke(t,e)}fill(t,e,i=!0){const s=this.ctx,n=this.current.fillColor,r=this.current.patternFill;let a=!1;const o=this.current.getClippedPathBoundingBox();this.dependencyTracker?.recordDependencies(t,it);if(r){const r=this.current.tilingPatternDims,l=r&&n.canSkipPatternCanvas(r);if(l){n.drawPattern(this,e,this.pendingEOFill,l,t);this.pendingEOFill=!1;i&&this.consumePath(t,e,o);this.current.tilingPatternDims=null;return}const h=n.isModifyingCurrentTransform()?s.getTransform():null;this.dependencyTracker?.save(t);s.save();s.fillStyle=n.getPattern(s,this,getCurrentTransformInverse(s),vt,t);if(h){const t=new Path2D;t.addPath(e,s.getTransform().invertSelf().multiplySelf(h));e=t}a=!0}if(this.contentVisible&&null!==o)if(this.pendingEOFill){s.fill(e,"evenodd");this.pendingEOFill=!1}else s.fill(e);if(a){s.restore();this.dependencyTracker?.restore(t)}i&&this.consumePath(t,e,o)}eoFill(t,e){this.pendingEOFill=!0;this.fill(t,e)}fillStroke(t,e){this.fill(t,e,!1);this.stroke(t,e,!1);this.consumePath(t,e)}eoFillStroke(t,e){this.pendingEOFill=!0;this.fillStroke(t,e)}closeFillStroke(t,e){this.fillStroke(t,e)}closeEOFillStroke(t,e){this.pendingEOFill=!0;this.fillStroke(t,e)}endPath(t,e){this.consumePath(t,e)}rawFillPath(t,e){this.ctx.fill(e);this.dependencyTracker?.recordDependencies(t,nt).recordOperation(t)}clip(t){this.dependencyTracker?.recordFutureForcedDependency("clipMode",t);this.pendingClip=Mt}eoClip(t){this.dependencyTracker?.recordFutureForcedDependency("clipMode",t);this.pendingClip=kt}beginText(t){this.current.textMatrix=null;this.current.textMatrixScale=1;this.current.x=this.current.lineX=0;this.current.y=this.current.lineY=0;this.dependencyTracker?.recordOpenMarker(t).resetIncrementalData("sameLineText").resetIncrementalData("moveText",t)}endText(t){const e=this.pendingTextPaths,i=this.ctx;if(this.dependencyTracker){const{dependencyTracker:i}=this;void 0!==e&&i.recordFutureForcedDependency("textClip",i.getOpenMarker()).recordFutureForcedDependency("textClip",t);i.recordCloseMarker(t)}if(void 0!==e){const t=new Path2D,s=i.getTransform().invertSelf();for(const{transform:i,x:n,y:r,fontSize:a,path:o}of e)o&&t.addPath(o,new DOMMatrix(i).preMultiplySelf(s).translate(n,r).scale(a,-a));i.clip(t)}delete this.pendingTextPaths}setCharSpacing(t,e){this.dependencyTracker?.recordSimpleData("charSpacing",t);this.current.charSpacing=e}setWordSpacing(t,e){this.dependencyTracker?.recordSimpleData("wordSpacing",t);this.current.wordSpacing=e}setHScale(t,e){this.dependencyTracker?.recordSimpleData("hScale",t);this.current.textHScale=e/100}setLeading(t,e){this.dependencyTracker?.recordSimpleData("leading",t);this.current.leading=-e}setFont(t,e,i){this.dependencyTracker?.recordSimpleData("font",t).recordSimpleDataFromNamed("fontObj",e,t);const n=this.commonObjs.get(e),r=this.current;if(!n)throw new Error(`Can't find font for ${e}`);r.fontMatrix=n.fontMatrix||s;0!==r.fontMatrix[0]&&0!==r.fontMatrix[3]||warn("Invalid font matrix for font "+e);if(i<0){i=-i;r.fontDirection=-1}else r.fontDirection=1;this.current.font=n;this.current.fontSize=i;if(n.isType3Font)return;const a=n.loadedName||"sans-serif",o=n.systemFontInfo?.css||`"${a}", ${n.fallbackName}`;let l="normal";n.black?l="900":n.bold&&(l="bold");const h=n.italic?"italic":"normal";let d=i;i<16?d=16:i>100&&(d=100);this.current.fontSizeScale=i/d;this.ctx.font=`${h} ${l} ${d}px ${o}`}setTextRenderingMode(t,e){this.dependencyTracker?.recordSimpleData("textRenderingMode",t);this.current.textRenderingMode=e}setTextRise(t,e){this.dependencyTracker?.recordSimpleData("textRise",t);this.current.textRise=e}moveText(t,e,i){this.dependencyTracker?.resetIncrementalData("sameLineText").recordIncrementalData("moveText",t);this.current.x=this.current.lineX+=e;this.current.y=this.current.lineY+=i}setLeadingMoveText(t,e,i){this.setLeading(t,-i);this.moveText(t,e,i)}setTextMatrix(t,e){this.dependencyTracker?.resetIncrementalData("sameLineText").recordSimpleData("textMatrix",t);const{current:i}=this;i.textMatrix=e;i.textMatrixScale=Math.hypot(e[0],e[1]);i.x=i.lineX=0;i.y=i.lineY=0}nextLine(t){this.moveText(t,0,this.current.leading);this.dependencyTracker?.recordIncrementalData("moveText",this.dependencyTracker.getSimpleIndex("leading")??t)}#Ws(t,e,i){const s=new Path2D;s.addPath(t,new DOMMatrix(i).invertSelf().multiplySelf(e));return s}paintChar(t,e,i,s,n,r){const a=this.ctx,o=this.current,l=o.font,h=o.textRenderingMode,d=o.fontSize/o.fontSizeScale,c=h&x,u=!!(h&C),p=o.patternFill&&!l.missingFile,g=o.patternStroke&&!l.missingFile;let m;(l.disableFontFace||u||p||g)&&!l.missingFile&&(m=l.getPathGenerator(this.commonObjs,e));if(m&&(l.disableFontFace||p||g)){a.save();a.translate(i,s);a.scale(d,-d);this.dependencyTracker?.recordCharacterBBox(t,a,l);let e;if(c===y||c===v)if(n){e=a.getTransform();a.setTransform(...n);const t=this.#Ws(m,e,n);a.fill(t)}else a.fill(m);if(c===A||c===v)if(r){e||=a.getTransform();a.setTransform(...r);const{a:t,b:i,c:s,d:n}=e,o=Util.inverseTransform(r),l=Util.transform([t,i,s,n,0,0],o);Util.singularValueDecompose2dScale(l,_t);a.lineWidth*=Math.max(_t[0],_t[1])/d;a.stroke(this.#Ws(m,e,r))}else{a.lineWidth/=d;a.stroke(m)}a.restore()}else{if(c===y||c===v){a.fillText(e,i,s);this.dependencyTracker?.recordCharacterBBox(t,a,l,d,i,s,()=>a.measureText(e))}if(c===A||c===v){this.dependencyTracker&&this.dependencyTracker?.recordCharacterBBox(t,a,l,d,i,s,()=>a.measureText(e)).recordDependencies(t,et);a.strokeText(e,i,s)}}if(u){(this.pendingTextPaths||=[]).push({transform:getCurrentTransform(a),x:i,y:s,fontSize:d,path:m});this.dependencyTracker?.recordCharacterBBox(t,a,l,d,i,s)}}get isFontSubpixelAAEnabled(){const t=this.canvasFactory.create(10,10),e=t.context;e.scale(1.5,1);e.fillText("I",0,10);const i=e.getImageData(0,0,10,10).data;this.canvasFactory.destroy(t);let s=!1;for(let t=3;t0&&i[t]<255){s=!0;break}return shadow(this,"isFontSubpixelAAEnabled",s)}showText(t,e){if(this.dependencyTracker){this.dependencyTracker.recordDependencies(t,rt).resetBBox(t);this.current.textRenderingMode&C&&this.dependencyTracker.recordFutureForcedDependency("textClip",t).inheritPendingDependenciesAsFutureForcedDependencies()}const i=this.current,s=i.font;if(s.isType3Font){this.showType3Text(t,e);this.dependencyTracker?.recordShowTextOperation(t);return}const n=i.fontSize;if(0===n){this.dependencyTracker?.recordOperation(t);return}const r=this.ctx,a=i.fontSizeScale,o=i.charSpacing,l=i.wordSpacing,h=i.fontDirection,d=i.textHScale*h,c=e.length,u=s.vertical,p=u?1:-1,g=s.defaultVMetrics,m=n*i.fontMatrix[0],f=i.textRenderingMode===y&&!s.disableFontFace&&!i.patternFill;r.save();i.textMatrix&&r.transform(...i.textMatrix);r.translate(i.x,i.y+i.textRise);h>0?r.scale(d,-1):r.scale(d,1);let b,w;const E=i.textRenderingMode&x,T=E===y||E===v,S=E===A||E===v;let _=i.lineWidth;const P=i.textMatrixScale;0===P||0===_?S&&(_=this.getSinglePixelWidth()):_/=P;if(1!==a){r.scale(a,a);_/=a}r.lineWidth=_;if(T&&i.patternFill){r.save();const e=i.fillColor.getPattern(r,this,getCurrentTransformInverse(r),vt,t);b=getCurrentTransform(r);r.restore();r.fillStyle=e}if(S&&i.patternStroke){r.save();const e=i.strokeColor.getPattern(r,this,getCurrentTransformInverse(r),wt,t);w=getCurrentTransform(r);r.restore();r.strokeStyle=e}if(s.isInvalidPDFjsFont){const s=[];let n=0;for(const t of e){s.push(t.unicode);n+=t.width}const a=s.join("");r.fillText(a,0,0);if(null!==this.dependencyTracker){const e=r.measureText(a);this.dependencyTracker.recordBBox(t,this.ctx,-e.actualBoundingBoxLeft,e.actualBoundingBoxRight,-e.actualBoundingBoxAscent,e.actualBoundingBoxDescent).recordShowTextOperation(t)}i.x+=n*m*d;r.restore();this.compose();return}let D,M=0;for(D=0;D0){C=r.measureText(y);const t=1e3*C.width/n*a;if(EC??r.measureText(y))}else{this.paintChar(t,y,v,x,b,w);if(A){const e=v+n*A.offset.x/a,i=x-n*A.offset.y/a;this.paintChar(t,A.fontChar,e,i,b,w)}}M+=u?E*m-c*h:E*m+c*h;d&&r.restore()}u?i.y-=M:i.x+=M*d;r.restore();this.compose();this.dependencyTracker?.recordShowTextOperation(t)}showType3Text(t,e){const i=this.ctx,n=this.current,r=n.font,a=n.fontSize,o=n.fontDirection,l=r.vertical?1:-1,h=n.charSpacing,d=n.wordSpacing,c=n.textHScale*o,u=n.fontMatrix||s,p=e.length;let g,m,f,b;if(n.textRenderingMode===w||0===a)return;this._cachedScaleForStroking[0]=-1;this._cachedGetSinglePixelWidth=null;i.save();n.textMatrix&&i.transform(...n.textMatrix);i.translate(n.x,n.y+n.textRise);i.scale(c,o);const y=this.dependencyTracker;this.dependencyTracker=y?new CanvasNestedDependencyTracker(y,t):null;for(g=0;gnew CanvasGraphics(t,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:this.optionalContentConfig,markedContentStack:this.markedContentStack},void 0,void 0,this.dependencyTracker?new CanvasNestedDependencyTracker(this.dependencyTracker,e,!0):null)};i=new TilingPattern(e,this.ctx,s,t)}else i=this._getPattern(t,e[1],e[2]);return i}setStrokeColorN(t,...e){this.dependencyTracker?.recordSimpleData("strokeColor",t);this.current.strokeColor=this.getColorN_Pattern(t,e);this.current.patternStroke=!0}setFillColorN(t,...e){this.dependencyTracker?.recordSimpleData("fillColor",t);const i=this.current.fillColor=this.getColorN_Pattern(t,e);this.current.patternFill=!0;this.current.tilingPatternDims=i instanceof TilingPattern?[0,0,0,0]:null}setStrokeRGBColor(t,e){this.dependencyTracker?.recordSimpleData("strokeColor",t);this.ctx.strokeStyle=this.current.strokeColor=e;this.current.patternStroke=!1}setStrokeTransparent(t){this.dependencyTracker?.recordSimpleData("strokeColor",t);this.ctx.strokeStyle=this.current.strokeColor="transparent";this.current.patternStroke=!1}setFillRGBColor(t,e){this.dependencyTracker?.recordSimpleData("fillColor",t);this.ctx.fillStyle=this.current.fillColor=e;this.current.patternFill=!1;this.current.tilingPatternDims=null}setFillTransparent(t){this.dependencyTracker?.recordSimpleData("fillColor",t);this.ctx.fillStyle=this.current.fillColor="transparent";this.current.patternFill=!1;this.current.tilingPatternDims=null}_getPattern(t,e,i=null){let s;if(this.cachedPatterns.has(e))s=this.cachedPatterns.get(e);else{s=function getShadingPattern(t){switch(t[0]){case"RadialAxial":return new RadialAxialShadingPattern(t);case"Mesh":return new MeshShadingPattern(t);case"Dummy":return new DummyShadingPattern}throw new Error(`Unknown IR type: ${t[0]}`)}(this.getObject(t,e));this.cachedPatterns.set(e,s)}i&&(s.matrix=i);return s}shadingFill(t,e){if(!this.contentVisible)return;const s=this.ctx;this.save(t);const n=this._getPattern(t,e);s.fillStyle=n.getPattern(s,this,getCurrentTransformInverse(s),xt,t);const r=getCurrentTransformInverse(s);if(r){const{width:t,height:e}=s.canvas,n=i.slice();Util.axialAlignedBoundingBox([0,0,t,e],r,n);const[a,o,l,h]=n;this.ctx.fillRect(a,o,l-a,h-o)}else this.ctx.fillRect(-1e10,-1e10,2e10,2e10);this.dependencyTracker?.resetBBox(t).recordFullPageBBox(t).recordDependencies(t,at).recordDependencies(t,it).recordOperation(t);this.compose(this.current.getClippedPathBoundingBox());this.restore(t)}beginInlineImage(){unreachable("Should not call beginInlineImage")}beginImageData(){unreachable("Should not call beginImageData")}paintFormXObjectBegin(t,e,i){if(this.contentVisible){this.save(t);this.baseTransformStack.push(this.baseTransform);e&&this.transform(t,...e);this.baseTransform=getCurrentTransform(this.ctx);if(i){Util.axialAlignedBoundingBox(i,this.baseTransform,this.current.minMax);const[e,s,n,r]=i,a=new Path2D;a.rect(e,s,n-e,r-s);this.ctx.clip(a);this.dependencyTracker?.recordClipBox(t,this.ctx,e,n,s,r);this.endPath(t)}}}paintFormXObjectEnd(t){if(this.contentVisible){this.restore(t);this.baseTransform=this.baseTransformStack.pop()}}beginGroup(t,e){if(!this.contentVisible)return;this.save(t);const{inSMaskMode:s}=this;if(s){this.endSMaskMode();this.current.activeSMask=null}const n=this.ctx;e.isolated||info("TODO: Support non-isolated groups.");e.knockout&&warn("Knockout groups not supported.");if(!e.needsIsolation&&1===n.globalAlpha&&"source-over"===n.globalCompositeOperation&&!s){if(e.bbox){let t=new Path2D;const[i,s,r,a]=e.bbox;t.rect(i,s,r-i,a-s);if(e.matrix){const i=new Path2D;i.addPath(t,new DOMMatrix(e.matrix));t=i}n.clip(t)}this.groupStack.push(null);this.groupLevel++;return}const r=getCurrentTransform(n);e.matrix&&n.transform(...e.matrix);const a=[0,0,n.canvas.width,n.canvas.height];let o;if(e.bbox){o=i.slice();Util.axialAlignedBoundingBox(e.bbox,getCurrentTransform(n),o);o=Util.intersect(o,a)||[0,0,0,0]}else o=a;const l=Math.floor(o[0]),h=Math.floor(o[1]),d=Math.max(Math.ceil(o[2])-l,1),c=Math.max(Math.ceil(o[3])-h,1);this.current.startNewPathAndClipBox([0,0,d,c]);const u=this.canvasFactory.create(d,c);e.smask&&this.smaskGroupCanvases.push(u);const p=u.context;p.translate(-l,-h);p.transform(...r);if(!e.isolated&&!e.smask&&s&&e.needsIsolation){p.save();p.setTransform(1,0,0,1,0,0);p.drawImage(n.canvas,-l,-h);p.restore()}if(e.bbox){let t=new Path2D;const[i,s,n,r]=e.bbox;t.rect(i,s,n-i,r-s);if(e.matrix){const i=new Path2D;i.addPath(t,new DOMMatrix(e.matrix));t=i}p.clip(t)}e.smask&&this.smaskStack.push({canvas:u.canvas,context:p,offsetX:l,offsetY:h,subtype:e.smask.subtype,backdrop:e.smask.backdrop,transferMap:e.smask.transferMap||null});if(!e.smask||this.dependencyTracker){n.setTransform(1,0,0,1,0,0);n.translate(l,h);n.save()}copyCtxState(n,p);this.ctx=p;this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha","strokeAlpha","globalCompositeOperation"]).pushBaseTransform(n);this.setGState(t,[["BM","source-over"],["ca",1],["CA",1],["TR",null]]);this.groupStack.push(n);this.groupLevel++}endGroup(t,e){if(!this.contentVisible)return;this.groupLevel--;const s=this.ctx,n=this.groupStack.pop();if(null!==n){this.ctx=n;this.ctx.imageSmoothingEnabled=!1;this.dependencyTracker?.popBaseTransform();if(e.smask){this.tempSMask=this.smaskStack.pop();this.restore(t);if(this.dependencyTracker){this.ctx.restore();this.inSMaskMode&&this.ctx.setTransform(this.suspendedCtx.getTransform())}}else{this.ctx.restore();const e=getCurrentTransform(this.ctx);this.restore(t);this.ctx.save();this.ctx.setTransform(...e);const n=i.slice();Util.axialAlignedBoundingBox([0,0,s.canvas.width,s.canvas.height],e,n);this.ctx.drawImage(s.canvas,0,0);this.ctx.restore();this.canvasFactory.destroy({canvas:s.canvas,context:s});this.compose(n)}}else this.restore(t)}beginAnnotation(t,e,i,s,n,r){this.#zs();resetCtxToDefault(this.ctx);this.ctx.save();this.save(t);this.baseTransform&&this.ctx.setTransform(...this.baseTransform);if(i){const n=i[2]-i[0],a=i[3]-i[1];if(r&&this.annotationCanvasMap){(s=s.slice())[4]-=i[0];s[5]-=i[1];(i=i.slice())[0]=i[1]=0;i[2]=n;i[3]=a;Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx),_t);const{viewportScale:t}=this,r=Math.ceil(n*this.outputScaleX*t),o=Math.ceil(a*this.outputScaleY*t);this.annotationCanvas=this.canvasFactory.create(r,o);const{canvas:l,context:h}=this.annotationCanvas;this.annotationCanvasMap.set(e,l);this.annotationCanvas.savedCtx=this.ctx;this.ctx=h;this.ctx.save();this.ctx.setTransform(_t[0],0,0,-_t[1],0,a*_t[1]);resetCtxToDefault(this.ctx)}else{resetCtxToDefault(this.ctx);this.endPath(t);const e=new Path2D;e.rect(i[0],i[1],n,a);this.ctx.clip(e)}}this.current=new CanvasExtraState(this.ctx.canvas.width,this.ctx.canvas.height);this.baseTransformStack.push(this.baseTransform);this.transform(t,...s);this.transform(t,...n);this.baseTransform=getCurrentTransform(this.ctx)}endAnnotation(t){if(this.annotationCanvas){this.ctx.restore();this.#Gs();this.ctx=this.annotationCanvas.savedCtx;delete this.annotationCanvas.savedCtx;delete this.annotationCanvas}this.baseTransform=this.baseTransformStack.pop()}paintImageMaskXObject(t,e){if(!this.contentVisible)return;const i=e.count;(e=this.getObject(t,e.data,e)).count=i;const s=this.ctx,n=this._createMaskCanvas(t,e),r=n.canvas;s.save();s.setTransform(1,0,0,1,0,0);s.drawImage(r,n.offsetX,n.offsetY);this.dependencyTracker?.resetBBox(t).recordBBox(t,this.ctx,n.offsetX,n.offsetX+r.width,n.offsetY,n.offsetY+r.height).recordOperation(t);s.restore();n.canvasEntry&&this.canvasFactory.destroy(n.canvasEntry);this.compose()}paintImageMaskXObjectRepeat(t,e,i,s=0,n=0,r,a){if(!this.contentVisible)return;e=this.getObject(t,e.data,e);const o=this.ctx;o.save();const l=getCurrentTransform(o);o.transform(i,s,n,r,0,0);const h=this._createMaskCanvas(t,e);o.setTransform(1,0,0,1,h.offsetX-l[4],h.offsetY-l[5]);this.dependencyTracker?.resetBBox(t);for(let e=0,d=a.length;ee?h/e:1;a=l>e?l/e:1}}this._cachedScaleForStroking[0]=r;this._cachedScaleForStroking[1]=a}return this._cachedScaleForStroking}rescaleAndStroke(t,e){const{ctx:i,current:{lineWidth:s}}=this,[n,r]=this.getScaleForStroking();if(n===r){i.lineWidth=(s||1)*n;i.stroke(t);return}const a=i.getLineDash();e&&i.save();i.scale(n,r);St.a=1/n;St.d=1/r;const o=new Path2D;o.addPath(t,St);if(a.length>0){const t=Math.max(n,r);i.setLineDash(a.map(e=>e/t));i.lineDashOffset/=t}i.lineWidth=s||1;i.stroke(o);e&&i.restore()}isContentVisible(){for(let t=this.markedContentStack.length-1;t>=0;t--)if(!this.markedContentStack[t].visible)return!1;return!0}}for(const t in I)void 0!==CanvasGraphics.prototype[t]&&(CanvasGraphics.prototype[I[t]]=CanvasGraphics.prototype[t]);class BasePDFStream{#Vs=null;#js=null;_fullReader=null;_rangeReaders=new Set;_source=null;constructor(t,e,i){this._source=t;this.#Vs=e;this.#js=i}get _progressiveDataLength(){return this._fullReader?._loaded??0}getFullReader(){assert(!this._fullReader,"BasePDFStream.getFullReader can only be called once.");return this._fullReader=new this.#Vs(this)}getRangeReader(t,e){if(e<=this._progressiveDataLength)return null;const i=new this.#js(this,t,e);this._rangeReaders.add(i);return i}cancelAllRequests(t){this._fullReader?.cancel(t);for(const e of new Set(this._rangeReaders))e.cancel(t)}}class BasePDFStreamReader{onProgress=null;_contentLength=0;_filename=null;_headersCapability=Promise.withResolvers();_isRangeSupported=!1;_isStreamingSupported=!1;_loaded=0;_stream=null;constructor(t){this._stream=t}_callOnProgress(){this.onProgress?.({loaded:this._loaded,total:this._contentLength})}get headersReady(){return this._headersCapability.promise}get filename(){return this._filename}get contentLength(){return this._contentLength}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}async read(){unreachable("Abstract method `read` called")}cancel(t){unreachable("Abstract method `cancel` called")}}class BasePDFStreamRangeReader{_stream=null;constructor(t,e,i){this._stream=t}async read(){unreachable("Abstract method `read` called")}cancel(t){unreachable("Abstract method `cancel` called")}}function createHeaders(t,e){const i=new Headers;if(!t||!e||"object"!=typeof e)return i;for(const t in e){const s=e[t];void 0!==s&&i.append(t,s)}return i}function getResponseOrigin(t){return URL.parse(t)?.origin??null}function validateRangeRequestCapabilities({responseHeaders:t,isHttp:e,rangeChunkSize:i,disableRange:s}){const n={contentLength:0,isRangeSupported:!1},r=parseInt(t.get("Content-Length"),10);if(!Number.isInteger(r))return n;n.contentLength=r;if(r<=2*i)return n;if(s||!e)return n;if("bytes"!==t.get("Accept-Ranges"))return n;"identity"===(t.get("Content-Encoding")||"identity")&&(n.isRangeSupported=!0);return n}function extractFilenameFromHeader(t){const e=t.get("Content-Disposition");if(e){let t=function getFilenameFromContentDispositionHeader(t){let e=!0,i=toParamRegExp("filename\\*","i").exec(t);if(i){i=i[1];let t=rfc2616unquote(i);t=unescape(t);t=rfc5987decode(t);t=rfc2047decode(t);return fixupEncoding(t)}i=function rfc2231getparam(t){const e=[];let i;const s=toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)","ig");for(;null!==(i=s.exec(t));){let[,t,s,n]=i;t=parseInt(t,10);if(t in e){if(0===t)break}else e[t]=[s,n]}const n=[];for(let t=0;t{t._responseOrigin=getResponseOrigin(i.url);ensureResponseStatus(i.status,n);this._reader=i.body.getReader();const r=i.headers,{contentLength:a,isRangeSupported:o}=validateRangeRequestCapabilities({responseHeaders:r,isHttp:!0,rangeChunkSize:s,disableRange:e});this._contentLength=a;this._isRangeSupported=o;this._filename=extractFilenameFromHeader(r);!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new AbortException("Streaming is disabled."));this._headersCapability.resolve()}).catch(this._headersCapability.reject)}async read(){await this._headersCapability.promise;const{value:t,done:e}=await this._reader.read();if(e)return{value:t,done:e};this._loaded+=t.byteLength;this._callOnProgress();return{value:getArrayBuffer(t),done:!1}}cancel(t){this._reader?.cancel(t);this._abortController.abort()}}class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader{_abortController=new AbortController;_readCapability=Promise.withResolvers();_reader=null;constructor(t,e,i){super(t,e,i);const{url:s,withCredentials:n}=t._source,r=new Headers(t.headers);r.append("Range",`bytes=${e}-${i-1}`);fetchUrl(s,r,n,this._abortController).then(e=>{ensureResponseOrigin(getResponseOrigin(e.url),t._responseOrigin);ensureResponseStatus(e.status,s);this._reader=e.body.getReader();this._readCapability.resolve()}).catch(this._readCapability.reject)}async read(){await this._readCapability.promise;const{value:t,done:e}=await this._reader.read();return e?{value:t,done:e}:{value:getArrayBuffer(t),done:!1}}cancel(t){this._reader?.cancel(t);this._abortController.abort()}}function transport_stream_getArrayBuffer(t){return t instanceof Uint8Array&&t.byteLength===t.buffer.byteLength?t.buffer:new Uint8Array(t).buffer}function endRequests(){for(const t of this._requests)t.resolve({value:void 0,done:!0});this._requests.length=0}class PDFDataTransportStream extends BasePDFStream{_progressiveDone=!1;_queuedChunks=[];constructor(t){super(t,PDFDataTransportStreamReader,PDFDataTransportStreamRangeReader);const{pdfDataRangeTransport:e}=t,{initialData:i,progressiveDone:s}=e;if(i?.length>0){const t=transport_stream_getArrayBuffer(i);this._queuedChunks.push(t)}this._progressiveDone=s;e.transportReady(t=>{switch(t.type){case"range":case"progressiveRead":this.#$s(t.begin,t.chunk);break;case"progressiveDone":this._fullReader?.progressiveDone();this._progressiveDone=!0}})}#$s(t,e){const i=transport_stream_getArrayBuffer(e);if(void 0===t)this._fullReader?this._fullReader._enqueue(i):this._queuedChunks.push(i);else{const e=this._rangeReaders.keys().find(e=>e._begin===t);assert(e,"#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");e._enqueue(i)}}getFullReader(){const t=super.getFullReader();this._queuedChunks=null;return t}getRangeReader(t,e){const i=super.getRangeReader(t,e);if(i){i.onDone=()=>this._rangeReaders.delete(i);this._source.pdfDataRangeTransport.requestDataRange(t,e)}return i}cancelAllRequests(t){super.cancelAllRequests(t);this._source.pdfDataRangeTransport.abort()}}class PDFDataTransportStreamReader extends BasePDFStreamReader{#Xs=endRequests.bind(this);_done=!1;_queuedChunks=null;_requests=[];constructor(t){super(t);const{pdfDataRangeTransport:e,disableRange:i,disableStream:s}=t._source,{length:n,contentDispositionFilename:r}=e;this._queuedChunks=t._queuedChunks||[];for(const t of this._queuedChunks)this._loaded+=t.byteLength;this._done=t._progressiveDone;this._contentLength=n;this._isStreamingSupported=!s;this._isRangeSupported=!i;isPdfFile(r)&&(this._filename=r);this._headersCapability.resolve();const a=this._loaded;Promise.resolve().then(()=>{a>0&&this._loaded===a&&this._callOnProgress()})}_enqueue(t){if(!this._done){if(this._requests.length>0){this._requests.shift().resolve({value:t,done:!1})}else this._queuedChunks.push(t);this._loaded+=t.byteLength;this._callOnProgress()}}async read(){if(this._queuedChunks.length>0){return{value:this._queuedChunks.shift(),done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();this._requests.push(t);return t.promise}cancel(t){this._done=!0;this.#Xs()}progressiveDone(){this._done||=!0;0===this._queuedChunks.length&&this.#Xs()}}class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader{#Xs=endRequests.bind(this);onDone=null;_begin=-1;_done=!1;_queuedChunk=null;_requests=[];constructor(t,e,i){super(t,e,i);this._begin=e}_enqueue(t){if(!this._done){if(0===this._requests.length)this._queuedChunk=t;else{this._requests.shift().resolve({value:t,done:!1});this.#Xs()}this._done=!0;this.onDone?.()}}async read(){if(this._queuedChunk){const t=this._queuedChunk;this._queuedChunk=null;return{value:t,done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();this._requests.push(t);return t.promise}cancel(t){this._done=!0;this.#Xs();this.onDone?.()}}class PDFNetworkStream extends BasePDFStream{#qs=new WeakMap;_responseOrigin=null;constructor(t){super(t,PDFNetworkStreamReader,PDFNetworkStreamRangeReader);const{httpHeaders:e,url:i}=t;this.url=i;this.isHttp=/https?:/.test(i.protocol);this.headers=createHeaders(this.isHttp,e)}_request(t){const e=new XMLHttpRequest,i={validateStatus:null,onHeadersReceived:t.onHeadersReceived,onDone:t.onDone,onError:t.onError,onProgress:t.onProgress};this.#qs.set(e,i);e.open("GET",this.url);e.withCredentials=this._source.withCredentials;for(const[t,i]of this.headers)e.setRequestHeader(t,i);if(this.isHttp&&"begin"in t&&"end"in t){e.setRequestHeader("Range",`bytes=${t.begin}-${t.end-1}`);i.validateStatus=t=>206===t||200===t}else i.validateStatus=t=>200===t;e.responseType="arraybuffer";assert(t.onError,"Expected `onError` callback to be provided.");e.onerror=()=>t.onError(e.status);e.onreadystatechange=this.#Ks.bind(this,e);e.onprogress=this.#Ys.bind(this,e);e.send(null);return e}#Ys(t,e){const i=this.#qs.get(t);i?.onProgress?.(e)}#Ks(t,e){const i=this.#qs.get(t);if(!i)return;if(t.readyState>=2&&i.onHeadersReceived){i.onHeadersReceived();delete i.onHeadersReceived}if(4!==t.readyState)return;if(!this.#qs.has(t))return;this.#qs.delete(t);if(0===t.status&&this.isHttp){i.onError(t.status);return}const s=t.status||200;if(!i.validateStatus(s)){i.onError(t.status);return}const n=function network_getArrayBuffer(t){return"string"!=typeof t?t:stringToBytes(t).buffer}(t.response);if(206===s){const e=t.getResponseHeader("Content-Range");if(/bytes (\d+)-(\d+)\/(\d+)/.test(e))i.onDone(n);else{warn('Missing or invalid "Content-Range" header.');i.onError(0)}}else n?i.onDone(n):i.onError(t.status)}_abortRequest(t){if(this.#qs.has(t)){this.#qs.delete(t);t.abort()}}getRangeReader(t,e){const i=super.getRangeReader(t,e);i&&(i.onClosed=()=>this._rangeReaders.delete(i));return i}}class PDFNetworkStreamReader extends BasePDFStreamReader{#Xs=endRequests.bind(this);_cachedChunks=[];_done=!1;_requests=[];_storedError=null;constructor(t){super(t);this._fullRequestXhr=t._request({onHeadersReceived:this.#Qs.bind(this),onDone:this.#Js.bind(this),onError:this.#Zs.bind(this),onProgress:this.#Ys.bind(this)})}#Qs(){const t=this._stream,{disableRange:e,rangeChunkSize:i}=t._source,s=this._fullRequestXhr;t._responseOrigin=getResponseOrigin(s.responseURL);const n=s.getAllResponseHeaders(),r=new Headers(n?n.trimStart().replace(/[^\S ]+$/,"").split(/[\r\n]+/).map(t=>{const[e,...i]=t.split(": ");return[e,i.join(": ")]}):[]),{contentLength:a,isRangeSupported:o}=validateRangeRequestCapabilities({responseHeaders:r,isHttp:t.isHttp,rangeChunkSize:i,disableRange:e});this._contentLength=a;this._isRangeSupported=o;this._filename=extractFilenameFromHeader(r);this._isRangeSupported&&t._abortRequest(s);this._headersCapability.resolve()}#Js(t){if(this._requests.length>0){this._requests.shift().resolve({value:t,done:!1})}else this._cachedChunks.push(t);this._done=!0;0===this._cachedChunks.length&&this.#Xs()}#Zs(t){this._storedError=createResponseError(t,this._stream.url);this._headersCapability.reject(this._storedError);for(const t of this._requests)t.reject(this._storedError);this._requests.length=0;this._cachedChunks.length=0}#Ys(t){this.onProgress?.({loaded:t.loaded,total:t.lengthComputable?t.total:this._contentLength})}async read(){await this._headersCapability.promise;if(this._storedError)throw this._storedError;if(this._cachedChunks.length>0){return{value:this._cachedChunks.shift(),done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();this._requests.push(t);return t.promise}cancel(t){this._done=!0;this._headersCapability.reject(t);this.#Xs();this._stream._abortRequest(this._fullRequestXhr);this._fullRequestXhr=null}}class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader{#Xs=endRequests.bind(this);onClosed=null;_done=!1;_queuedChunk=null;_requests=[];_storedError=null;constructor(t,e,i){super(t,e,i);this._requestXhr=t._request({begin:e,end:i,onHeadersReceived:this.#Qs.bind(this),onDone:this.#Js.bind(this),onError:this.#Zs.bind(this),onProgress:null})}#Qs(){const t=getResponseOrigin(this._requestXhr?.responseURL);try{ensureResponseOrigin(t,this._stream._responseOrigin)}catch(t){this._storedError=t;this.#Zs(0)}}#Js(t){if(this._requests.length>0){this._requests.shift().resolve({value:t,done:!1})}else this._queuedChunk=t;this._done=!0;this.#Xs();this.onClosed?.()}#Zs(t){this._storedError??=createResponseError(t,this._stream.url);for(const t of this._requests)t.reject(this._storedError);this._requests.length=0;this._queuedChunk=null}async read(){if(this._storedError)throw this._storedError;if(null!==this._queuedChunk){const t=this._queuedChunk;this._queuedChunk=null;return{value:t,done:!1}}if(this._done)return{value:void 0,done:!0};const t=Promise.withResolvers();this._requests.push(t);return t.promise}cancel(t){this._done=!0;this.#Xs();this._stream._abortRequest(this._requestXhr);this.onClosed?.()}}function getReadableStream(t,e=null){const i=process.getBuiltinModule("fs"),{Readable:s}=process.getBuiltinModule("stream"),n=i.createReadStream(t,e);return s.toWeb(n)}class PDFNodeStream extends BasePDFStream{constructor(t){super(t,PDFNodeStreamReader,PDFNodeStreamRangeReader);const{url:e}=t;assert("file:"===e.protocol,"PDFNodeStream only supports file:// URLs.")}}class PDFNodeStreamReader extends BasePDFStreamReader{_reader=null;constructor(t){super(t);const{disableRange:e,disableStream:i,rangeChunkSize:s,url:n}=t._source;this._isStreamingSupported=!i;process.getBuiltinModule("fs/promises").lstat(n).then(t=>{const i=getReadableStream(n);this._reader=i.getReader();const{size:r}=t;this._contentLength=r;this._isRangeSupported=!e&&r>2*s;!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new AbortException("Streaming is disabled."));this._headersCapability.resolve()}).catch(t=>{"ENOENT"===t.code&&(t=createResponseError(0,n));this._headersCapability.reject(t)})}async read(){await this._headersCapability.promise;const{value:t,done:e}=await this._reader.read();if(e)return{value:t,done:e};this._loaded+=t.byteLength;this._callOnProgress();return{value:getArrayBuffer(t),done:!1}}cancel(t){this._reader?.cancel(t)}}class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader{_readCapability=Promise.withResolvers();_reader=null;constructor(t,e,i){super(t,e,i);const{url:s}=t._source;try{const t=getReadableStream(s,{start:e,end:i-1});this._reader=t.getReader();this._readCapability.resolve()}catch(t){this._readCapability.reject(t)}}async read(){await this._readCapability.promise;const{value:t,done:e}=await this._reader.read();return e?{value:t,done:e}:{value:getArrayBuffer(t),done:!1}}cancel(t){this._reader?.cancel(t)}}class GlobalWorkerOptions{static#tn=null;static#en="";static get workerPort(){return this.#tn}static set workerPort(t){if(!("undefined"!=typeof Worker&&t instanceof Worker)&&null!==t)throw new Error("Invalid `workerPort` type.");this.#tn=t}static get workerSrc(){return this.#en}static set workerSrc(t){if("string"!=typeof t)throw new Error("Invalid `workerSrc` type.");this.#en=t}}class Metadata{#in;#sn;constructor({parsedData:t,rawData:e}){this.#in=t;this.#sn=e}getRaw(){return this.#sn}get(t){return this.#in.get(t)??null}[Symbol.iterator](){return this.#in.entries()}}const It=Symbol("INTERNAL");class OptionalContentGroup{#nn=!1;#rn=!1;#an=!1;#on=!0;constructor(t,{name:e,intent:i,usage:s,rbGroups:n}){this.#nn=!!(t&a);this.#rn=!!(t&o);this.name=e;this.intent=i;this.usage=s;this.rbGroups=n}get visible(){if(this.#an)return this.#on;if(!this.#on)return!1;const{print:t,view:e}=this.usage;return this.#nn?"OFF"!==e?.viewState:!this.#rn||"OFF"!==t?.printState}_setVisible(t,e,i=!1){t!==It&&unreachable("Internal method `_setVisible` called.");this.#an=i;this.#on=e}}class OptionalContentConfig{#ln=null;#hn=new Map;#dn=null;#cn=null;constructor(t,e=a){this.renderingIntent=e;this.name=null;this.creator=null;if(null!==t){this.name=t.name;this.creator=t.creator;this.#cn=t.order;for(const i of t.groups)this.#hn.set(i.id,new OptionalContentGroup(e,i));if("OFF"===t.baseState)for(const t of this.#hn.values())t._setVisible(It,!1);for(const e of t.on)this.#hn.get(e)._setVisible(It,!0);for(const e of t.off)this.#hn.get(e)._setVisible(It,!1);this.#dn=this.getHash()}}#un(t){const e=t.length;if(e<2)return!0;const i=t[0];for(let s=1;st===e+1)&&(this.#pn=null)}deletePages(t){this.#yn();const e=this.#pn,i=this.#An();this.#bn={pageNumberToId:e.slice(),pagesNumber:this.#mn,prevPageNumbers:this.#gn.slice()};const s=this.#mn-t.length;this.#mn=s;const n=this.#pn=new Uint32Array(s);this.#gn=new Int32Array(s);let r=0,a=0;for(const i of t){const t=i-1;if(t!==r){n.set(e.subarray(r,t),a);a+=t-r}r=t+1}rthis.#pn[t-1])}}cancelCopy(){this.#fn=null}pastePages(t){this.#yn();const e=this.#pn,i=this.#An(),{pageNumbers:s,pageIds:n}=this.#fn,r=this.#mn+s.length;this.#mn=r;const a=this.#pn=new Uint32Array(r);this.#gn=new Int32Array(r);a.set(e.subarray(0,t),0);a.set(n,t);a.set(e.subarray(t),t+s.length);this.#vn(i,null,t,s);this.#fn=null}#vn(t,e=null,i=-1,s=null){const n=this.#gn,r=this.#pn,a=i+(s?.length??0),o=new Map;for(let l=0,h=this.#mn;l=i&&lt[0]-e[0]);for(let i=0,s=t.length;it-e);const e=new Map;for(let i=0,s=t.length;i({...Promise.withResolvers(),data:Ft});class PDFObjects{#wn=new Map;get(t,e=null){if(e){const i=this.#wn.getOrInsertComputed(t,dataObj);i.promise.then(()=>e(i.data));return null}const i=this.#wn.get(t);if(!i||i.data===Ft)throw new Error(`Requesting object that isn't resolved yet ${t}.`);return i.data}has(t){const e=this.#wn.get(t);return!!e&&e.data!==Ft}delete(t){const e=this.#wn.get(t);if(!e||e.data===Ft)return!1;this.#wn.delete(t);return!0}resolve(t,e=null){const i=this.#wn.getOrInsertComputed(t,dataObj);if(i.data!==Ft)throw new Error(`Object already resolved ${t}.`);i.data=e;i.resolve()}clear(){for(const{data:t}of this.#wn.values())t?.bitmap?.close();this.#wn.clear()}*[Symbol.iterator](){for(const[t,{data:e}]of this.#wn)e!==Ft&&(yield[t,e])}}class TextLayer{#xn=Promise.withResolvers();#_t=null;#Cn=!1;#En=!!globalThis.FontInspector?.enabled;#Tn=null;#Sn=null;#_n=null;#Pn=0;#Dn=0;#Mn=null;#kn=null;#In=0;#Fn=0;#Bn=Object.create(null);#Rn=[];#On=null;#Ln=[];#Nn=new WeakMap;#Un=null;static#Hn=new Map;static#zn=new Map;static#Gn=new WeakMap;static#Wn=null;static#Vn=new Set;constructor({textContentSource:t,images:e,container:i,viewport:s}){if(t instanceof ReadableStream)this.#On=t;else{if("object"!=typeof t)throw new Error('No "textContentSource" parameter specified.');this.#On=new ReadableStream({start(e){e.enqueue(t);e.close()}})}this.#_t=this.#kn=i;this.#Tn=e;this.#Fn=s.scale*OutputScale.pixelRatio;this.#In=s.rotation;this.#_n={div:null,properties:null,ctx:null};const{pageWidth:n,pageHeight:r,pageX:a,pageY:o}=s.rawDims;this.#Un=[1,0,0,-1,-a,o+r];this.#Dn=n;this.#Pn=r;TextLayer.#jn();i.style.setProperty("--min-font-size",TextLayer.#Wn);setLayerDimensions(i,s);this.#xn.promise.finally(()=>{TextLayer.#Vn.delete(this);this.#_n=null;this.#Bn=null}).catch(()=>{})}static get fontFamilyMap(){const{isWindows:t,isFirefox:e}=FeatureTest.platform;return shadow(this,"fontFamilyMap",new Map([["sans-serif",(t&&e?"Calibri, ":"")+"sans-serif"],["monospace",(t&&e?"Lucida Console, ":"")+"monospace"]]))}render(){this.#Tn&&this.#_t.append(this.#Tn.render());const pump=()=>{this.#Mn.read().then(({value:t,done:e})=>{if(e)this.#xn.resolve();else{this.#Sn??=t.lang;Object.assign(this.#Bn,t.styles);this.#$n(t.items);pump()}},this.#xn.reject)};this.#Mn=this.#On.getReader();TextLayer.#Vn.add(this);pump();return this.#xn.promise}update({viewport:t,onBefore:e=null}){const i=t.scale*OutputScale.pixelRatio,s=t.rotation;if(s!==this.#In){e?.();this.#In=s;setLayerDimensions(this.#kn,{rotation:s})}if(i!==this.#Fn){e?.();this.#Fn=i;const t={div:null,properties:null,ctx:TextLayer.#Xn(this.#Sn)};for(const e of this.#Ln){t.properties=this.#Nn.get(e);t.div=e;this.#qn(t)}}}cancel(){const t=new AbortException("TextLayer task cancelled.");this.#Mn?.cancel(t).catch(()=>{});this.#Mn=null;this.#xn.reject(t)}get textDivs(){return this.#Ln}get textContentItemsStr(){return this.#Rn}#$n(t){if(this.#Cn)return;this.#_n.ctx??=TextLayer.#Xn(this.#Sn);const e=this.#Ln,i=this.#Rn;for(const s of t){if(e.length>1e5){warn("Ignoring additional textDivs for performance reasons.");this.#Cn=!0;return}if(void 0!==s.str){i.push(s.str);this.#Kn(s)}else if("beginMarkedContentProps"===s.type||"beginMarkedContent"===s.type){const t=this.#_t;this.#_t=document.createElement("span");this.#_t.classList.add("markedContent");s.id&&this.#_t.setAttribute("id",`${s.id}`);"Artifact"===s.tag&&(this.#_t.ariaHidden=!0);t.append(this.#_t)}else"endMarkedContent"===s.type&&(this.#_t=this.#_t.parentNode)}}#Kn(t){const e=document.createElement("span"),i={angle:0,canvasWidth:0,hasText:""!==t.str,hasEOL:t.hasEOL,fontSize:0};this.#Ln.push(e);const s=Util.transform(this.#Un,t.transform);let n=Math.atan2(s[1],s[0]);const r=this.#Bn[t.fontName];r.vertical&&(n+=Math.PI/2);let a=this.#En&&r.fontSubstitution||r.fontFamily;a=TextLayer.fontFamilyMap.get(a)||a;const o=Math.hypot(s[2],s[3]),l=o*TextLayer.#Yn(a,r,this.#Sn);let h,d;if(0===n){h=s[4];d=s[5]-l}else{h=s[4]+l*Math.sin(n);d=s[5]-l*Math.cos(n)}const c=e.style;c.left=`${(100*h/this.#Dn).toFixed(2)}%`;c.top=`${(100*d/this.#Pn).toFixed(2)}%`;c.setProperty("--font-height",`${o.toFixed(2)}px`);c.fontFamily=a;i.fontSize=o;e.setAttribute("role","presentation");e.textContent=t.str;e.dir=t.dir;this.#En&&(e.dataset.fontName=r.fontSubstitutionLoadedName||t.fontName);0!==n&&(i.angle=n*(180/Math.PI));let u=!1;if(t.str.length>1)u=!0;else if(" "!==t.str&&t.transform[0]!==t.transform[3]){const e=Math.abs(t.transform[0]),i=Math.abs(t.transform[3]);e!==i&&Math.max(e,i)/Math.min(e,i)>1.5&&(u=!0)}u&&(i.canvasWidth=r.vertical?t.height:t.width);this.#Nn.set(e,i);this.#_n.div=e;this.#_n.properties=i;this.#qn(this.#_n);i.hasText&&this.#_t.append(e);if(i.hasEOL){const t=document.createElement("br");t.setAttribute("role","presentation");this.#_t.append(t)}}#qn(t){const{div:e,properties:i,ctx:s}=t,{style:n}=e;if(0!==i.canvasWidth&&i.hasText){const{fontFamily:t}=n,{canvasWidth:r,fontSize:a}=i;TextLayer.#Qn(s,a*this.#Fn,t);const{width:o}=s.measureText(e.textContent);o>0&&n.setProperty("--scale-x",r*this.#Fn/o)}0!==i.angle&&n.setProperty("--rotate",`${i.angle}deg`)}static cleanup(){if(!(this.#Vn.size>0)){this.#Hn.clear();for(const{canvas:t}of this.#zn.values())t.remove();this.#zn.clear()}}static#Xn(t=null){let e=this.#zn.get(t||="");if(!e){const i=document.createElement("canvas");i.className="hiddenCanvasElement";i.lang=t;document.body.append(i);e=i.getContext("2d",{alpha:!1,willReadFrequently:!0});this.#zn.set(t,e);this.#Gn.set(e,{size:0,family:""})}return e}static#Qn(t,e,i){const s=this.#Gn.get(t);if(e!==s.size||i!==s.family){t.font=`${e}px ${i}`;s.size=e;s.family=i}}static#jn(){if(null!==this.#Wn)return;const t=document.createElement("div");t.style.opacity=0;t.style.lineHeight=1;t.style.fontSize="1px";t.style.position="absolute";t.textContent="X";document.body.append(t);this.#Wn=t.getBoundingClientRect().height;t.remove()}static#Yn(t,e,i){const s=this.#Hn.get(t);if(s)return s;const n=this.#Xn(i);n.canvas.width=n.canvas.height=30;this.#Qn(n,30,t);const r=n.measureText(""),a=r.fontBoundingBoxAscent,o=Math.abs(r.fontBoundingBoxDescent);n.canvas.width=n.canvas.height=0;let l=.8;if(a)l=a/(a+o);else{FeatureTest.platform.isFirefox&&warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference in `about:config` to improve TextLayer rendering.");e.ascent?l=e.ascent:e.descent&&(l=1+e.descent)}this.#Hn.set(t,l);return l}}function getDocument(e={}){"string"==typeof e||e instanceof URL?e={url:e}:(e instanceof ArrayBuffer||ArrayBuffer.isView(e))&&(e={data:e});const i=new PDFDocumentLoadingTask,{docId:s}=i,n=e.url?function getUrlProp(e){if(e instanceof URL)return e;if("string"==typeof e){if(t){if(/^[a-z][a-z0-9\-+.]+:/i.test(e))return new URL(e);const t=process.getBuiltinModule("url");return new URL(t.pathToFileURL(e))}const i=URL.parse(e,window.location);if(i)return i}throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.")}(e.url):null,r=e.data?function getDataProp(e){if(t&&"undefined"!=typeof Buffer&&e instanceof Buffer)throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");if(e instanceof Uint8Array&&e.byteLength===e.buffer.byteLength)return e;if("string"==typeof e)return stringToBytes(e);if(e instanceof ArrayBuffer||ArrayBuffer.isView(e)||"object"==typeof e&&!isNaN(e?.length))return new Uint8Array(e);throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.")}(e.data):null,a=e.httpHeaders||null,o=!0===e.withCredentials,l=e.password??null,h=e.range instanceof PDFDataRangeTransport?e.range:null,d=Number.isInteger(e.rangeChunkSize)&&e.rangeChunkSize>0?e.rangeChunkSize:65536;let c=e.worker instanceof PDFWorker?e.worker:null;const u=e.verbosity,p="string"!=typeof e.docBaseUrl||isDataScheme(e.docBaseUrl)?null:e.docBaseUrl,g=getFactoryUrlProp(e.cMapUrl),m=!1!==e.cMapPacked,f=getFactoryUrlProp(e.iccUrl),b=getFactoryUrlProp(e.standardFontDataUrl),y=getFactoryUrlProp(e.wasmUrl),A=!0!==e.stopAtErrors,v=Number.isInteger(e.maxImageSize)&&e.maxImageSize>-1?e.maxImageSize:-1,w="boolean"==typeof e.isOffscreenCanvasSupported?e.isOffscreenCanvasSupported:!t,x="boolean"==typeof e.isImageDecoderSupported?e.isImageDecoderSupported:!t&&(FeatureTest.platform.isFirefox||!globalThis.chrome),C=Number.isInteger(e.canvasMaxAreaInBytes)?e.canvasMaxAreaInBytes:-1,E="boolean"==typeof e.disableFontFace?e.disableFontFace:t,T=!0===e.fontExtraProperties,S=!0===e.enableXfa,_=e.ownerDocument||globalThis.document,P=!0===e.disableRange,D=!0===e.disableStream,M=!0===e.disableAutoFetch,k=!0===e.pdfBug,I=e.CanvasFactory||(t?NodeCanvasFactory:DOMCanvasFactory),F=e.FilterFactory||(t?NodeFilterFactory:DOMFilterFactory),B=e.BinaryDataFactory||(t?NodeBinaryDataFactory:DOMBinaryDataFactory),R=!0===e.enableHWA,O=!0===e.enableWebGPU?function initGPU(){return At.init()}():Promise.resolve(!1),L=!1!==e.useWasm,N=e.pagesMapper||new PagesMapper,U="boolean"==typeof e.useSystemFonts?e.useSystemFonts:!t&&!E,H="boolean"==typeof e.useWorkerFetch?e.useWorkerFetch:!!(B===DOMBinaryDataFactory&&g&&m&&b&&y&&isValidFetchUrl(g,document.baseURI)&&isValidFetchUrl(b,document.baseURI)&&isValidFetchUrl(y,document.baseURI));setVerbosityLevel(u);const z={canvasFactory:new I({ownerDocument:_,enableHWA:R}),filterFactory:new F({docId:s,ownerDocument:_}),binaryDataFactory:H?null:new B({cMapUrl:g,standardFontDataUrl:b,wasmUrl:y})};if(!c){c=PDFWorker.create({verbosity:u,port:GlobalWorkerOptions.workerPort});i._worker=c}const G={docId:s,apiVersion:"5.7.284",data:r,password:l,disableAutoFetch:M,rangeChunkSize:d,docBaseUrl:p,enableXfa:S,evaluatorOptions:{maxImageSize:v,disableFontFace:E,ignoreErrors:A,isOffscreenCanvasSupported:w,isImageDecoderSupported:x,canvasMaxAreaInBytes:C,fontExtraProperties:T,useSystemFonts:U,useWasm:L,useWorkerFetch:H,cMapUrl:g,cMapPacked:m,iccUrl:f,standardFontDataUrl:b,wasmUrl:y,hasGPU:!1}},W={ownerDocument:_,pdfBug:k,styleElement:null,enableHWA:R,loadingParams:{disableAutoFetch:M,enableXfa:S}};Promise.all([c.promise,O]).then(function([,e]){if(i.destroyed)throw new Error("Loading aborted");if(c.destroyed)throw new Error("Worker was destroyed");G.evaluatorOptions.hasGPU=e;const l=c.messageHandler.sendWithPromise("GetDocRequest",G,r?[r.buffer]:null);let u;if(r);else if(h)u=new PDFDataTransportStream({pdfDataRangeTransport:h,disableRange:P,disableStream:D});else{if(!n)throw new Error("getDocument - expected either `data`, `range`, or `url` parameter.");{const e=function getNetworkStream(e){return isValidFetchUrl(e)?PDFFetchStream:t?PDFNodeStream:PDFNetworkStream}(n);u=new e({url:n,httpHeaders:a,withCredentials:o,rangeChunkSize:d,disableRange:P,disableStream:D})}}return l.then(t=>{if(i.destroyed)throw new Error("Loading aborted");if(c.destroyed)throw new Error("Worker was destroyed");const e=new MessageHandler(s,t,c.port),n=new WorkerTransport(e,i,u,W,z,N);i._transport=n;e.send("Ready",null)})}).catch(i._capability.reject);return i}class PDFDocumentLoadingTask{static#xs=0;_capability=Promise.withResolvers();_transport=null;_worker=null;docId="d"+PDFDocumentLoadingTask.#xs++;destroyed=!1;onPassword=null;onProgress=null;get promise(){return this._capability.promise}async destroy(){this.destroyed=!0;try{this._worker?.port&&(this._worker._pendingDestroy=!0);await(this._transport?.destroy())}catch(t){this._worker?.port&&delete this._worker._pendingDestroy;throw t}this._transport=null;this._worker?.destroy();this._worker=null}async getData(){return this._transport.getData()}}class PDFDataRangeTransport{#xn=Promise.withResolvers();#Jn=null;constructor(t,e,i=!1,s=null){this.length=t;this.initialData=e;this.progressiveDone=i;this.contentDispositionFilename=s;Object.defineProperty(this,"onDataProgress",{value:()=>{!function deprecated(t){console.log("Deprecated API usage: "+t)}("`PDFDataRangeTransport.prototype.onDataProgress` - method was removed, since loading progress is now reported automatically through the `PDFDataTransportStream` class (and related code).")}})}onDataRange(t,e){this.#Jn({type:"range",begin:t,chunk:e})}onDataProgressiveRead(t){this.#xn.promise.then(()=>{this.#Jn({type:"progressiveRead",chunk:t})})}onDataProgressiveDone(){this.#xn.promise.then(()=>{this.#Jn({type:"progressiveDone"})})}transportReady(t){this.#Jn=t;this.#xn.resolve()}requestDataRange(t,e){unreachable("Abstract method PDFDataRangeTransport.requestDataRange")}abort(){}}class PDFDocumentProxy{constructor(t,e){this._pdfInfo=t;this._transport=e}get pagesMapper(){return this._transport.pagesMapper}get annotationStorage(){return this._transport.annotationStorage}get canvasFactory(){return this._transport.canvasFactory}get filterFactory(){return this._transport.filterFactory}get numPages(){return this._pdfInfo.numPages}get fingerprints(){return this._pdfInfo.fingerprints}get isPureXfa(){return shadow(this,"isPureXfa",!!this._transport._htmlForXfa)}get allXfaHtml(){return this._transport._htmlForXfa}getPage(t){return this._transport.getPage(t)}getPageIndex(t){return this._transport.getPageIndex(t)}getDestinations(){return this._transport.getDestinations()}getDestination(t){return this._transport.getDestination(t)}getPageLabels(){return this._transport.getPageLabels()}getPageLayout(){return this._transport.getPageLayout()}getPageMode(){return this._transport.getPageMode()}getViewerPreferences(){return this._transport.getViewerPreferences()}getOpenAction(){return this._transport.getOpenAction()}getAttachments(){return this._transport.getAttachments()}getAnnotationsByType(t,e){return this._transport.getAnnotationsByType(t,e)}getJSActions(){return this._transport.getDocJSActions()}getOutline(){return this._transport.getOutline()}getOptionalContentConfig({intent:t="display"}={}){const{renderingIntent:e}=this._transport.getRenderingIntent(t);return this._transport.getOptionalContentConfig(e)}getPermissions(){return this._transport.getPermissions()}getMetadata(){return this._transport.getMetadata()}getMarkInfo(){return this._transport.getMarkInfo()}getData(){return this._transport.getData()}saveDocument(){return this._transport.saveDocument()}extractPages(t){return this._transport.extractPages(t)}getDownloadInfo(){return this._transport.downloadInfoCapability.promise}getRawData(t){return this._transport.getRawData(t)}cleanup(t=!1){return this._transport.startCleanup(t||this.isPureXfa)}destroy(){return this.loadingTask.destroy()}cachedPageNumber(t){return this._transport.cachedPageNumber(t)}get loadingParams(){return this._transport.loadingParams}get loadingTask(){return this._transport.loadingTask}getFieldObjects(){return this._transport.getFieldObjects()}hasJSActions(){return this._transport.hasJSActions()}getCalculationOrderIds(){return this._transport.getCalculationOrderIds()}}class PDFPageProxy{#Zn=!1;#tr=null;constructor(t,e,i,s,n=!1){this._pageIndex=t;this._pageInfo=e;this._transport=i;this._stats=n?new StatTimer:null;this._pdfBug=n;this.commonObjs=i.commonObjs;this.objs=new PDFObjects;this._intentStates=new Map;this.destroyed=!1;this.recordedBBoxes=null;this.#tr=s;this.imageCoordinates=null}clone(t){const e=new PDFPageProxy(t,this._pageInfo,this._transport,this.#tr,this._pdfBug);e.clonedFromIndex=this.clonedFromIndex??this._pageIndex;this._transport.updatePage(e);return e}get pageNumber(){return this._pageIndex+1}set pageNumber(t){this._pageIndex=t-1;this._transport.updatePage(this)}get rotate(){return this._pageInfo.rotate}get ref(){return this._pageInfo.ref}get userUnit(){return this._pageInfo.userUnit}get view(){return this._pageInfo.view}getViewport({scale:t,rotation:e=this.rotate,offsetX:i=0,offsetY:s=0,dontFlip:n=!1}={}){return new PageViewport({viewBox:this.view,userUnit:this.userUnit,scale:t,rotation:e,offsetX:i,offsetY:s,dontFlip:n})}getAnnotations({intent:t="display"}={}){const{renderingIntent:e}=this._transport.getRenderingIntent(t);return this._transport.getAnnotations(this._pageIndex,e)}getJSActions(){return this._transport.getPageJSActions(this._pageIndex)}get filterFactory(){return this._transport.filterFactory}get isPureXfa(){return shadow(this,"isPureXfa",!!this._transport._htmlForXfa)}async getXfa(){return this._transport._htmlForXfa?.children[this._pageIndex]||null}render({canvasContext:t,canvas:e=t.canvas,viewport:i,intent:s="display",annotationMode:n=p.ENABLE,transform:r=null,background:a=null,optionalContentConfigPromise:l=null,annotationCanvasMap:h=null,pageColors:d=null,printAnnotationStorage:c=null,isEditing:u=!1,recordImages:g=!1,recordOperations:m=!1,operationsFilter:f=null}){this._stats?.time("Overall");const b=this._transport.getRenderingIntent(s,n,c,u),{renderingIntent:y,cacheKey:A}=b;this.#Zn=!1;l||=this._transport.getOptionalContentConfig(y);const v=this._intentStates.getOrInsertComputed(A,makeObj);if(v.streamReaderCancelTimeout){clearTimeout(v.streamReaderCancelTimeout);v.streamReaderCancelTimeout=null}const w=!!(y&o);if(!v.displayReadyCapability){v.displayReadyCapability=Promise.withResolvers();v.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null};this._stats?.time("Page Request");this._pumpOperatorList(b)}const x=!(!this._pdfBug||!globalThis.StepperManager?.enabled),C=!!e&&!this.recordedBBoxes&&(m||x),E=!!e&&!this.imageCoordinates&&g,complete=t=>{v.renderTasks.delete(_);if(C){const t=_.gfx?.dependencyTracker.take();if(t){_.stepper?.setOperatorBBoxes(t,_.gfx.dependencyTracker.takeDebugMetadata());m&&(this.recordedBBoxes=t)}}E&&!t&&(this.imageCoordinates=_.gfx?.imagesTracker.take());w&&(this.#Zn=!0);this.#er();if(t){_.capability.reject(t);this._abortOperatorList({intentState:v,reason:t instanceof Error?t:new Error(t)})}else _.capability.resolve();if(this._stats){this._stats.timeEnd("Rendering");this._stats.timeEnd("Overall");globalThis.Stats?.enabled&&globalThis.Stats.add(this.pageNumber,this._stats)}};let T=null,S=null;(C||E)&&(S=new CanvasBBoxTracker(e,v.operatorList.length));C&&(T=new CanvasDependencyTracker(S,x));const _=new InternalRenderTask({callback:complete,params:{canvas:e,canvasContext:t,dependencyTracker:T??S,imagesTracker:E?new CanvasImagesTracker(e):null,viewport:i,transform:r,background:a},objs:this.objs,commonObjs:this.commonObjs,annotationCanvasMap:h,operatorList:v.operatorList,pageIndex:this._pageIndex,canvasFactory:this._transport.canvasFactory,filterFactory:this._transport.filterFactory,useRequestAnimationFrame:!w,pdfBug:this._pdfBug,pageColors:d,enableHWA:this._transport.enableHWA,operationsFilter:f});(v.renderTasks||=new Set).add(_);const P=_.task;Promise.all([v.displayReadyCapability.promise,l]).then(([t,e])=>{if(this.destroyed)complete();else{this._stats?.time("Rendering");if(!(e.renderingIntent&y))throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");_.initializeGraphics({transparency:t,optionalContentConfig:e});_.operatorListChanged()}}).catch(complete);return P}getOperatorList({intent:t="display",annotationMode:e=p.ENABLE,printAnnotationStorage:i=null,isEditing:s=!1}={}){const n=this._transport.getRenderingIntent(t,e,i,s,!0),r=this._intentStates.getOrInsertComputed(n.cacheKey,makeObj);let a;if(!r.opListReadCapability){a=Object.create(null);a.operatorListChanged=function operatorListChanged(){if(r.operatorList.lastChunk){r.opListReadCapability.resolve(r.operatorList);r.renderTasks.delete(a)}};r.opListReadCapability=Promise.withResolvers();(r.renderTasks||=new Set).add(a);r.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null};this._stats?.time("Page Request");this._pumpOperatorList(n)}return r.opListReadCapability.promise}streamTextContent({includeMarkedContent:t=!1,disableNormalization:e=!1}={}){return this._transport.messageHandler.sendWithStream("GetTextContent",{pageId:this.#tr.getPageId(this._pageIndex+1)-1,pageIndex:this._pageIndex,includeMarkedContent:!0===t,disableNormalization:!0===e},{highWaterMark:100,size:t=>t.items.length})}async getTextContent(t={}){if(this._transport._htmlForXfa)return this.getXfa().then(t=>XfaText.textContent(t));const e=this.streamTextContent(t),i={items:[],styles:Object.create(null),lang:null};for await(const t of e){i.lang??=t.lang;Object.assign(i.styles,t.styles);i.items.push(...t.items)}return i}getStructTree(){return this._transport.getStructTree(this._pageIndex)}_destroy(){this.destroyed=!0;const t=[];for(const e of this._intentStates.values()){this._abortOperatorList({intentState:e,reason:new Error("Page was destroyed."),force:!0});if(!e.opListReadCapability)for(const i of e.renderTasks){t.push(i.completed);i.cancel()}}this.objs.clear();this.#Zn=!1;return Promise.all(t)}cleanup(t=!1){this.#Zn=!0;const e=this.#er();t&&e&&(this._stats&&=new StatTimer);return e}#er(){if(!this.#Zn||this.destroyed)return!1;for(const{renderTasks:t,operatorList:e}of this._intentStates.values())if(t.size>0||!e.lastChunk)return!1;this._intentStates.clear();this.objs.clear();this.#Zn=!1;return!0}_startRenderPage(t,e){const i=this._intentStates.get(e);if(i){this._stats?.timeEnd("Page Request");i.displayReadyCapability?.resolve(t)}}_renderPageChunk(t,e){for(let i=0,s=t.length;i{a.read().then(({value:t,done:e})=>{if(e)o.streamReader=null;else if(!this._transport.destroyed){this._renderPageChunk(t,o);pump()}},t=>{o.streamReader=null;if(!this._transport.destroyed){if(o.operatorList){o.operatorList.lastChunk=!0;for(const t of o.renderTasks)t.operatorListChanged();this.#er()}if(o.displayReadyCapability)o.displayReadyCapability.reject(t);else{if(!o.opListReadCapability)throw t;o.opListReadCapability.reject(t)}}})};pump()}_abortOperatorList({intentState:t,reason:e,force:i=!1}){if(t.streamReader){if(t.streamReaderCancelTimeout){clearTimeout(t.streamReaderCancelTimeout);t.streamReaderCancelTimeout=null}if(!i){if(t.renderTasks.size>0)return;if(e instanceof RenderingCancelledException){let i=100;e.extraDelay>0&&e.extraDelay<1e3&&(i+=e.extraDelay);t.streamReaderCancelTimeout=setTimeout(()=>{t.streamReaderCancelTimeout=null;this._abortOperatorList({intentState:t,reason:e,force:!0})},i);return}}t.streamReader.cancel(new AbortException(e.message)).catch(()=>{});t.streamReader=null;if(!this._transport.destroyed){for(const[e,i]of this._intentStates)if(i===t){this._intentStates.delete(e);break}this.cleanup()}}}get stats(){return this._stats}}class PDFWorker{#xn=Promise.withResolvers();#ir=null;#tn=null;#sr=null;static#nr=0;static#rr=!1;static#ar=new WeakMap;static{if(t){this.#rr=!0;GlobalWorkerOptions.workerSrc||="./pdf.worker.mjs"}this._isSameOrigin=(t,e)=>{const i=URL.parse(t);if(!i?.origin||"null"===i.origin)return!1;const s=new URL(e,i);return i.origin===s.origin};this._createCDNWrapper=t=>{const e=`await import("${t}");`;return URL.createObjectURL(new Blob([e],{type:"text/javascript"}))}}constructor({name:t=null,port:e=null,verbosity:i=getVerbosityLevel()}={}){this.name=t;this.destroyed=!1;this.verbosity=i;if(e){if(PDFWorker.#ar.has(e))throw new Error("Cannot use more than one PDFWorker per port.");PDFWorker.#ar.set(e,this);this.#or(e)}else this.#lr()}get promise(){return this.#xn.promise}#hr(){this.#xn.resolve();this.#ir.send("configure",{verbosity:this.verbosity})}get port(){return this.#tn}get messageHandler(){return this.#ir}#or(t){this.#tn=t;this.#ir=new MessageHandler("main","worker",t);this.#ir.on("ready",()=>{});this.#hr()}#lr(){if(PDFWorker.#rr||PDFWorker.#dr){this.#cr();return}let{workerSrc:t}=PDFWorker;try{PDFWorker._isSameOrigin(window.location,t)||(t=PDFWorker._createCDNWrapper(new URL(t,window.location).href));const e=new Worker(t,{type:"module"}),i=new MessageHandler("main","worker",e),terminateEarly=()=>{s.abort();i.destroy();e.terminate();this.destroyed?this.#xn.reject(new Error("Worker was destroyed")):this.#cr()},s=new AbortController;e.addEventListener("error",()=>{this.#sr||terminateEarly()},{signal:s.signal});i.on("test",t=>{s.abort();if(!this.destroyed&&t){this.#ir=i;this.#tn=e;this.#sr=e;this.#hr()}else terminateEarly()});i.on("ready",t=>{s.abort();if(this.destroyed)terminateEarly();else try{sendTest()}catch{this.#cr()}});const sendTest=()=>{const t=new Uint8Array;i.send("test",t,[t.buffer])};sendTest();return}catch{info("The worker has been disabled.")}this.#cr()}#cr(){if(!PDFWorker.#rr){warn("Setting up fake worker.");PDFWorker.#rr=!0}PDFWorker._setupFakeWorkerGlobal.then(t=>{if(this.destroyed){this.#xn.reject(new Error("Worker was destroyed"));return}const e=new LoopbackPort;this.#tn=e;const i="fake"+PDFWorker.#nr++,s=new MessageHandler(i+"_worker",i,e);t.setup(s,e);this.#ir=new MessageHandler(i,i+"_worker",e);this.#hr()}).catch(t=>{this.#xn.reject(new Error(`Setting up fake worker failed: "${t.message}".`))})}destroy(){this.destroyed=!0;this.#sr?.terminate();this.#sr=null;PDFWorker.#ar.delete(this.#tn);this.#tn=null;this.#ir?.destroy();this.#ir=null}static create(t){const e=this.#ar.get(t?.port);if(e){if(e._pendingDestroy)throw new Error("PDFWorker.create - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");return e}return new PDFWorker(t)}static get workerSrc(){if(GlobalWorkerOptions.workerSrc)return GlobalWorkerOptions.workerSrc;throw new Error('No "GlobalWorkerOptions.workerSrc" specified.')}static get#dr(){try{return globalThis.pdfjsWorker?.WorkerMessageHandler||null}catch{return null}}static get _setupFakeWorkerGlobal(){return shadow(this,"_setupFakeWorkerGlobal",(async()=>{if(this.#dr)return this.#dr;return(await import( +/*webpackIgnore: true*/ +/*@vite-ignore*/ +this.workerSrc)).WorkerMessageHandler})())}}class WorkerTransport{downloadInfoCapability=Promise.withResolvers();#ur=null;#pr=new Map;#gr=null;#mr=new Map;#fr=new Map;#br=new Map;#yr=null;constructor(t,e,i,s,n,r){this.messageHandler=t;this.loadingTask=e;this.#gr=i;this.commonObjs=new PDFObjects;this.fontLoader=new FontLoader({ownerDocument:s.ownerDocument,styleElement:s.styleElement});this.enableHWA=s.enableHWA;this.loadingParams=s.loadingParams;this._params=s;this.canvasFactory=n.canvasFactory;this.filterFactory=n.filterFactory;this.binaryDataFactory=n.binaryDataFactory;this.pagesMapper=r;this.destroyed=!1;this.destroyCapability=null;this.setupMessageHandler()}updatePage(t){const{_pageIndex:e}=t;this.#mr.set(e,t);this.#fr.set(e,Promise.resolve(t))}#Ar(t,e=null){return this.#pr.getOrInsertComputed(t,()=>this.messageHandler.sendWithPromise(t,e))}#Ys({loaded:t,total:e}){this.loadingTask.onProgress?.({loaded:t,total:e,percent:e?MathClamp(Math.round(t/e*100),0,100):NaN})}get annotationStorage(){return shadow(this,"annotationStorage",new AnnotationStorage)}getRenderingIntent(t,e=p.ENABLE,i=null,s=!1,n=!1){let g=a,m=Y;switch(t){case"any":g=r;break;case"display":break;case"print":g=o;break;default:warn(`getRenderingIntent - invalid intent: ${t}`)}const f=g&o&&i instanceof PrintAnnotationStorage?i:this.annotationStorage;switch(e){case p.DISABLE:g+=d;break;case p.ENABLE:break;case p.ENABLE_FORMS:g+=l;break;case p.ENABLE_STORAGE:g+=h;m=f.serializable;break;default:warn(`getRenderingIntent - invalid annotationMode: ${e}`)}s&&(g+=c);n&&(g+=u);const{ids:b,hash:y}=f.modifiedIds;return{renderingIntent:g,cacheKey:[g,m.hash,y].join("_"),annotationStorageSerializable:m,modifiedIds:b}}destroy(){if(this.destroyCapability)return this.destroyCapability.promise;this.destroyed=!0;this.destroyCapability=Promise.withResolvers();this.#yr?.reject(new Error("Worker was destroyed during onPassword callback"));const t=[];for(const e of this.#mr.values())t.push(e._destroy());this.#mr.clear();this.#fr.clear();this.#br.clear();Object.hasOwn(this,"annotationStorage")&&this.annotationStorage.resetModified();const e=this.messageHandler.sendWithPromise("Terminate",null);t.push(e);Promise.all(t).then(()=>{this.commonObjs.clear();this.fontLoader.clear();this.#pr.clear();this.filterFactory.destroy();TextLayer.cleanup();this.#gr?.cancelAllRequests(new AbortException("Worker was terminated."));this.messageHandler?.destroy();this.messageHandler=null;this.destroyCapability.resolve()},this.destroyCapability.reject);return this.destroyCapability.promise}setupMessageHandler(){const{messageHandler:t,loadingTask:e}=this;t.on("GetReader",(t,e)=>{assert(this.#gr,"GetReader - no `BasePDFStream` instance available.");this.#ur=this.#gr.getFullReader();this.#ur.onProgress=t=>this.#Ys(t);e.onPull=()=>{this.#ur.read().then(function({value:t,done:i}){if(i)e.close();else{assert(t instanceof ArrayBuffer,"GetReader - expected an ArrayBuffer.");e.enqueue(new Uint8Array(t),1,[t])}}).catch(t=>{e.error(t)})};e.onCancel=t=>{this.#ur.cancel(t);e.ready.catch(t=>{if(!this.destroyed)throw t})}});t.on("ReaderHeadersReady",async t=>{await this.#ur.headersReady;const{isStreamingSupported:e,isRangeSupported:i,contentLength:s}=this.#ur;e&&i&&(this.#ur.onProgress=null);return{isStreamingSupported:e,isRangeSupported:i,contentLength:s}});t.on("GetRangeReader",(t,e)=>{assert(this.#gr,"GetRangeReader - no `BasePDFStream` instance available.");const i=this.#gr.getRangeReader(t.begin,t.end);if(i){e.onPull=()=>{i.read().then(function({value:t,done:i}){if(i)e.close();else{assert(t instanceof ArrayBuffer,"GetRangeReader - expected an ArrayBuffer.");e.enqueue(new Uint8Array(t),1,[t])}}).catch(t=>{e.error(t)})};e.onCancel=t=>{i.cancel(t);e.ready.catch(t=>{if(!this.destroyed)throw t})}}else e.close()});t.on("GetDoc",({pdfInfo:t})=>{this.pagesMapper.pagesNumber=t.numPages;this._numPages=t.numPages;this._htmlForXfa=t.htmlForXfa;delete t.htmlForXfa;e._capability.resolve(new PDFDocumentProxy(t,this))});t.on("DocException",t=>{e._capability.reject(wrapReason(t))});t.on("PasswordRequest",t=>{this.#yr=Promise.withResolvers();try{if(!e.onPassword)throw wrapReason(t);const updatePassword=t=>{t instanceof Error?this.#yr.reject(t):this.#yr.resolve({password:t})};e.onPassword(updatePassword,t.code)}catch(t){this.#yr.reject(t)}return this.#yr.promise});t.on("DataLoaded",t=>{this.#Ys({loaded:t.length,total:t.length});this.downloadInfoCapability.resolve(t)});t.on("StartRenderPage",t=>{if(this.destroyed)return;this.#mr.get(t.pageIndex)._startRenderPage(t.transparency,t.cacheKey)});t.on("commonobj",([e,i,s])=>{if(this.destroyed)return null;if(this.commonObjs.has(e))return null;switch(i){case"Font":if("error"in s){const t=s.error;warn(`Error during font loading: ${t}`);this.commonObjs.resolve(e,t);break}const n=new FontInfo(s),r=this._params.pdfBug&&globalThis.FontInspector?.enabled?(t,e)=>globalThis.FontInspector.fontAdded(t,e):null,a=new FontFaceObject(n,r,s.charProcOperatorList,s.extra);this.fontLoader.bind(a).catch(()=>t.sendWithPromise("FontFallback",{id:e})).finally(()=>{a.fontExtraProperties||a.clearData();this.commonObjs.resolve(e,a)});break;case"CopyLocalImage":const{imageRef:o}=s;assert(o,"The imageRef must be defined.");for(const t of this.#mr.values())for(const[,i]of t.objs){if(i?.ref!==o)continue;if(!i.dataLen)return null;const t=structuredClone(i);this.commonObjs.resolve(e,t);return i.dataLen}break;case"FontPath":this.commonObjs.resolve(e,new FontPathInfo(s));break;case"Image":this.commonObjs.resolve(e,s);break;case"Pattern":const l=new PatternInfo(s);this.commonObjs.resolve(e,l.getIR());break;default:throw new Error(`Got unknown common object type ${i}`)}return null});t.on("obj",([t,e,i,s])=>{if(this.destroyed)return;const n=this.#mr.get(e);if(!n.objs.has(t))if(0!==n._intentStates.size)switch(i){case"Image":case"Pattern":n.objs.resolve(t,s);break;default:throw new Error(`Got unknown object type ${i}`)}else s?.bitmap?.close()});t.on("DocProgress",t=>{this.destroyed||this.#Ys(t)});t.on("FetchBinaryData",async t=>{if(this.destroyed)throw new Error("Worker was destroyed.");if(!this.binaryDataFactory)throw new Error("`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter.");return this.binaryDataFactory.fetch(t)})}getData(){return this.messageHandler.sendWithPromise("GetData",null)}saveDocument(){this.annotationStorage.size<=0&&warn("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");const{map:t,transfer:e}=this.annotationStorage.serializable;return this.messageHandler.sendWithPromise("SaveDocument",{isPureXfa:!!this._htmlForXfa,numPages:this._numPages,annotationStorage:t,filename:this.#ur?.filename??null},e).finally(()=>{this.annotationStorage.resetModified()})}extractPages(t){const e={pageInfos:t};let i;if(this.annotationStorage.size>0){const{map:t,transfer:s}=this.annotationStorage.serializable;e.annotationStorage=t;i=s}return this.messageHandler.sendWithPromise("ExtractPages",e,i).finally(()=>{this.annotationStorage.resetModified()})}getPage(t){if(!Number.isInteger(t)||t<=0||t>this.pagesMapper.pagesNumber)return Promise.reject(new Error("Invalid page request."));const e=t-1,i=this.pagesMapper.getPageId(t)-1,s=this.#fr.get(e);if(s)return s;const n=this.messageHandler.sendWithPromise("GetPage",{pageIndex:i}).then(t=>{if(this.destroyed)throw new Error("Transport destroyed");t.refStr&&this.#br.set(t.refStr,i);const s=new PDFPageProxy(e,t,this,this.pagesMapper,this._params.pdfBug);this.#mr.set(e,s);return s});this.#fr.set(e,n);return n}async getPageIndex(t){if(!isRefProxy(t))throw new Error("Invalid pageIndex request.");const e=await this.messageHandler.sendWithPromise("GetPageIndex",{num:t.num,gen:t.gen}),i=this.pagesMapper.getPageNumber(e+1);if(0===i)throw new Error("GetPageIndex: page has been removed.");return i-1}getAnnotations(t,e){return this.messageHandler.sendWithPromise("GetAnnotations",{pageIndex:this.pagesMapper.getPageId(t+1)-1,intent:e})}getFieldObjects(){return this.#Ar("GetFieldObjects")}hasJSActions(){return this.#Ar("HasJSActions")}getCalculationOrderIds(){return this.messageHandler.sendWithPromise("GetCalculationOrderIds",null)}getDestinations(){return this.messageHandler.sendWithPromise("GetDestinations",null)}getDestination(t){return"string"!=typeof t?Promise.reject(new Error("Invalid destination request.")):this.messageHandler.sendWithPromise("GetDestination",{id:t})}getPageLabels(){return this.messageHandler.sendWithPromise("GetPageLabels",null)}getPageLayout(){return this.messageHandler.sendWithPromise("GetPageLayout",null)}getPageMode(){return this.messageHandler.sendWithPromise("GetPageMode",null)}getViewerPreferences(){return this.messageHandler.sendWithPromise("GetViewerPreferences",null)}getOpenAction(){return this.messageHandler.sendWithPromise("GetOpenAction",null)}getAttachments(){return this.messageHandler.sendWithPromise("GetAttachments",null)}getAnnotationsByType(t,e){return this.messageHandler.sendWithPromise("GetAnnotationsByType",{types:t,pageIndexesToSkip:e})}getDocJSActions(){return this.#Ar("GetDocJSActions")}getPageJSActions(t){return this.messageHandler.sendWithPromise("GetPageJSActions",{pageIndex:this.pagesMapper.getPageId(t+1)-1})}getStructTree(t){return this.messageHandler.sendWithPromise("GetStructTree",{pageIndex:this.pagesMapper.getPageId(t+1)-1})}getOutline(){return this.messageHandler.sendWithPromise("GetOutline",null)}getOptionalContentConfig(t){return this.#Ar("GetOptionalContentConfig").then(e=>new OptionalContentConfig(e,t))}getPermissions(){return this.messageHandler.sendWithPromise("GetPermissions",null)}getMetadata(){const t="GetMetadata";return this.#pr.getOrInsertComputed(t,()=>this.messageHandler.sendWithPromise(t,null).then(t=>({info:t[0],metadata:t[1]?new Metadata(t[1]):null,contentDispositionFilename:this.#ur?.filename??null,contentLength:this.#ur?.contentLength??null,hasStructTree:t[2]})))}getMarkInfo(){return this.messageHandler.sendWithPromise("GetMarkInfo",null)}getRawData(t){return this.messageHandler.sendWithPromise("GetRawData",t)}async startCleanup(t=!1){if(!this.destroyed){await this.messageHandler.sendWithPromise("Cleanup",null);for(const t of this.#mr.values()){if(!t.cleanup())throw new Error(`startCleanup: Page ${t.pageNumber} is currently rendering.`)}this.commonObjs.clear();t||this.fontLoader.clear();this.#pr.clear();this.filterFactory.destroy(!0);TextLayer.cleanup()}}cachedPageNumber(t){if(!isRefProxy(t))return null;const e=0===t.gen?`${t.num}R`:`${t.num}R${t.gen}`,i=this.#br.get(e);if(i>=0){const t=this.pagesMapper.getPageNumber(i+1);if(0!==t)return t}return null}}class RenderTask{_internalRenderTask=null;onContinue=null;onError=null;constructor(t){this._internalRenderTask=t}get promise(){return this._internalRenderTask.capability.promise}cancel(t=0){this._internalRenderTask.cancel(null,t)}get separateAnnots(){const{separateAnnots:t}=this._internalRenderTask.operatorList;if(!t)return!1;const{annotationCanvasMap:e}=this._internalRenderTask;return t.form||t.canvas&&e?.size>0}get imageCoordinates(){return this._internalRenderTask.imageCoordinates||null}}class InternalRenderTask{#vr=null;static#wr=new WeakSet;constructor({callback:t,params:e,objs:i,commonObjs:s,annotationCanvasMap:n,operatorList:r,pageIndex:a,canvasFactory:o,filterFactory:l,useRequestAnimationFrame:h=!1,pdfBug:d=!1,pageColors:c=null,enableHWA:u=!1,operationsFilter:p=null}){this.callback=t;this.params=e;this.objs=i;this.commonObjs=s;this.annotationCanvasMap=n;this.operatorListIdx=null;this.operatorList=r;this._pageIndex=a;this.canvasFactory=o;this.filterFactory=l;this._pdfBug=d;this.pageColors=c;this.running=!1;this.graphicsReadyCallback=null;this.graphicsReady=!1;this._useRequestAnimationFrame=!0===h&&"undefined"!=typeof window;this.cancelled=!1;this.capability=Promise.withResolvers();this.task=new RenderTask(this);this._cancelBound=this.cancel.bind(this);this._continueBound=this._continue.bind(this);this._scheduleNextBound=this._scheduleNext.bind(this);this._nextBound=this._next.bind(this);this._canvas=e.canvas;this._canvasContext=e.canvas?null:e.canvasContext;this._enableHWA=u;this._dependencyTracker=e.dependencyTracker;this._imagesTracker=e.imagesTracker;this._operationsFilter=p}get completed(){return this.capability.promise.catch(function(){})}initializeGraphics({transparency:t=!1,optionalContentConfig:e}){if(this.cancelled)return;if(this._canvas){if(InternalRenderTask.#wr.has(this._canvas))throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");InternalRenderTask.#wr.add(this._canvas)}if(this._pdfBug&&globalThis.StepperManager?.enabled){this.stepper=globalThis.StepperManager.create(this._pageIndex);this.stepper.init(this.operatorList);this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint()}const{viewport:i,transform:s,background:n,dependencyTracker:r,imagesTracker:a}=this.params,o=this._canvasContext||this._canvas.getContext("2d",{alpha:!1,willReadFrequently:!this._enableHWA});this.gfx=new CanvasGraphics(o,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:e},this.annotationCanvasMap,this.pageColors,r,a);this.gfx.beginDrawing({transform:s,viewport:i,transparency:t,background:n});this.operatorListIdx=0;this.graphicsReady=!0;this.graphicsReadyCallback?.()}cancel(t=null,e=0){this.running=!1;this.cancelled=!0;this.gfx?.endDrawing();if(this.#vr){window.cancelAnimationFrame(this.#vr);this.#vr=null}InternalRenderTask.#wr.delete(this._canvas);t||=new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex+1}`,e);this.callback(t);this.task.onError?.(t)}operatorListChanged(){if(this.graphicsReady){this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length);this.stepper?.updateOperatorList(this.operatorList);this.running||this._continue()}else this.graphicsReadyCallback||=this._continueBound}_continue(){this.running=!0;this.cancelled||(this.task.onContinue?this.task.onContinue(this._scheduleNextBound):this._scheduleNext())}_scheduleNext(){this._useRequestAnimationFrame?this.#vr=window.requestAnimationFrame(()=>{this.#vr=null;this._nextBound().catch(this._cancelBound)}):Promise.resolve().then(this._nextBound).catch(this._cancelBound)}async _next(){if(!this.cancelled){this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continueBound,this.stepper,this._operationsFilter);if(this.operatorListIdx===this.operatorList.argsArray.length){this.running=!1;if(this.operatorList.lastChunk){this.gfx.endDrawing();InternalRenderTask.#wr.delete(this._canvas);this.callback()}}}}}const Bt="5.7.284",Rt="7e5b36c2d";class ColorPicker{#xr=null;#Cr=null;#Er;#Tr=null;#Sr=!1;#_r=!1;#a=null;#Pr;#Dr=null;#y=null;static#Mr=null;static get _keyboardManager(){return shadow(this,"_keyboardManager",new KeyboardManager([[["Escape","mac+Escape"],ColorPicker.prototype._hideDropdownFromKeyboard],[[" ","mac+ "],ColorPicker.prototype._colorSelectFromKeyboard],[["ArrowDown","ArrowRight","mac+ArrowDown","mac+ArrowRight"],ColorPicker.prototype._moveToNext],[["ArrowUp","ArrowLeft","mac+ArrowUp","mac+ArrowLeft"],ColorPicker.prototype._moveToPrevious],[["Home","mac+Home"],ColorPicker.prototype._moveToBeginning],[["End","mac+End"],ColorPicker.prototype._moveToEnd]]))}constructor({editor:t=null,uiManager:e=null}){if(t){this.#_r=!1;this.#a=t}else this.#_r=!0;this.#y=t?._uiManager||e;this.#Pr=this.#y._eventBus;this.#Er=t?.color?.toUpperCase()||this.#y?.highlightColors.values().next().value||"#FFFF98";ColorPicker.#Mr||=Object.freeze({blue:"pdfjs-editor-colorpicker-blue",green:"pdfjs-editor-colorpicker-green",pink:"pdfjs-editor-colorpicker-pink",red:"pdfjs-editor-colorpicker-red",yellow:"pdfjs-editor-colorpicker-yellow"})}renderButton(){const t=this.#xr=document.createElement("button");t.className="colorPicker";t.tabIndex="0";t.setAttribute("data-l10n-id","pdfjs-editor-colorpicker-button");t.ariaHasPopup="true";this.#a&&(t.ariaControls=`${this.#a.id}_colorpicker_dropdown`);const e=this.#y._signal;t.addEventListener("click",this.#kr.bind(this),{signal:e});t.addEventListener("keydown",this.#Ir.bind(this),{signal:e});const i=this.#Cr=document.createElement("span");i.className="swatch";i.ariaHidden="true";i.style.backgroundColor=this.#Er;t.append(i);return t}renderMainDropdown(){const t=this.#Tr=this.#Fr();t.ariaOrientation="horizontal";t.ariaLabelledBy="highlightColorPickerLabel";return t}#Fr(){const t=document.createElement("div"),e=this.#y._signal;t.addEventListener("contextmenu",noContextMenu,{signal:e});t.className="dropdown";t.role="listbox";t.ariaMultiSelectable="false";t.ariaOrientation="vertical";t.setAttribute("data-l10n-id","pdfjs-editor-colorpicker-dropdown");this.#a&&(t.id=`${this.#a.id}_colorpicker_dropdown`);for(const[i,s]of this.#y.highlightColors){const n=document.createElement("button");n.tabIndex="0";n.role="option";n.setAttribute("data-color",s);n.title=i;n.setAttribute("data-l10n-id",ColorPicker.#Mr[i]);const r=document.createElement("span");n.append(r);r.className="swatch";r.style.backgroundColor=s;n.ariaSelected=s===this.#Er;n.addEventListener("click",this.#Br.bind(this,s),{signal:e});t.append(n)}t.addEventListener("keydown",this.#Ir.bind(this),{signal:e});return t}#Br(t,e){e.stopPropagation();this.#Pr.dispatch("switchannotationeditorparams",{source:this,type:f.HIGHLIGHT_COLOR,value:t});this.updateColor(t)}_colorSelectFromKeyboard(t){if(t.target===this.#xr){this.#kr(t);return}const e=t.target.getAttribute("data-color");e&&this.#Br(e,t)}_moveToNext(t){this.#Rr?t.target!==this.#xr?t.target.nextSibling?.focus():this.#Tr.firstElementChild?.focus():this.#kr(t)}_moveToPrevious(t){if(t.target!==this.#Tr?.firstElementChild&&t.target!==this.#xr){this.#Rr||this.#kr(t);t.target.previousSibling?.focus()}else this.#Rr&&this._hideDropdownFromKeyboard()}_moveToBeginning(t){this.#Rr?this.#Tr.firstElementChild?.focus():this.#kr(t)}_moveToEnd(t){this.#Rr?this.#Tr.lastElementChild?.focus():this.#kr(t)}#Ir(t){ColorPicker._keyboardManager.exec(this,t)}#kr(t){if(this.#Rr){this.hideDropdown();return}this.#Sr=0===t.detail;if(!this.#Dr){this.#Dr=new AbortController;window.addEventListener("pointerdown",this.#p.bind(this),{signal:this.#y.combinedSignal(this.#Dr)})}this.#xr.ariaExpanded="true";if(this.#Tr){this.#Tr.classList.remove("hidden");return}const e=this.#Tr=this.#Fr();this.#xr.append(e)}#p(t){this.#Tr?.contains(t.target)||this.hideDropdown()}hideDropdown(){this.#Tr?.classList.add("hidden");this.#xr.ariaExpanded="false";this.#Dr?.abort();this.#Dr=null}get#Rr(){return this.#Tr&&!this.#Tr.classList.contains("hidden")}_hideDropdownFromKeyboard(){if(!this.#_r)if(this.#Rr){this.hideDropdown();this.#xr.focus({preventScroll:!0,focusVisible:this.#Sr})}else this.#a?.unselect()}updateColor(t){this.#Cr&&(this.#Cr.style.backgroundColor=t);if(!this.#Tr)return;const e=this.#y.highlightColors.values();for(const i of this.#Tr.children)i.ariaSelected=e.next().value===t.toUpperCase()}destroy(){this.#xr?.remove();this.#xr=null;this.#Cr=null;this.#Tr?.remove();this.#Tr=null}}class BasicColorPicker{#Or=null;#Lr=!1;#a=null;#y=null;static#Mr=null;constructor(t){this.#a=t;this.#y=t._uiManager;BasicColorPicker.#Mr||=Object.freeze({freetext:"pdfjs-editor-color-picker-free-text-input",ink:"pdfjs-editor-color-picker-ink-input"})}renderButton(){if(this.#Or)return this.#Or;const{editorType:t,colorType:e,colorAndOpacityType:i,opacityType:s,color:n,opacity:r}=this.#a,a=this.#Lr=FeatureTest.isAlphaColorInputSupported&&void 0!==s,o=this.#Or=document.createElement("input");o.type="color";if(a){o.setAttribute("alpha","");const t=Util.hexNums[Math.round(255*(r??1))];o.value=(n||"#000000")+t}else o.value=n||"#000000";o.className="basicColorPicker";o.tabIndex=0;o.setAttribute("data-l10n-id",BasicColorPicker.#Mr[t]);o.addEventListener("input",()=>{if(a){const t=getRGBA(o.value);if(!t)return;const[n,r,a,l]=t,h=Util.makeHexColor(n,r,a);if(void 0!==i)this.#y.updateParams(i,{color:h,opacity:l});else{this.#y.updateParams(e,h);this.#y.updateParams(s,l)}}else this.#y.updateParams(e,o.value)},{signal:this.#y._signal});return o}update(t){if(this.#Or)if(this.#Lr){const e=Util.hexNums[Math.round(255*this.#a.opacity)];this.#Or.value=t+e}else this.#Or.value=t}updateOpacity(t){if(!this.#Or||!this.#Lr)return;const e=Util.hexNums[Math.round(255*t)];this.#Or.value=this.#a.color+e}destroy(){this.#Or?.remove();this.#Or=null}hideDropdown(){}}function makeColorComp(t){return Math.floor(255*MathClamp(t,0,1)).toString(16).padStart(2,"0")}function scaleAndClamp(t){return 255*MathClamp(t,0,1)}class ColorConverters{static CMYK_G([t,e,i,s]){return["G",1-Math.min(1,.3*t+.59*i+.11*e+s)]}static G_CMYK([t]){return["CMYK",0,0,0,1-t]}static G_RGB([t]){return["RGB",t,t,t]}static G_rgb([t]){return[t=scaleAndClamp(t),t,t]}static G_HTML([t]){const e=makeColorComp(t);return`#${e}${e}${e}`}static RGB_G([t,e,i]){return["G",.3*t+.59*e+.11*i]}static RGB_rgb(t){return t.map(scaleAndClamp)}static RGB_HTML(t){return`#${t.map(makeColorComp).join("")}`}static T_HTML(){return"#00000000"}static T_rgb(){return[null]}static CMYK_RGB([t,e,i,s]){return["RGB",1-Math.min(1,t+s),1-Math.min(1,i+s),1-Math.min(1,e+s)]}static CMYK_rgb([t,e,i,s]){return[scaleAndClamp(1-Math.min(1,t+s)),scaleAndClamp(1-Math.min(1,i+s)),scaleAndClamp(1-Math.min(1,e+s))]}static CMYK_HTML(t){const e=this.CMYK_RGB(t).slice(1);return this.RGB_HTML(e)}static RGB_CMYK([t,e,i]){const s=1-t,n=1-e,r=1-i;return["CMYK",s,n,r,Math.min(s,n,r)]}}class BaseSVGFactory{create(t,e,i=!1){if(t<=0||e<=0)throw new Error("Invalid SVG dimensions");const s=this._createSVG("svg:svg");s.setAttribute("version","1.1");if(!i){s.setAttribute("width",`${t}px`);s.setAttribute("height",`${e}px`)}s.setAttribute("preserveAspectRatio","none");s.setAttribute("viewBox",`0 0 ${t} ${e}`);return s}createElement(t){if("string"!=typeof t)throw new Error("Invalid SVG element type");return this._createSVG(t)}_createSVG(t){unreachable("Abstract method `_createSVG` called.")}}class DOMSVGFactory extends BaseSVGFactory{_createSVG(t){return document.createElementNS(V,t)}}const Ot=new WeakSet,Lt=60*(new Date).getTimezoneOffset()*1e3;class AnnotationElementFactory{static create(t){switch(t.data.annotationType){case T.LINK:return new LinkAnnotationElement(t);case T.TEXT:return new TextAnnotationElement(t);case T.WIDGET:switch(t.data.fieldType){case"Tx":return new TextWidgetAnnotationElement(t);case"Btn":return t.data.radioButton?new RadioButtonWidgetAnnotationElement(t):t.data.checkBox?new CheckboxWidgetAnnotationElement(t):new PushButtonWidgetAnnotationElement(t);case"Ch":return new ChoiceWidgetAnnotationElement(t);case"Sig":return new SignatureWidgetAnnotationElement(t)}return new WidgetAnnotationElement(t);case T.POPUP:return new PopupAnnotationElement(t);case T.FREETEXT:return new FreeTextAnnotationElement(t);case T.LINE:return new LineAnnotationElement(t);case T.SQUARE:return new SquareAnnotationElement(t);case T.CIRCLE:return new CircleAnnotationElement(t);case T.POLYLINE:return new PolylineAnnotationElement(t);case T.CARET:return new CaretAnnotationElement(t);case T.INK:return new InkAnnotationElement(t);case T.POLYGON:return new PolygonAnnotationElement(t);case T.HIGHLIGHT:return new HighlightAnnotationElement(t);case T.UNDERLINE:return new UnderlineAnnotationElement(t);case T.SQUIGGLY:return new SquigglyAnnotationElement(t);case T.STRIKEOUT:return new StrikeOutAnnotationElement(t);case T.STAMP:return new StampAnnotationElement(t);case T.FILEATTACHMENT:return new FileAttachmentAnnotationElement(t);default:return new AnnotationElement(t)}}}class AnnotationElement{#Nr=null;#Ur=!1;#Hr=null;constructor(t,{isRenderable:e=!1,ignoreBorder:i=!1,createQuadrilaterals:s=!1}={}){this.isRenderable=e;this.data=t.data;this.layer=t.layer;this.linkService=t.linkService;this.downloadManager=t.downloadManager;this.imageResourcesPath=t.imageResourcesPath;this.renderForms=t.renderForms;this.svgFactory=t.svgFactory;this.annotationStorage=t.annotationStorage;this.enableComment=t.enableComment;this.enableScripting=t.enableScripting;this.hasJSActions=t.hasJSActions;this._fieldObjects=t.fieldObjects;this.parent=t.parent;this.hasOwnCommentButton=!1;e&&(this.contentElement=this.container=this._createContainer(i));s&&this._createQuadrilaterals()}static _hasPopupData({contentsObj:t,richText:e}){return!(!t?.str&&!e?.str)}get _isEditable(){return this.data.isEditable}get hasPopupData(){return AnnotationElement._hasPopupData(this.data)||this.enableComment&&!!this.commentText}get commentData(){const{data:t}=this,e=this.annotationStorage?.getEditor(t.id);return e?e.getData():t}get hasCommentButton(){return this.enableComment&&this.hasPopupElement}get commentButtonPosition(){const t=this.annotationStorage?.getEditor(this.data.id);if(t)return t.commentButtonPositionInPage;const{quadPoints:e,inkLists:i,rect:s}=this.data;let n=-1/0,r=-1/0;if(e?.length>=8){for(let t=0;tr){r=e[t+1];n=e[t+2]}else e[t+1]===r&&(n=Math.max(n,e[t+2]));return[n,r]}if(i?.length>=1){for(const t of i)for(let e=0,i=t.length;er){r=t[e+1];n=t[e]}else t[e+1]===r&&(n=Math.max(n,t[e]));if(n!==1/0)return[n,r]}return s?[s[2],s[3]]:null}_normalizePoint(t){const{page:{view:e},viewport:{rawDims:{pageWidth:i,pageHeight:s,pageX:n,pageY:r}}}=this.parent;t[1]=e[3]-t[1]+e[1];t[0]=100*(t[0]-n)/i;t[1]=100*(t[1]-r)/s;return t}get commentText(){const{data:t}=this;return this.annotationStorage.getRawValue(`${g}${t.id}`)?.popup?.contents||t.contentsObj?.str||""}set commentText(t){const{data:e}=this,i={deleted:!t,contents:t||""};this.annotationStorage.updateEditor(e.id,{popup:i})||this.annotationStorage.setValue(`${g}${e.id}`,{id:e.id,annotationType:e.annotationType,page:this.parent.page,popup:i,popupRef:e.popupRef,modificationDate:new Date});t||this.removePopup()}removePopup(){(this.#Hr?.popup||this.popup)?.remove();this.#Hr=this.popup=null}updateEdited(t){if(!this.container)return;t.rect&&(this.#Nr||={rect:this.data.rect.slice(0)});const{rect:e,popup:i}=t;e&&this.#zr(e);let s=this.#Hr?.popup||this.popup;if(!s&&i?.text){this._createPopup(i);s=this.#Hr.popup}if(s){s.updateEdited(t);if(i?.deleted){s.remove();this.#Hr=null;this.popup=null}}}resetEdited(){if(this.#Nr){this.#zr(this.#Nr.rect);this.#Hr?.popup.resetEdited();this.#Nr=null}}#zr(t){const{container:{style:e},data:{rect:i,rotation:s},parent:{viewport:{rawDims:{pageWidth:n,pageHeight:r,pageX:a,pageY:o}}}}=this;i?.splice(0,4,...t);e.left=100*(t[0]-a)/n+"%";e.top=100*(r-t[3]+o)/r+"%";if(0===s){e.width=100*(t[2]-t[0])/n+"%";e.height=100*(t[3]-t[1])/r+"%"}else this.setRotation(s)}_createContainer(t){const{data:e,parent:{page:i,viewport:s}}=this,n=document.createElement("section");n.setAttribute("data-annotation-id",e.id);this instanceof WidgetAnnotationElement||this instanceof LinkAnnotationElement||(n.tabIndex=0);const{style:r}=n;r.zIndex=this.parent.zIndex;this.parent.zIndex+=2;e.alternativeText&&(n.title=e.alternativeText);e.noRotate&&n.classList.add("norotate");if(!e.rect||this instanceof PopupAnnotationElement){const{rotation:t}=e;e.hasOwnCanvas||0===t||this.setRotation(t,n);return n}const{width:a,height:o}=this;if(!t&&e.borderStyle.width>0){r.borderWidth=`${e.borderStyle.width}px`;const t=e.borderStyle.horizontalCornerRadius,i=e.borderStyle.verticalCornerRadius;if(t>0||i>0){const e=`calc(${t}px * var(--total-scale-factor)) / calc(${i}px * var(--total-scale-factor))`;r.borderRadius=e}else if(this instanceof RadioButtonWidgetAnnotationElement){const t=`calc(${a}px * var(--total-scale-factor)) / calc(${o}px * var(--total-scale-factor))`;r.borderRadius=t}switch(e.borderStyle.style){case S:r.borderStyle="solid";break;case _:r.borderStyle="dashed";break;case P:warn("Unimplemented border style: beveled");break;case D:warn("Unimplemented border style: inset");break;case M:r.borderBottomStyle="solid"}const s=e.borderColor||null;if(s){this.#Ur=!0;r.borderColor=Util.makeHexColor(...s)}else r.borderWidth=0}const l=Util.normalizeRect([e.rect[0],i.view[3]-e.rect[1]+i.view[1],e.rect[2],i.view[3]-e.rect[3]+i.view[1]]),{pageWidth:h,pageHeight:d,pageX:c,pageY:u}=s.rawDims;r.left=100*(l[0]-c)/h+"%";r.top=100*(l[1]-u)/d+"%";const{rotation:p}=e;if(e.hasOwnCanvas||0===p){r.width=100*a/h+"%";r.height=100*o/d+"%"}else this.setRotation(p,n);return n}setRotation(t,e=this.container){if(!this.data.rect)return;const{pageWidth:i,pageHeight:s}=this.parent.viewport.rawDims;let{width:n,height:r}=this;t%180!=0&&([n,r]=[r,n]);e.style.width=100*n/i+"%";e.style.height=100*r/s+"%";e.setAttribute("data-main-rotation",(360-t)%360)}get _commonActions(){const setColor=(t,e,i)=>{const s=i.detail[t],n=s[0],r=s.slice(1);i.target.style[e]=ColorConverters[`${n}_HTML`](r);this.annotationStorage.setValue(this.data.id,{[e]:ColorConverters[`${n}_rgb`](r)})};return shadow(this,"_commonActions",{display:t=>{const{display:e}=t.detail,i=e%2==1;this.container.style.visibility=i?"hidden":"visible";this.annotationStorage.setValue(this.data.id,{noView:i,noPrint:1===e||2===e})},print:t=>{this.annotationStorage.setValue(this.data.id,{noPrint:!t.detail.print})},hidden:t=>{const{hidden:e}=t.detail;this.container.style.visibility=e?"hidden":"visible";this.annotationStorage.setValue(this.data.id,{noPrint:e,noView:e})},focus:t=>{setTimeout(()=>t.target.focus({preventScroll:!1}),0)},userName:t=>{t.target.title=t.detail.userName},readonly:t=>{t.target.disabled=t.detail.readonly},required:t=>{this._setRequired(t.target,t.detail.required)},bgColor:t=>{setColor("bgColor","backgroundColor",t)},fillColor:t=>{setColor("fillColor","backgroundColor",t)},fgColor:t=>{setColor("fgColor","color",t)},textColor:t=>{setColor("textColor","color",t)},borderColor:t=>{setColor("borderColor","borderColor",t)},strokeColor:t=>{setColor("strokeColor","borderColor",t)},rotation:t=>{const e=t.detail.rotation;this.setRotation(e);this.annotationStorage.setValue(this.data.id,{rotation:e})}})}_dispatchEventFromSandbox(t,e){const i=this._commonActions;for(const s of Object.keys(e.detail)){const n=t[s]||i[s];n?.(e)}}_setDefaultPropertiesFromJS(t){if(!this.enableScripting)return;const e=this.annotationStorage.getRawValue(this.data.id);if(!e)return;const i=this._commonActions;for(const[s,n]of Object.entries(e)){const r=i[s];if(r){r({detail:{[s]:n},target:t});delete e[s]}}}_createQuadrilaterals(){if(!this.container)return;const{quadPoints:t}=this.data;if(!t)return;const[e,i,s,n]=this.data.rect.map(t=>Math.fround(t));if(8===t.length){const[r,a,o,l]=t.subarray(2,6);if(s===r&&n===a&&e===o&&i===l)return}const{style:r}=this.container;let a;if(this.#Ur){const{borderColor:t,borderWidth:e}=r;r.borderWidth=0;a=["url('data:image/svg+xml;utf8,",'',``];this.container.classList.add("hasBorder")}const o=s-e,l=n-i,{svgFactory:h}=this,d=h.createElement("svg");d.classList.add("quadrilateralsContainer");d.setAttribute("width",0);d.setAttribute("height",0);d.role="none";const c=h.createElement("defs");d.append(c);const u=h.createElement("clipPath"),p=`clippath_${this.data.id}`;u.setAttribute("id",p);u.setAttribute("clipPathUnits","objectBoundingBox");c.append(u);for(let i=2,s=t.length;i`)}if(this.#Ur){a.push("')");r.backgroundImage=a.join("")}this.container.append(d);this.container.style.clipPath=`url(#${p})`}_createPopup(t=null){const{data:e}=this;let i,s;if(t){i={str:t.text};s=t.date}else{i=e.contentsObj;s=e.modificationDate}this.#Hr=new PopupAnnotationElement({data:{color:e.color,titleObj:e.titleObj,modificationDate:s,contentsObj:i,richText:e.richText,parentRect:e.rect,borderStyle:0,id:`popup_${e.id}`,rotation:e.rotation,noRotate:!0},linkService:this.linkService,parent:this.parent,elements:[this]})}get hasPopupElement(){return!!(this.#Hr||this.popup||this.data.popupRef)}get extraPopupElement(){return this.#Hr}render(){unreachable("Abstract method `AnnotationElement.render` called")}_getElementsByName(t,e=null){const i=[];if(this._fieldObjects){const s=this._fieldObjects[t];if(s)for(const{page:t,id:n,exportValues:r}of s){if(-1===t)continue;if(n===e)continue;const s="string"==typeof r?r:null,a=document.querySelector(`[data-element-id="${n}"]`);!a||Ot.has(a)?i.push({id:n,exportValue:s,domElement:a}):warn(`_getElementsByName - element not allowed: ${n}`)}return i}for(const s of document.getElementsByName(t)){const{exportValue:t}=s,n=s.getAttribute("data-element-id");n!==e&&(Ot.has(s)&&i.push({id:n,exportValue:t,domElement:s}))}return i}show(){this.container&&(this.container.hidden=!1);this.popup?.maybeShow()}hide(){this.container&&(this.container.hidden=!0);this.popup?.forceHide()}getElementsToTriggerPopup(){return this.container}addHighlightArea(){const t=this.getElementsToTriggerPopup();if(Array.isArray(t))for(const e of t)e.classList.add("highlightArea");else t.classList.add("highlightArea")}_editOnDoubleClick(){if(!this._isEditable)return;const{annotationEditorType:t,data:{id:e}}=this;this.container.addEventListener("dblclick",()=>{this.linkService.eventBus?.dispatch("switchannotationeditormode",{source:this,mode:t,editId:e,mustEnterInEditMode:!0})})}get width(){return this.data.rect[2]-this.data.rect[0]}get height(){return this.data.rect[3]-this.data.rect[1]}}class EditorAnnotationElement extends AnnotationElement{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});this.editor=t.editor}render(){this.container.className="editorAnnotation";return this.container}createOrUpdatePopup(){const{editor:t}=this;t.hasComment&&this._createPopup(t.comment)}get hasCommentButton(){return this.enableComment&&this.editor.hasComment}get commentButtonPosition(){return this.editor.commentButtonPositionInPage}get commentText(){return this.editor.comment.text}set commentText(t){this.editor.comment=t;t||this.removePopup()}get commentData(){return this.editor.getData()}remove(){this.parent.removeAnnotation(this.data.id);this.container.remove();this.container=null;this.removePopup()}}class LinkAnnotationElement extends AnnotationElement{constructor(t,e=null){super(t,{isRenderable:!0,ignoreBorder:!!e?.ignoreBorder,createQuadrilaterals:!0});this.isTooltipOnly=t.data.isTooltipOnly}render(){const{data:t,linkService:e}=this,i=document.createElement("a");i.setAttribute("data-element-id",t.id);let s=!1;if(t.url){e.addLinkAttributes(i,t.url,t.newWindow);s=!0}else if(t.action){this._bindNamedAction(i,t.action,t.overlaidText);s=!0}else if(t.attachment){this.#Gr(i,t.attachment,t.overlaidText,t.attachmentDest);s=!0}else if(t.setOCGState){this.#Wr(i,t.setOCGState,t.overlaidText);s=!0}else if(t.dest){this._bindLink(i,t.dest,t.overlaidText);s=!0}else{if(t.actions&&(t.actions.Action||t.actions["Mouse Up"]||t.actions["Mouse Down"])&&this.enableScripting&&this.hasJSActions){this._bindJSAction(i,t);s=!0}if(t.resetForm){this._bindResetFormAction(i,t.resetForm);s=!0}else if(this.isTooltipOnly&&!s){this._bindLink(i,"");s=!0}}this.container.classList.add("linkAnnotation");if(s){this.contentElement=i;this.container.append(i)}return this.container}#Vr(){this.container.setAttribute("data-internal-link","")}_bindLink(t,e,i=""){t.href=this.linkService.getDestinationHash(e);t.onclick=()=>{e&&this.linkService.goToDestination(e);return!1};(e||""===e)&&this.#Vr();i&&(t.title=i)}_bindNamedAction(t,e,i=""){t.href=this.linkService.getAnchorUrl("");t.onclick=()=>{this.linkService.executeNamedAction(e);return!1};i&&(t.title=i);this.#Vr()}#Gr(t,e,i="",s=null){t.href=this.linkService.getAnchorUrl("");e.description?t.title=e.description:i&&(t.title=i);t.onclick=()=>{this.downloadManager?.openOrDownloadData(e.content,e.filename,s);return!1};this.#Vr()}#Wr(t,e,i=""){t.href=this.linkService.getAnchorUrl("");t.onclick=()=>{this.linkService.executeSetOCGState(e);return!1};i&&(t.title=i);this.#Vr()}_bindJSAction(t,e){t.href=this.linkService.getAnchorUrl("");const i=new Map([["Action","onclick"],["Mouse Up","onmouseup"],["Mouse Down","onmousedown"]]);for(const s of Object.keys(e.actions)){const n=i.get(s);n&&(t[n]=()=>{this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e.id,name:s}});return!1})}e.overlaidText&&(t.title=e.overlaidText);t.onclick||(t.onclick=()=>!1);this.#Vr()}_bindResetFormAction(t,e){const i=t.onclick;i||(t.href=this.linkService.getAnchorUrl(""));this.#Vr();if(this._fieldObjects)t.onclick=()=>{i?.();const{fields:t,refs:s,include:n}=e,r=[];if(0!==t.length||0!==s.length){const e=new Set(s);for(const i of t){const t=this._fieldObjects[i]||[];for(const{id:i}of t)e.add(i)}for(const t of Object.values(this._fieldObjects))for(const i of t)e.has(i.id)===n&&r.push(i)}else for(const t of Object.values(this._fieldObjects))r.push(...t);const a=this.annotationStorage,o=[];for(const t of r){const{id:e}=t;o.push(e);switch(t.type){case"text":{const i=t.defaultValue||"";a.setValue(e,{value:i});break}case"checkbox":case"radiobutton":{const i=t.defaultValue===t.exportValues;a.setValue(e,{value:i});break}case"combobox":case"listbox":{const i=t.defaultValue||"";a.setValue(e,{value:i});break}default:continue}const i=document.querySelector(`[data-element-id="${e}"]`);i&&(Ot.has(i)?i.dispatchEvent(new Event("resetform")):warn(`_bindResetFormAction - element not allowed: ${e}`))}this.enableScripting&&this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:"app",ids:o,name:"ResetForm"}});return!1};else{warn('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.');i||(t.onclick=()=>!1)}}}class TextAnnotationElement extends AnnotationElement{constructor(t){super(t,{isRenderable:!0})}render(){this.container.classList.add("textAnnotation");const t=document.createElement("img");t.src=this.imageResourcesPath+"annotation-"+this.data.name.toLowerCase()+".svg";t.setAttribute("data-l10n-id","pdfjs-text-annotation-type");t.setAttribute("data-l10n-args",JSON.stringify({type:this.data.name}));if(!this.data.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}this.container.append(t);return this.container}}class WidgetAnnotationElement extends AnnotationElement{render(){return this.container}showElementAndHideCanvas(t){if(this.data.hasOwnCanvas){"CANVAS"===t.previousSibling?.nodeName&&(t.previousSibling.hidden=!0);t.hidden=!1}}_getKeyModifier(t){return FeatureTest.platform.isMac?t.metaKey:t.ctrlKey}_setEventListener(t,e,i,s,n){i.includes("mouse")?t.addEventListener(i,t=>{this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:s,value:n(t),shift:t.shiftKey,modifier:this._getKeyModifier(t)}})}):t.addEventListener(i,t=>{if("blur"===i){if(!e.focused||!t.relatedTarget)return;e.focused=!1}else if("focus"===i){if(e.focused)return;e.focused=!0}n&&this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:s,value:n(t)}})})}_setEventListeners(t,e,i,s){for(const[n,r]of i)if("Action"===r||this.data.actions?.[r]){"Focus"!==r&&"Blur"!==r||(e||={focused:!1});this._setEventListener(t,e,n,r,s);"Focus"!==r||this.data.actions?.Blur?"Blur"!==r||this.data.actions?.Focus||this._setEventListener(t,e,"focus","Focus",null):this._setEventListener(t,e,"blur","Blur",null)}}_setBackgroundColor(t){const e=this.data.backgroundColor||null;t.style.backgroundColor=null===e?"transparent":Util.makeHexColor(...e)}_setTextStyle(t){const e=["left","center","right"],{fontColor:i}=this.data.defaultAppearanceData,s=this.data.defaultAppearanceData.fontSize||9,r=t.style;let a;const roundToOneDecimal=t=>Math.round(10*t)/10;if(this.data.multiLine){const t=Math.abs(this.data.rect[3]-this.data.rect[1]-2),e=t/(Math.round(t/(n*s))||1);a=Math.min(s,roundToOneDecimal(e/n))}else{const t=Math.abs(this.data.rect[3]-this.data.rect[1]-2);a=Math.min(s,roundToOneDecimal(t/n))}r.fontSize=`calc(${a}px * var(--total-scale-factor))`;r.color=Util.makeHexColor(...i);null!==this.data.textAlignment&&(r.textAlign=e[this.data.textAlignment])}_setRequired(t,e){e?t.setAttribute("required",!0):t.removeAttribute("required");t.setAttribute("aria-required",e)}}class TextWidgetAnnotationElement extends WidgetAnnotationElement{constructor(t){super(t,{isRenderable:t.renderForms||t.data.hasOwnCanvas||!t.data.hasAppearance&&!!t.data.fieldValue})}setPropertyOnSiblings(t,e,i,s){const n=this.annotationStorage;for(const r of this._getElementsByName(t.name,t.id)){r.domElement&&(r.domElement[e]=i);n.setValue(r.id,{[s]:i})}}render(){const t=this.annotationStorage,e=this.data.id;this.container.classList.add("textWidgetAnnotation");let i=null;if(this.renderForms){const s=t.getValue(e,{value:this.data.fieldValue});let n=s.value||"";const r=t.getValue(e,{charLimit:this.data.maxLen}).charLimit;r&&n.length>r&&(n=n.slice(0,r));let a=s.formattedValue||this.data.textContent?.join("\n")||null;a&&this.data.comb&&(a=a.replaceAll(/\s+/g,""));const o={userValue:n,formattedValue:a,lastCommittedValue:null,commitKey:1,focused:!1};if(this.data.multiLine){i=document.createElement("textarea");i.textContent=a??n;this.data.doNotScroll&&(i.style.overflowY="hidden")}else{i=document.createElement("input");i.type=this.data.password?"password":"text";i.setAttribute("value",a??n);this.data.doNotScroll&&(i.style.overflowX="hidden")}this.data.hasOwnCanvas&&(i.hidden=!0);Ot.add(i);this.contentElement=i;i.setAttribute("data-element-id",e);i.disabled=this.data.readOnly;i.name=this.data.fieldName;i.tabIndex=0;const{datetimeFormat:l,datetimeType:h,timeStep:d}=this.data,c=!!h&&this.enableScripting;l&&(i.title=l);this._setRequired(i,this.data.required);r&&(i.maxLength=r);i.addEventListener("input",s=>{t.setValue(e,{value:s.target.value});this.setPropertyOnSiblings(i,"value",s.target.value,"value");o.formattedValue=null});i.addEventListener("resetform",t=>{const e=this.data.defaultFieldValue??"";i.value=o.userValue=e;o.formattedValue=null});let blurListener=t=>{const{formattedValue:e}=o;null!=e&&(t.target.value=e);t.target.scrollLeft=0};if(this.enableScripting&&this.hasJSActions){i.addEventListener("focus",t=>{if(o.focused)return;const{target:e}=t;if(c){e.type=h;d&&(e.step=d)}if(o.userValue){const t=o.userValue;if(c)if("time"===h){const i=new Date(t),s=[i.getHours(),i.getMinutes(),i.getSeconds()];e.value=s.map(t=>t.toString().padStart(2,"0")).join(":")}else e.value=new Date(t-Lt).toISOString().split("date"===h?"T":".",1)[0];else e.value=t}o.lastCommittedValue=e.value;o.commitKey=1;this.data.actions?.Focus||(o.focused=!0)});i.addEventListener("updatefromsandbox",i=>{this.showElementAndHideCanvas(i.target);const s={value(i){o.userValue=i.detail.value??"";c||t.setValue(e,{value:o.userValue.toString()});i.target.value=o.userValue},formattedValue(i){const{formattedValue:s}=i.detail;o.formattedValue=s;null!=s&&i.target!==document.activeElement&&(i.target.value=s);const n={formattedValue:s};c&&(n.value=s);t.setValue(e,n)},selRange(t){t.target.setSelectionRange(...t.detail.selRange)},charLimit:i=>{const{charLimit:s}=i.detail,{target:n}=i;if(0===s){n.removeAttribute("maxLength");return}n.setAttribute("maxLength",s);let r=o.userValue;if(r&&!(r.length<=s)){r=r.slice(0,s);n.value=o.userValue=r;t.setValue(e,{value:r});this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e,name:"Keystroke",value:r,willCommit:!0,commitKey:1,selStart:n.selectionStart,selEnd:n.selectionEnd}})}}};this._dispatchEventFromSandbox(s,i)});i.addEventListener("keydown",t=>{o.commitKey=1;let i=-1;"Escape"===t.key?i=0:"Enter"!==t.key||this.data.multiLine?"Tab"===t.key&&(o.commitKey=3):i=2;if(-1===i)return;const{value:s}=t.target;if(o.lastCommittedValue!==s){o.lastCommittedValue=s;o.userValue=s;this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e,name:"Keystroke",value:s,willCommit:!0,commitKey:i,selStart:t.target.selectionStart,selEnd:t.target.selectionEnd}})}});const s=blurListener;blurListener=null;i.addEventListener("blur",t=>{if(!o.focused||!t.relatedTarget)return;this.data.actions?.Blur||(o.focused=!1);const{target:i}=t;let{value:n}=i;if(c){if(n&&"time"===h){const t=n.split(":").map(t=>parseInt(t,10));n=new Date(2e3,0,1,t[0],t[1],t[2]||0).valueOf();i.step=""}else{n.includes("T")||(n=`${n}T00:00`);n=new Date(n).valueOf()}i.type="text"}o.userValue=n;o.lastCommittedValue!==n&&this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e,name:"Keystroke",value:n,willCommit:!0,commitKey:o.commitKey,selStart:t.target.selectionStart,selEnd:t.target.selectionEnd}});s(t)});this.data.actions?.Keystroke&&i.addEventListener("beforeinput",t=>{o.lastCommittedValue=null;const{data:i,target:s}=t,{value:n,selectionStart:r,selectionEnd:a}=s;let l=r,h=a;switch(t.inputType){case"deleteWordBackward":{const t=n.substring(0,r).match(/\w*[^\w]*$/);t&&(l-=t[0].length);break}case"deleteWordForward":{const t=n.substring(r).match(/^[^\w]*\w*/);t&&(h+=t[0].length);break}case"deleteContentBackward":r===a&&(l-=1);break;case"deleteContentForward":r===a&&(h+=1)}t.preventDefault();this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e,name:"Keystroke",value:n,change:i||"",willCommit:!1,selStart:l,selEnd:h}})});this._setEventListeners(i,o,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],t=>t.target.value)}blurListener&&i.addEventListener("blur",blurListener);if(this.data.comb){const t=(this.data.rect[2]-this.data.rect[0])/r;i.classList.add("comb");i.style.letterSpacing=`calc(${t}px * var(--total-scale-factor) - 1ch)`}}else{i=document.createElement("div");i.textContent=this.data.fieldValue;i.style.verticalAlign="middle";i.style.display="table-cell";this.data.hasOwnCanvas&&(i.hidden=!0)}this._setTextStyle(i);this._setBackgroundColor(i);this._setDefaultPropertiesFromJS(i);this.container.append(i);return this.container}}class SignatureWidgetAnnotationElement extends WidgetAnnotationElement{constructor(t){super(t,{isRenderable:!!t.data.hasOwnCanvas})}}class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement{constructor(t){super(t,{isRenderable:t.renderForms})}render(){const t=this.annotationStorage,e=this.data,i=e.id;let s=t.getValue(i,{value:e.exportValue===e.fieldValue}).value;if("string"==typeof s){s="Off"!==s;t.setValue(i,{value:s})}this.container.classList.add("buttonWidgetAnnotation","checkBox");const n=document.createElement("input");Ot.add(n);n.setAttribute("data-element-id",i);n.disabled=e.readOnly;this._setRequired(n,this.data.required);n.type="checkbox";n.name=e.fieldName;s&&n.setAttribute("checked",!0);n.setAttribute("exportValue",e.exportValue);n.tabIndex=0;n.addEventListener("change",s=>{const{name:n,checked:r}=s.target;for(const s of this._getElementsByName(n,i)){const i=r&&s.exportValue===e.exportValue;s.domElement&&(s.domElement.checked=i);t.setValue(s.id,{value:i})}t.setValue(i,{value:r})});n.addEventListener("resetform",t=>{const i=e.defaultFieldValue||"Off";t.target.checked=i===e.exportValue});if(this.enableScripting&&this.hasJSActions){n.addEventListener("updatefromsandbox",e=>{const s={value(e){e.target.checked="Off"!==e.detail.value;t.setValue(i,{value:e.target.checked})}};this._dispatchEventFromSandbox(s,e)});this._setEventListeners(n,null,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],t=>t.target.checked)}this._setBackgroundColor(n);this._setDefaultPropertiesFromJS(n);this.container.append(n);return this.container}}class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement{constructor(t){super(t,{isRenderable:t.renderForms})}render(){this.container.classList.add("buttonWidgetAnnotation","radioButton");const t=this.annotationStorage,e=this.data,i=e.id;let s=t.getValue(i,{value:e.fieldValue===e.buttonValue}).value;if("string"==typeof s){s=s!==e.buttonValue;t.setValue(i,{value:s})}if(s)for(const s of this._getElementsByName(e.fieldName,i))t.setValue(s.id,{value:!1});const n=document.createElement("input");Ot.add(n);n.setAttribute("data-element-id",i);n.disabled=e.readOnly;this._setRequired(n,this.data.required);n.type="radio";n.name=e.fieldName;s&&n.setAttribute("checked",!0);n.tabIndex=0;n.addEventListener("change",e=>{const{name:s,checked:n}=e.target;for(const e of this._getElementsByName(s,i))t.setValue(e.id,{value:!1});t.setValue(i,{value:n})});n.addEventListener("resetform",t=>{const i=e.defaultFieldValue;t.target.checked=null!=i&&i===e.buttonValue});if(this.enableScripting&&this.hasJSActions){const s=e.buttonValue;n.addEventListener("updatefromsandbox",e=>{const n={value:e=>{const n=s===e.detail.value;for(const s of this._getElementsByName(e.target.name)){const e=n&&s.id===i;s.domElement&&(s.domElement.checked=e);t.setValue(s.id,{value:e})}}};this._dispatchEventFromSandbox(n,e)});this._setEventListeners(n,null,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],t=>t.target.checked)}this._setBackgroundColor(n);this._setDefaultPropertiesFromJS(n);this.container.append(n);return this.container}}class PushButtonWidgetAnnotationElement extends LinkAnnotationElement{constructor(t){super(t,{ignoreBorder:t.data.hasAppearance})}render(){const t=super.render();t.classList.add("buttonWidgetAnnotation","pushButton");const e=t.lastChild;if(this.enableScripting&&this.hasJSActions&&e){this._setDefaultPropertiesFromJS(e);e.addEventListener("updatefromsandbox",t=>{this._dispatchEventFromSandbox({},t)})}return t}}class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement{constructor(t){super(t,{isRenderable:t.renderForms})}render(){this.container.classList.add("choiceWidgetAnnotation");const t=this.annotationStorage,e=this.data.id,i=t.getValue(e,{value:this.data.fieldValue}),s=document.createElement("select");Ot.add(s);s.setAttribute("data-element-id",e);s.disabled=this.data.readOnly;this._setRequired(s,this.data.required);s.name=this.data.fieldName;s.tabIndex=0;let n=this.data.combo&&this.data.options.length>0;if(!this.data.combo){s.size=this.data.options.length;this.data.multiSelect&&(s.multiple=!0)}s.addEventListener("resetform",t=>{const e=this.data.defaultFieldValue;for(const t of s.options)t.selected=t.value===e});const fixDisplayValue=(t,e)=>{const i=e.replaceAll(" "," ");t.textContent=i;i!==e&&t.setAttribute("display-value",e)};for(const t of this.data.options){const e=document.createElement("option");fixDisplayValue(e,t.displayValue);e.value=t.exportValue;if(i.value.includes(t.exportValue)){e.setAttribute("selected",!0);n=!1}s.append(e)}let r=null;if(n){const t=document.createElement("option");t.value=" ";t.setAttribute("hidden",!0);t.setAttribute("selected",!0);s.prepend(t);r=()=>{t.remove();s.removeEventListener("input",r);r=null};s.addEventListener("input",r)}const getValue=t=>{const e=t?"value":"textContent",{options:i,multiple:n}=s;return n?Array.prototype.filter.call(i,t=>t.selected).map(t=>t[e]):-1===i.selectedIndex?null:i[i.selectedIndex][e]};let a=getValue(!1);const getItems=t=>{const e=t.target.options;return Array.prototype.map.call(e,t=>({displayValue:t.getAttribute("display-value")||t.textContent,exportValue:t.value}))};if(this.enableScripting&&this.hasJSActions){s.addEventListener("updatefromsandbox",i=>{const n={value(i){r?.();const n=i.detail.value,o=new Set(Array.isArray(n)?n:[n]);for(const t of s.options)t.selected=o.has(t.value);t.setValue(e,{value:getValue(!0)});a=getValue(!1)},multipleSelection(t){s.multiple=!0},remove(i){const n=s.options,r=i.detail.remove;n[r].selected=!1;s.remove(r);if(n.length>0){-1===Array.prototype.findIndex.call(n,t=>t.selected)&&(n[0].selected=!0)}t.setValue(e,{value:getValue(!0),items:getItems(i)});a=getValue(!1)},clear(i){for(;0!==s.length;)s.remove(0);t.setValue(e,{value:null,items:[]});a=getValue(!1)},insert(i){const{index:n,displayValue:r,exportValue:o}=i.detail.insert,l=s.children[n],h=document.createElement("option");fixDisplayValue(h,r);h.value=o;l?l.before(h):s.append(h);t.setValue(e,{value:getValue(!0),items:getItems(i)});a=getValue(!1)},items(i){const{items:n}=i.detail;for(;0!==s.length;)s.remove(0);for(const t of n){const{displayValue:e,exportValue:i}=t,n=document.createElement("option");fixDisplayValue(n,e);n.value=i;s.append(n)}s.options.length>0&&(s.options[0].selected=!0);t.setValue(e,{value:getValue(!0),items:getItems(i)});a=getValue(!1)},indices(i){const s=new Set(i.detail.indices);for(const t of i.target.options)t.selected=s.has(t.index);t.setValue(e,{value:getValue(!0)});a=getValue(!1)},editable(t){t.target.disabled=!t.detail.editable}};this._dispatchEventFromSandbox(n,i)});s.addEventListener("input",i=>{const s=getValue(!0),n=getValue(!1);t.setValue(e,{value:s});i.preventDefault();this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:e,name:"Keystroke",value:a,change:n,changeEx:s,willCommit:!1,commitKey:1,keyDown:!1}})});this._setEventListeners(s,null,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"],["input","Action"],["input","Validate"]],t=>t.target.value)}else s.addEventListener("input",function(i){t.setValue(e,{value:getValue(!0)})});this.data.combo&&this._setTextStyle(s);this._setBackgroundColor(s);this._setDefaultPropertiesFromJS(s);this.container.append(s);return this.container}}class PopupAnnotationElement extends AnnotationElement{constructor(t){const{data:e,elements:i,parent:s}=t,n=!!s._commentManager;super(t,{isRenderable:!n&&AnnotationElement._hasPopupData(e)});this.elements=i;if(n&&AnnotationElement._hasPopupData(e)){const t=this.popup=this.#jr();for(const e of i)e.popup=t}else this.popup=null}#jr(){return new PopupElement({container:this.container,color:this.data.color,titleObj:this.data.titleObj,modificationDate:this.data.modificationDate||this.data.creationDate,contentsObj:this.data.contentsObj,richText:this.data.richText,rect:this.data.rect,parentRect:this.data.parentRect||null,parent:this.parent,elements:this.elements,open:this.data.open,commentManager:this.parent._commentManager})}render(){const{container:t}=this;t.classList.add("popupAnnotation");t.role="comment";const e=this.popup=this.#jr(),i=[];for(const t of this.elements){t.popup=e;t.container.ariaHasPopup="dialog";i.push(t.data.id);t.addHighlightArea()}this.container.setAttribute("aria-controls",i.map(t=>`${W}${t}`).join(","));return this.container}}class PopupElement{#j=null;#$r=this.#Ir.bind(this);#Xr=this.#qr.bind(this);#Kr=this.#Yr.bind(this);#Qr=this.#Jr.bind(this);#Zr=null;#_t=null;#ta=null;#ea=null;#ia=null;#sa=null;#na=null;#ra=!1;#aa=null;#oa=null;#F=null;#la=null;#ha=null;#ve=null;#da=null;#fe=null;#ca=null;#Nr=null;#ua=!1;#pa=null;#ga=null;constructor({container:t,color:e,elements:i,titleObj:s,modificationDate:n,contentsObj:r,richText:a,parent:o,rect:l,parentRect:h,open:d,commentManager:c=null}){this.#_t=t;this.#ca=s;this.#ta=r;this.#fe=a;this.#sa=o;this.#Zr=e;this.#da=l;this.#na=h;this.#ia=i;this.#j=c;this.#pa=i[0];this.#ea=PDFDateString.toDateObject(n);this.trigger=i.flatMap(t=>t.getElementsToTriggerPopup());if(!c){this.#ma();this.#_t.hidden=!0;d&&this.#Jr()}}#ma(){if(this.#oa)return;this.#oa=new AbortController;const{signal:t}=this.#oa;for(const e of this.trigger){e.addEventListener("click",this.#Qr,{signal:t});e.addEventListener("pointerenter",this.#Kr,{signal:t});e.addEventListener("pointerleave",this.#Xr,{signal:t});e.classList.add("popupTriggerArea")}for(const e of this.#ia)e.container?.addEventListener("keydown",this.#$r,{signal:t})}#fa(){const t=this.#ia.find(t=>t.hasCommentButton);t&&(this.#ha=t._normalizePoint(t.commentButtonPosition))}renderCommentButton(){if(this.#la){this.#la.parentNode||this.#pa.container.after(this.#la);return}this.#ha||this.#fa();if(!this.#ha)return;const{signal:t}=this.#oa=new AbortController,e=this.#pa.hasOwnCommentButton,togglePopup=()=>{this.#j.toggleCommentPopup(this,!0,void 0,!e)},showPopup=()=>{this.#j.toggleCommentPopup(this,!1,!0,!e)},hidePopup=()=>{this.#j.toggleCommentPopup(this,!1,!1)};if(e){this.#la=this.#pa.container;for(const e of this.trigger){e.ariaHasPopup="dialog";e.ariaControls="commentPopup";e.addEventListener("keydown",this.#$r,{signal:t});e.addEventListener("click",togglePopup,{signal:t});e.addEventListener("pointerenter",showPopup,{signal:t});e.addEventListener("pointerleave",hidePopup,{signal:t});e.classList.add("popupTriggerArea")}}else{const e=this.#la=document.createElement("button");e.className="annotationCommentButton";const i=this.#pa.container;e.style.zIndex=parseInt(i.style.zIndex,10)+1;e.tabIndex=0;e.ariaHasPopup="dialog";e.ariaControls="commentPopup";e.setAttribute("data-l10n-id","pdfjs-show-comment-button");this.#ba();this.#ya();e.addEventListener("keydown",this.#$r,{signal:t});e.addEventListener("click",togglePopup,{signal:t});e.addEventListener("pointerenter",showPopup,{signal:t});e.addEventListener("pointerleave",hidePopup,{signal:t});i.after(e)}}#ya(){if(this.#pa.extraPopupElement&&!this.#pa.editor)return;this.#la||this.renderCommentButton();const[t,e]=this.#ha,{style:i}=this.#la;i.left=`calc(${t}%)`;i.top=`calc(${e}% - var(--comment-button-dim))`}#ba(){if(!this.#pa.extraPopupElement){this.#la||this.renderCommentButton();this.#la.style.backgroundColor=this.commentButtonColor||""}}get commentButtonColor(){const{color:t,opacity:e}=this.#pa.commentData;return t?this.#sa._commentManager.makeCommentColor(t,e):null}focusCommentButton(){setTimeout(()=>{this.#la?.focus()},0)}getData(){const{richText:t,color:e,opacity:i,creationDate:s,modificationDate:n}=this.#pa.commentData;return{contentsObj:{str:this.comment},richText:t,color:e,opacity:i,creationDate:s,modificationDate:n}}get elementBeforePopup(){return this.#la}get comment(){this.#ga||=this.#pa.commentText;return this.#ga}set comment(t){t!==this.comment&&(this.#pa.commentText=this.#ga=t)}focus(){this.#pa.container?.focus()}get parentBoundingClientRect(){return this.#pa.layer.getBoundingClientRect()}setCommentButtonStates({selected:t,hasPopup:e}){if(this.#la){this.#la.classList.toggle("selected",t);this.#la.ariaExpanded=e}}setSelectedCommentButton(t){this.#la.classList.toggle("selected",t)}get commentPopupPosition(){if(this.#ve)return this.#ve;const{x:t,y:e,height:i}=this.#la.getBoundingClientRect(),{x:s,y:n,width:r,height:a}=this.#pa.layer.getBoundingClientRect();return[(t-s)/r,(e+i-n)/a]}set commentPopupPosition(t){this.#ve=t}hasDefaultPopupPosition(){return null===this.#ve}get commentButtonPosition(){return this.#ha}get commentButtonWidth(){return this.#la.getBoundingClientRect().width/this.parentBoundingClientRect.width}editComment(t){const[e,i]=this.#ve||this.commentButtonPosition.map(t=>t/100),s=this.parentBoundingClientRect,{x:n,y:r,width:a,height:o}=s;this.#j.showDialog(null,this,n+e*a,r+i*o,{...t,parentDimensions:s})}render(){if(this.#aa)return;const t=this.#aa=document.createElement("div");t.className="popup";if(this.#Zr){const e=t.style.outlineColor=Util.makeHexColor(...this.#Zr);t.style.backgroundColor=`color-mix(in srgb, ${e} 30%, white)`}const e=document.createElement("span");e.className="header";if(this.#ca?.str){const t=document.createElement("span");t.className="title";e.append(t);({dir:t.dir,str:t.textContent}=this.#ca)}t.append(e);if(this.#ea){const t=document.createElement("time");t.className="popupDate";t.setAttribute("data-l10n-id","pdfjs-annotation-date-time-string");t.setAttribute("data-l10n-args",JSON.stringify({dateObj:this.#ea.valueOf()}));t.dateTime=this.#ea.toISOString();e.append(t)}renderRichText({html:this.#Aa||this.#ta.str,dir:this.#ta?.dir,className:"popupContent"},t);this.#_t.append(t)}get#Aa(){const t=this.#fe,e=this.#ta;return!t?.str||e?.str&&e.str!==t.str?null:this.#fe.html||null}get#va(){return this.#Aa?.attributes?.style?.fontSize||0}get#wa(){return this.#Aa?.attributes?.style?.color||null}#xa(t){const e=[],i={str:t,html:{name:"div",attributes:{dir:"auto"},children:[{name:"p",children:e}]}},s={style:{color:this.#wa,fontSize:this.#va?`calc(${this.#va}px * var(--total-scale-factor))`:""}};for(const i of t.split("\n"))e.push({name:"span",value:i,attributes:s});return i}#Ir(t){t.altKey||t.shiftKey||t.ctrlKey||t.metaKey||("Enter"===t.key||"Escape"===t.key&&this.#ra)&&this.#Jr()}updateEdited({rect:t,popup:e,deleted:i}){if(this.#j){if(i){this.remove();this.#ga=null}else if(e)if(e.deleted)this.remove();else{this.#ba();this.#ga=e.text}if(t){this.#ha=null;this.#fa();this.#ya()}}else if(i||e?.deleted)this.remove();else{this.#ma();this.#Nr||={contentsObj:this.#ta,richText:this.#fe};t&&(this.#F=null);if(e&&e.text){this.#fe=this.#xa(e.text);this.#ea=PDFDateString.toDateObject(e.date);this.#ta=null}this.#aa?.remove();this.#aa=null}}resetEdited(){if(this.#Nr){({contentsObj:this.#ta,richText:this.#fe}=this.#Nr);this.#Nr=null;this.#aa?.remove();this.#aa=null;this.#F=null}}remove(){this.#oa?.abort();this.#oa=null;this.#aa?.remove();this.#aa=null;this.#ua=!1;this.#ra=!1;this.#la?.remove();this.#la=null;if(this.trigger)for(const t of this.trigger)t.classList.remove("popupTriggerArea")}#Ca(){if(null!==this.#F)return;const{page:{view:t},viewport:{rawDims:{pageWidth:e,pageHeight:i,pageX:s,pageY:n}}}=this.#sa;let r=!!this.#na,a=r?this.#na:this.#da;for(const t of this.#ia)if(!a||null!==Util.intersect(t.data.rect,a)){a=t.data.rect;r=!0;break}const o=Util.normalizeRect([a[0],t[3]-a[1]+t[1],a[2],t[3]-a[3]+t[1]]),l=r?a[2]-a[0]+5:0,h=o[0]+l,d=o[1];this.#F=[100*(h-s)/e,100*(d-n)/i];const{style:c}=this.#_t;c.left=`${this.#F[0]}%`;c.top=`${this.#F[1]}%`}#Jr(){if(this.#j)this.#j.toggleCommentPopup(this,!1);else{this.#ra=!this.#ra;if(this.#ra){this.#Yr();this.#_t.addEventListener("click",this.#Qr);this.#_t.addEventListener("keydown",this.#$r)}else{this.#qr();this.#_t.removeEventListener("click",this.#Qr);this.#_t.removeEventListener("keydown",this.#$r)}}}#Yr(){this.#aa||this.render();if(this.isVisible)this.#ra&&this.#_t.classList.add("focused");else{this.#Ca();this.#_t.hidden=!1;this.#_t.style.zIndex=parseInt(this.#_t.style.zIndex,10)+1e3}}#qr(){this.#_t.classList.remove("focused");if(!this.#ra&&this.isVisible){this.#_t.hidden=!0;this.#_t.style.zIndex=parseInt(this.#_t.style.zIndex,10)-1e3}}forceHide(){this.#ua=this.isVisible;this.#ua&&(this.#_t.hidden=!0)}maybeShow(){if(!this.#j){this.#ma();if(this.#ua){this.#aa||this.#Yr();this.#ua=!1;this.#_t.hidden=!1}}}get isVisible(){return!this.#j&&!1===this.#_t.hidden}}class FreeTextAnnotationElement extends AnnotationElement{constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});this.textContent=t.data.textContent;this.textPosition=t.data.textPosition;this.annotationEditorType=m.FREETEXT}render(){this.container.classList.add("freeTextAnnotation");if(this.textContent){const t=this.contentElement=document.createElement("div");t.classList.add("annotationTextContent");t.setAttribute("role","comment");for(const e of this.textContent){const i=document.createElement("span");i.textContent=e;t.append(i)}this.container.append(t)}if(!this.data.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}this._editOnDoubleClick();return this.container}}class LineAnnotationElement extends AnnotationElement{#Ea=null;constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0})}render(){this.container.classList.add("lineAnnotation");const{data:t,width:e,height:i}=this,s=this.svgFactory.create(e,i,!0),n=this.#Ea=this.svgFactory.createElement("svg:line");n.setAttribute("x1",t.rect[2]-t.lineCoordinates[0]);n.setAttribute("y1",t.rect[3]-t.lineCoordinates[1]);n.setAttribute("x2",t.rect[2]-t.lineCoordinates[2]);n.setAttribute("y2",t.rect[3]-t.lineCoordinates[3]);n.setAttribute("stroke-width",t.borderStyle.width||1);n.setAttribute("stroke","transparent");n.setAttribute("fill","transparent");s.append(n);this.container.append(s);if(!t.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}return this.container}getElementsToTriggerPopup(){return this.#Ea}addHighlightArea(){this.container.classList.add("highlightArea")}}class SquareAnnotationElement extends AnnotationElement{#Ta=null;constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0})}render(){this.container.classList.add("squareAnnotation");const{data:t,width:e,height:i}=this,s=this.svgFactory.create(e,i,!0),n=t.borderStyle.width,r=this.#Ta=this.svgFactory.createElement("svg:rect");r.setAttribute("x",n/2);r.setAttribute("y",n/2);r.setAttribute("width",e-n);r.setAttribute("height",i-n);r.setAttribute("stroke-width",n||1);r.setAttribute("stroke","transparent");r.setAttribute("fill","transparent");s.append(r);this.container.append(s);if(!t.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}return this.container}getElementsToTriggerPopup(){return this.#Ta}addHighlightArea(){this.container.classList.add("highlightArea")}}class CircleAnnotationElement extends AnnotationElement{#Sa=null;constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0})}render(){this.container.classList.add("circleAnnotation");const{data:t,width:e,height:i}=this,s=this.svgFactory.create(e,i,!0),n=t.borderStyle.width,r=this.#Sa=this.svgFactory.createElement("svg:ellipse");r.setAttribute("cx",e/2);r.setAttribute("cy",i/2);r.setAttribute("rx",e/2-n/2);r.setAttribute("ry",i/2-n/2);r.setAttribute("stroke-width",n||1);r.setAttribute("stroke","transparent");r.setAttribute("fill","transparent");s.append(r);this.container.append(s);if(!t.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}return this.container}getElementsToTriggerPopup(){return this.#Sa}addHighlightArea(){this.container.classList.add("highlightArea")}}class PolylineAnnotationElement extends AnnotationElement{#_a=null;constructor(t){super(t,{isRenderable:!0,ignoreBorder:!0});this.containerClassName="polylineAnnotation";this.svgElementName="svg:polyline"}render(){this.container.classList.add(this.containerClassName);const{data:{rect:t,vertices:e,borderStyle:i,popupRef:s},width:n,height:r}=this;if(!e)return this.container;const a=this.svgFactory.create(n,r,!0);let o=[];for(let i=0,s=e.length;i=0&&n.setAttribute("stroke-width",e||1);if(i)for(let t=0,e=this.#Da.length;t{"Enter"===t.key&&(s?t.metaKey:t.ctrlKey)&&this.#Ia()});if(!e.popupRef&&this.hasPopupData){this.hasOwnCommentButton=!0;this._createPopup()}else i.classList.add("popupTriggerArea");t.append(i);return t}getElementsToTriggerPopup(){return this.#ka}addHighlightArea(){this.container.classList.add("highlightArea")}#Ia(){this.downloadManager?.openOrDownloadData(this.content,this.filename)}}class AnnotationLayer{#Fa=null;#Ba=null;#G=null;#Ra=new Map;#Oa=null;#La=null;#ia=[];#Na=!1;zIndex=0;constructor({div:t,accessibilityManager:e,annotationCanvasMap:i,annotationEditorUIManager:s,page:n,viewport:r,structTreeLayer:a,commentManager:o,linkService:l,annotationStorage:h}){this.div=t;this.#Fa=e;this.#Ba=i;this.#Oa=a||null;this.#La=l||null;this.#G=h||new AnnotationStorage;this.page=n;this.viewport=r;this._annotationEditorUIManager=s;this._commentManager=o||null}hasEditableAnnotations(){return this.#Ra.size>0}async render(t){const{annotations:e}=t,i=this.div;setLayerDimensions(i,this.viewport);const s=new Map,n=[],r={data:null,layer:i,linkService:this.#La,downloadManager:t.downloadManager,imageResourcesPath:t.imageResourcesPath||"",renderForms:!1!==t.renderForms,svgFactory:new DOMSVGFactory,annotationStorage:this.#G,enableComment:!0===t.enableComment,enableScripting:!0===t.enableScripting,hasJSActions:t.hasJSActions,fieldObjects:t.fieldObjects,parent:this,elements:null};for(const t of e){if(t.noHTML)continue;const e=t.annotationType===T.POPUP;if(e){const e=s.get(t.id);if(!e)continue;if(!this._commentManager){n.push(t);continue}r.elements=e}else if(t.rect[2]===t.rect[0]||t.rect[3]===t.rect[1])continue;r.data=t;const i=AnnotationElementFactory.create(r);if(!i.isRenderable)continue;if(!e){this.#ia.push(i);t.popupRef&&s.getOrInsertComputed(t.popupRef,makeArr).push(i)}const a=i.render();t.hidden&&(a.style.visibility="hidden");if(i._isEditable){this.#Ra.set(i.data.id,i);this._annotationEditorUIManager?.renderAnnotationElement(i)}}await this.#Ua();for(const t of n){const e=r.elements=s.get(t.id);r.data=t;const i=AnnotationElementFactory.create(r);if(!i.isRenderable)continue;const n=i.render();i.contentElement.id=`${W}${t.id}`;t.hidden&&(n.style.visibility="hidden");e.at(-1).container.after(n)}this.#Ha()}async#Ua(){if(0===this.#ia.length)return;this.div.replaceChildren();const t=[];if(!this.#Na){this.#Na=!0;for(const{contentElement:e,data:{id:i}}of this.#ia){const s=e.id=`${W}${i}`;t.push(this.#Oa?.getAriaAttributes(s).then(t=>{if(t)for(const[i,s]of t)e.setAttribute(i,s)}))}}this.#ia.sort(({data:{rect:[t,e,i,s]}},{data:{rect:[n,r,a,o]}})=>{if(t===i&&e===s)return 1;if(n===a&&r===o)return-1;const l=(e+s)/2,h=(r+o)/2;if(l>=o&&h<=e)return-1;if(h>=s&&l<=r)return 1;return(t+i)/2-(n+a)/2});const e=document.createDocumentFragment();for(const t of this.#ia){e.append(t.container);this._commentManager?(t.extraPopupElement?.popup||t.popup)?.renderCommentButton():t.extraPopupElement&&e.append(t.extraPopupElement.render())}this.div.append(e);await Promise.all(t);if(this.#Fa)for(const t of this.#ia)this.#Fa.addPointerInTextLayer(t.contentElement,!1)}async addLinkAnnotations(t){const e={data:null,layer:this.div,linkService:this.#La,svgFactory:new DOMSVGFactory,parent:this};for(const i of t){i.borderStyle||=AnnotationLayer._defaultBorderStyle;e.data=i;const t=AnnotationElementFactory.create(e);if(t.isRenderable){t.render();t.contentElement.id=`${W}${i.id}`;this.#ia.push(t)}}await this.#Ua()}update({viewport:t}){const e=this.div;this.viewport=t;setLayerDimensions(e,{rotation:t.rotation});this.#Ha();e.hidden=!1}#Ha(){if(!this.#Ba)return;const t=this.div;for(const[e,i]of this.#Ba){const s=t.querySelector(`[data-annotation-id="${e}"]`);if(!s)continue;i.className="annotationContent";const{firstChild:n}=s;n?"CANVAS"===n.nodeName?n.replaceWith(i):n.classList.contains("annotationContent")?n.after(i):n.before(i):s.append(i);const r=this.#Ra.get(e);if(r)if(r._hasNoCanvas){this._annotationEditorUIManager?.setMissingCanvas(e,s.id,i);r._hasNoCanvas=!1}else r.canvas=i}this.#Ba.clear()}getEditableAnnotations(){return this.#Ra.values()}getEditableAnnotation(t){return this.#Ra.get(t)}addFakeAnnotation(t){const{div:e}=this,{id:i,rotation:s}=t,n=new EditorAnnotationElement({data:{id:i,rect:t.getPDFRect(),rotation:s},editor:t,layer:e,parent:this,enableComment:!!this._commentManager,linkService:this.#La,annotationStorage:this.#G});n.render();n.contentElement.id=`${W}${i}`;n.createOrUpdatePopup();this.#ia.push(n);return n}removeAnnotation(t){const e=this.#ia.findIndex(e=>e.data.id===t);if(e<0)return;const[i]=this.#ia.splice(e,1);this.#Fa?.removePointerInTextLayer(i.contentElement)}updateFakeAnnotations(t){if(0!==t.length){for(const e of t)e.updateFakeAnnotationElement(this);this.#Ua()}}togglePointerEvents(t=!1){this.div.classList.toggle("disabled",!t)}static get _defaultBorderStyle(){return shadow(this,"_defaultBorderStyle",Object.freeze({width:1,rawWidth:1,style:S,dashArray:[3],horizontalCornerRadius:0,verticalCornerRadius:0}))}}const Nt=/\r\n?|\n/g;class FreeTextEditor extends AnnotationEditor{#za="";#Ga=`${this.id}-editor`;#Wa=null;#va;_colorPicker=null;static _freeTextDefaultContent="";static _internalPadding=0;static _defaultColor=null;static _defaultFontSize=10;static get _keyboardManager(){const t=FreeTextEditor.prototype,arrowChecker=t=>t.isEmpty(),e=AnnotationEditorUIManager.TRANSLATE_SMALL,i=AnnotationEditorUIManager.TRANSLATE_BIG;return shadow(this,"_keyboardManager",new KeyboardManager([[["ctrl+s","mac+meta+s","ctrl+p","mac+meta+p"],t.commitOrRemove,{bubbles:!0}],[["ctrl+Enter","mac+meta+Enter","Escape","mac+Escape"],t.commitOrRemove],[["ArrowLeft","mac+ArrowLeft"],t._translateEmpty,{args:[-e,0],checker:arrowChecker}],[["ctrl+ArrowLeft","mac+shift+ArrowLeft"],t._translateEmpty,{args:[-i,0],checker:arrowChecker}],[["ArrowRight","mac+ArrowRight"],t._translateEmpty,{args:[e,0],checker:arrowChecker}],[["ctrl+ArrowRight","mac+shift+ArrowRight"],t._translateEmpty,{args:[i,0],checker:arrowChecker}],[["ArrowUp","mac+ArrowUp"],t._translateEmpty,{args:[0,-e],checker:arrowChecker}],[["ctrl+ArrowUp","mac+shift+ArrowUp"],t._translateEmpty,{args:[0,-i],checker:arrowChecker}],[["ArrowDown","mac+ArrowDown"],t._translateEmpty,{args:[0,e],checker:arrowChecker}],[["ctrl+ArrowDown","mac+shift+ArrowDown"],t._translateEmpty,{args:[0,i],checker:arrowChecker}]]))}static _type="freetext";static _editorType=m.FREETEXT;constructor(t){super({...t,name:"freeTextEditor"});this.color=t.color||FreeTextEditor._defaultColor||AnnotationEditor._defaultLineColor;this.#va=t.fontSize||FreeTextEditor._defaultFontSize;this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-freetext-added-alert");this.canAddComment=!1}static initialize(t,e){AnnotationEditor.initialize(t,e);const i=getComputedStyle(document.documentElement);this._internalPadding=parseFloat(i.getPropertyValue("--freetext-padding"))}static updateDefaultParams(t,e){switch(t){case f.FREETEXT_SIZE:FreeTextEditor._defaultFontSize=e;break;case f.FREETEXT_COLOR:FreeTextEditor._defaultColor=e}}updateParams(t,e){switch(t){case f.FREETEXT_SIZE:this.#Va(e);break;case f.FREETEXT_COLOR:this.#ba(e)}}static get defaultPropertiesToUpdate(){return[[f.FREETEXT_SIZE,FreeTextEditor._defaultFontSize],[f.FREETEXT_COLOR,FreeTextEditor._defaultColor||AnnotationEditor._defaultLineColor]]}get propertiesToUpdate(){return[[f.FREETEXT_SIZE,this.#va],[f.FREETEXT_COLOR,this.color]]}get toolbarButtons(){this._colorPicker||=new BasicColorPicker(this);return[["colorPicker",this._colorPicker]]}get colorType(){return f.FREETEXT_COLOR}#Va(t){const setFontsize=t=>{this.editorDiv.style.fontSize=`calc(${t}px * var(--total-scale-factor))`;this.translate(0,-(t-this.#va)*this.parentScale);this.#va=t;this.#ja()},e=this.#va;this.addCommands({cmd:setFontsize.bind(this,t),undo:setFontsize.bind(this,e),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:f.FREETEXT_SIZE,overwriteIfSameType:!0,keepUndo:!0})}onUpdatedColor(){this.editorDiv.style.color=this.color;this._colorPicker?.update(this.color);super.onUpdatedColor()}#ba(t){const setColor=t=>{this.color=t;this.onUpdatedColor()},e=this.color;this.addCommands({cmd:setColor.bind(this,t),undo:setColor.bind(this,e),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:f.FREETEXT_COLOR,overwriteIfSameType:!0,keepUndo:!0})}_translateEmpty(t,e){this._uiManager.translateSelectedEditors(t,e,!0)}getInitialTranslation(){const t=this.parentScale;return[-FreeTextEditor._internalPadding*t,-(FreeTextEditor._internalPadding+this.#va)*t]}rebuild(){if(this.parent){super.rebuild();null!==this.div&&(this.isAttachedToDOM||this.parent.add(this))}}enableEditMode(){if(!super.enableEditMode())return!1;this.overlayDiv.classList.remove("enabled");this.editorDiv.contentEditable=!0;this._isDraggable=!1;this.div.removeAttribute("aria-activedescendant");this.#Wa=new AbortController;const t=this._uiManager.combinedSignal(this.#Wa);this.editorDiv.addEventListener("keydown",this.editorDivKeydown.bind(this),{signal:t});this.editorDiv.addEventListener("focus",this.editorDivFocus.bind(this),{signal:t});this.editorDiv.addEventListener("blur",this.editorDivBlur.bind(this),{signal:t});this.editorDiv.addEventListener("input",this.editorDivInput.bind(this),{signal:t});this.editorDiv.addEventListener("paste",this.editorDivPaste.bind(this),{signal:t});return!0}disableEditMode(){if(!super.disableEditMode())return!1;this.overlayDiv.classList.add("enabled");this.editorDiv.contentEditable=!1;this.div.setAttribute("aria-activedescendant",this.#Ga);this._isDraggable=!0;this.#Wa?.abort();this.#Wa=null;this.div.focus({preventScroll:!0});this.isEditing=!1;this.parent.div.classList.add("freetextEditing");return!0}focusin(t){if(this._focusEventsAllowed){super.focusin(t);t.target!==this.editorDiv&&this.editorDiv.focus()}}onceAdded(t){if(!this.width){this.enableEditMode();t&&this.editorDiv.focus();this._initialOptions?.isCentered&&this.center();this._initialOptions=null}}isEmpty(){return!this.editorDiv||""===this.editorDiv.innerText.trim()}remove(){this.isEditing=!1;if(this.parent){this.parent.setEditingState(!0);this.parent.div.classList.add("freetextEditing")}super.remove()}#$a(){const t=[];this.editorDiv.normalize();let e=null;for(const i of this.editorDiv.childNodes)if(e?.nodeType!==Node.TEXT_NODE||"BR"!==i.nodeName){t.push(FreeTextEditor.#Xa(i));e=i}return t.join("\n")}#ja(){const[t,e]=this.parentDimensions;let i;if(this.isAttachedToDOM)i=this.div.getBoundingClientRect();else{const{currentLayer:t,div:e}=this,s=e.style.display,n=e.classList.contains("hidden");e.classList.remove("hidden");e.style.display="hidden";t.div.append(this.div);i=e.getBoundingClientRect();e.remove();e.style.display=s;e.classList.toggle("hidden",n)}if(this.rotation%180==this.parentRotation%180){this.width=i.width/t;this.height=i.height/e}else{this.width=i.height/t;this.height=i.width/e}this.fixAndSetPosition()}commit(){if(!this.isInEditMode())return;super.commit();this.disableEditMode();const t=this.#za,e=this.#za=this.#$a().trimEnd();if(t===e)return;const setText=t=>{this.#za=t;if(t){this.#qa();this._uiManager.rebuild(this);this.#ja()}else this.remove()};this.addCommands({cmd:()=>{setText(e)},undo:()=>{setText(t)},mustExec:!1});this.#ja()}shouldGetKeyboardEvents(){return this.isInEditMode()}enterInEditMode(){this.enableEditMode();this.editorDiv.focus()}keydown(t){if(t.target===this.div&&"Enter"===t.key){this.enterInEditMode();t.preventDefault()}}editorDivKeydown(t){FreeTextEditor._keyboardManager.exec(this,t)}editorDivFocus(t){this.isEditing=!0}editorDivBlur(t){this.isEditing=!1}editorDivInput(t){this.parent.div.classList.toggle("freetextEditing",this.isEmpty())}disableEditing(){this.editorDiv.setAttribute("role","comment");this.editorDiv.removeAttribute("aria-multiline")}enableEditing(){this.editorDiv.setAttribute("role","textbox");this.editorDiv.setAttribute("aria-multiline",!0)}get canChangeContent(){return!0}render(){if(this.div)return this.div;let t,e;if(this._isCopy||this.annotationElementId){t=this.x;e=this.y}super.render();this.editorDiv=document.createElement("div");this.editorDiv.className="internal";this.editorDiv.setAttribute("id",this.#Ga);this.editorDiv.setAttribute("data-l10n-id","pdfjs-free-text2");this.editorDiv.setAttribute("data-l10n-attrs","default-content");this.enableEditing();this.editorDiv.contentEditable=!0;const{style:i}=this.editorDiv;i.fontSize=`calc(${this.#va}px * var(--total-scale-factor))`;i.color=this.color;this.div.append(this.editorDiv);this.overlayDiv=document.createElement("div");this.overlayDiv.classList.add("overlay","enabled");this.div.append(this.overlayDiv);if(this._isCopy||this.annotationElementId){const[i,s]=this.parentDimensions;if(this.annotationElementId){const{position:n}=this._initialData;let[r,a]=this.getInitialTranslation();[r,a]=this.pageTranslationToScreen(r,a);const[o,l]=this.pageDimensions,[h,d]=this.pageTranslation;let c,u;switch(this.rotation){case 0:c=t+(n[0]-h)/o;u=e+this.height-(n[1]-d)/l;break;case 90:c=t+(n[0]-h)/o;u=e-(n[1]-d)/l;[r,a]=[a,-r];break;case 180:c=t-this.width+(n[0]-h)/o;u=e-(n[1]-d)/l;[r,a]=[-r,-a];break;case 270:c=t+(n[0]-h-this.height*l)/o;u=e+(n[1]-d-this.width*o)/l;[r,a]=[-a,r]}this.setAt(c*i,u*s,r,a)}else this._moveAfterPaste(t,e);this.#qa();this._isDraggable=!0;this.editorDiv.contentEditable=!1}else{this._isDraggable=!1;this.editorDiv.contentEditable=!0}return this.div}static#Xa(t){return(t.nodeType===Node.TEXT_NODE?t.nodeValue:t.innerText).replaceAll(Nt,"")}editorDivPaste(t){const e=t.clipboardData||window.clipboardData,{types:i}=e;if(1===i.length&&"text/plain"===i[0])return;t.preventDefault();const s=FreeTextEditor.#Ka(e.getData("text")||"").replaceAll(Nt,"\n");if(!s)return;const n=window.getSelection();if(!n.rangeCount)return;this.editorDiv.normalize();n.deleteFromDocument();const r=n.getRangeAt(0);if(!s.includes("\n")){r.insertNode(document.createTextNode(s));this.editorDiv.normalize();n.collapseToStart();return}const{startContainer:a,startOffset:o}=r,l=[],h=[];if(a.nodeType===Node.TEXT_NODE){const t=a.parentElement;h.push(a.nodeValue.slice(o).replaceAll(Nt,""));if(t!==this.editorDiv){let e=l;for(const i of this.editorDiv.childNodes)i!==t?e.push(FreeTextEditor.#Xa(i)):e=h}l.push(a.nodeValue.slice(0,o).replaceAll(Nt,""))}else if(a===this.editorDiv){let t=l,e=0;for(const i of this.editorDiv.childNodes){e++===o&&(t=h);t.push(FreeTextEditor.#Xa(i))}}this.#za=`${l.join("\n")}${s}${h.join("\n")}`;this.#qa();const d=new Range;let c=Math.sumPrecise(l.map(t=>t.length));for(const{firstChild:t}of this.editorDiv.childNodes)if(t.nodeType===Node.TEXT_NODE){const e=t.nodeValue.length;if(c<=e){d.setStart(t,c);d.setEnd(t,c);break}c-=e}n.removeAllRanges();n.addRange(d)}#qa(){this.editorDiv.replaceChildren();if(this.#za)for(const t of this.#za.split("\n")){const e=document.createElement("div");e.append(t?document.createTextNode(t):document.createElement("br"));this.editorDiv.append(e)}}#Ya(){return this.#za.replaceAll(" "," ")}static#Ka(t){return t.replaceAll(" "," ")}get contentDiv(){return this.editorDiv}getPDFRect(){const t=FreeTextEditor._internalPadding*this.parentScale;return this.getRect(t,t)}static async deserialize(t,e,i){let s=null;if(t instanceof FreeTextAnnotationElement){const{data:{defaultAppearanceData:{fontSize:e,fontColor:i},rect:n,rotation:r,id:a,popupRef:o,richText:l,contentsObj:h,creationDate:d,modificationDate:c},textContent:u,textPosition:p,parent:{page:{pageNumber:g}}}=t;if(!u||0===u.length)return null;s=t={annotationType:m.FREETEXT,color:Array.from(i),fontSize:e,value:u.join("\n"),position:p,pageIndex:g-1,rect:n.slice(0),rotation:r,annotationElementId:a,id:a,deleted:!1,popupRef:o,comment:h?.str||null,richText:l,creationDate:d,modificationDate:c}}const n=await super.deserialize(t,e,i);n.#va=t.fontSize;n.color=Util.makeHexColor(...t.color);n.#za=FreeTextEditor.#Ka(t.value);n._initialData=s;t.comment&&n.setCommentData(t);return n}serialize(t=!1){if(this.isEmpty())return null;if(this.deleted)return this.serializeDeleted();const e=AnnotationEditor._colorManager.convert(this.isAttachedToDOM?getComputedStyle(this.editorDiv).color:this.color),i=Object.assign(super.serialize(t),{color:e,fontSize:this.#va,value:this.#Ya()});this.addComment(i);if(t){i.isCopy=!0;return i}if(this.annotationElementId&&!this.#Qa(i))return null;i.id=this.annotationElementId;return i}#Qa(t){const{value:e,fontSize:i,color:s,pageIndex:n}=this._initialData;return this.hasEditedComment||this._hasBeenMoved||t.value!==e||t.fontSize!==i||t.color.some((t,e)=>t!==s[e])||t.pageIndex!==n}renderAnnotationElement(t){const e=super.renderAnnotationElement(t);if(!e)return null;const{style:i}=e;i.fontSize=`calc(${this.#va}px * var(--total-scale-factor))`;i.color=this.color;e.replaceChildren();for(const t of this.#za.split("\n")){const i=document.createElement("div");i.append(t?document.createTextNode(t):document.createElement("br"));e.append(i)}t.updateEdited({rect:this.getPDFRect(),popup:this._uiManager.hasCommentManager()||this.hasEditedComment?this.comment:{text:this.#za}});return e}resetAnnotationElement(t){super.resetAnnotationElement(t);t.resetEdited()}}class Outline{static PRECISION=1e-4;toSVGPath(){unreachable("Abstract method `toSVGPath` must be implemented.")}get box(){unreachable("Abstract getter `box` must be implemented.")}serialize(t,e){unreachable("Abstract method `serialize` must be implemented.")}static _rescale(t,e,i,s,n,r){r||=new Float32Array(t.length);for(let a=0,o=t.length;a=6;t-=6)isNaN(e[t])?i.push(`L${e[t+4]} ${e[t+5]}`):i.push(`C${e[t]} ${e[t+1]} ${e[t+2]} ${e[t+3]} ${e[t+4]} ${e[t+5]}`);this.#bo(i);return i.join(" ")}#mo(){const[t,e,i,s]=this.#Ja,[n,r,a,o]=this.#go();return`M${(this.#so[2]-t)/i} ${(this.#so[3]-e)/s} L${(this.#so[4]-t)/i} ${(this.#so[5]-e)/s} L${n} ${r} L${a} ${o} L${(this.#so[16]-t)/i} ${(this.#so[17]-e)/s} L${(this.#so[14]-t)/i} ${(this.#so[15]-e)/s} Z`}#bo(t){const e=this.#Za;t.push(`L${e[4]} ${e[5]} Z`)}#fo(t){const[e,i,s,n]=this.#Ja,r=this.#so.subarray(4,6),a=this.#so.subarray(16,18),[o,l,h,d]=this.#go();t.push(`L${(r[0]-e)/s} ${(r[1]-i)/n} L${o} ${l} L${h} ${d} L${(a[0]-e)/s} ${(a[1]-i)/n}`)}newFreeDrawOutline(t,e,i,s,n,r){return new FreeDrawOutline(t,e,i,s,n,r)}getOutlines(){const t=this.#io,e=this.#Za,i=this.#so,[s,n,r,a]=this.#Ja,o=new Float32Array((this.#do?.length??0)+2);for(let t=0,e=o.length-2;t=6;t-=6)for(let i=0;i<6;i+=2)if(isNaN(e[t+i])){l[h]=l[h+1]=NaN;h+=2}else{l[h]=e[t+i];l[h+1]=e[t+i+1];h+=2}this.#vo(l,h);return this.newFreeDrawOutline(l,o,this.#Ja,this.#lo,this.#to,this.#eo)}#yo(t){const e=this.#so,[i,s,n,r]=this.#Ja,[a,o,l,h]=this.#go(),d=new Float32Array(36);d.set([NaN,NaN,NaN,NaN,(e[2]-i)/n,(e[3]-s)/r,NaN,NaN,NaN,NaN,(e[4]-i)/n,(e[5]-s)/r,NaN,NaN,NaN,NaN,a,o,NaN,NaN,NaN,NaN,l,h,NaN,NaN,NaN,NaN,(e[16]-i)/n,(e[17]-s)/r,NaN,NaN,NaN,NaN,(e[14]-i)/n,(e[15]-s)/r],0);return this.newFreeDrawOutline(d,t,this.#Ja,this.#lo,this.#to,this.#eo)}#vo(t,e){const i=this.#Za;t.set([NaN,NaN,NaN,NaN,i[4],i[5]],e);return e+6}#Ao(t,e){const i=this.#so.subarray(4,6),s=this.#so.subarray(16,18),[n,r,a,o]=this.#Ja,[l,h,d,c]=this.#go();t.set([NaN,NaN,NaN,NaN,(i[0]-n)/a,(i[1]-r)/o,NaN,NaN,NaN,NaN,l,h,NaN,NaN,NaN,NaN,d,c,NaN,NaN,NaN,NaN,(s[0]-n)/a,(s[1]-r)/o],e);return e+24}}class FreeDrawOutline extends Outline{#Ja;#wo=new Float32Array(4);#to;#eo;#do;#lo;#xo;constructor(t,e,i,s,n,r){super();this.#xo=t;this.#do=e;this.#Ja=i;this.#lo=s;this.#to=n;this.#eo=r;this.firstPoint=[NaN,NaN];this.lastPoint=[NaN,NaN];this.#Co(r);const[a,o,l,h]=this.#wo;for(let e=0,i=t.length;ep){a=u;o=p}else o===p&&(a=d(a,u));if(hc[1]){a=c[0];o=c[1]}else o===c[1]&&(a=d(a,c[0]));if(ht[0]-e[0]||t[1]-e[1]||t[2]-e[2]);const t=[];for(const e of this.#So)if(e[3]){t.push(...this.#Po(e));this.#Do(e)}else{this.#Mo(e);t.push(...this.#Po(e))}return this.#ko(t)}#ko(t){const e=[],i=new Set;for(const i of t){const[t,s,n]=i;e.push([t,s,i],[t,n,i])}e.sort((t,e)=>t[1]-e[1]||t[0]-e[0]);for(let t=0,s=e.length;t0;){const t=i.values().next().value;let[e,r,a,o,l]=t;i.delete(t);let h=e,d=r;n=[e,a];s.push(n);for(;;){let t;if(i.has(o))t=o;else{if(!i.has(l))break;t=l}i.delete(t);[e,r,a,o,l]=t;if(h!==e){n.push(h,d,e,d===r?r:a);h=e}d=d===r?a:r}n.push(h,d)}return new HighlightOutline(s,this.#Ja,this.#Eo,this.#To)}#Io(t){const e=this.#_o;let i=0,s=e.length-1;for(;i<=s;){const n=i+s>>1,r=e[n][0];if(r===t)return n;r=0;s--){const[i,n]=this.#_o[s];if(i!==t)break;if(i===t&&n===e){this.#_o.splice(s,1);return}}}#Po(t){const[e,i,s]=t,n=[[e,i,s]],r=this.#Io(s);for(let t=0;t=i)if(o>s)n[t][1]=s;else{if(1===r)return[];n.splice(t,1);t--;r--}else{n[t][2]=i;o>s&&n.push([e,s,o])}}}return n}}class HighlightOutline extends Outline{#Ja;#Fo;constructor(t,e,i,s){super();this.#Fo=t;this.#Ja=e;this.firstPoint=i;this.lastPoint=s}toSVGPath(){const t=[];for(const e of this.#Fo){let[i,s]=e;t.push(`M${i} ${s}`);for(let n=2;n-1){this.#Wo=!0;this.#$o(t);this.#Xo()}else if(this.#Oo){this.#Bo=t.anchorNode;this.#Ro=t.anchorOffset;this.#Uo=t.focusNode;this.#Ho=t.focusOffset;this.#qo();this.#Xo();this.rotate(this.rotation)}this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-highlight-added-alert")}get telemetryInitialData(){return{action:"added",type:this.#Wo?"free_highlight":"highlight",color:this._uiManager.getNonHCMColorName(this.color),thickness:this.#ho,methodOfCreation:this.#jo}}get telemetryFinalData(){return{type:"highlight",color:this._uiManager.getNonHCMColorName(this.color)}}static computeTelemetryFinalData(t){return{numberOfColors:t.get("color").size}}#qo(){const t=new HighlightOutliner(this.#Oo,.001);this.#Go=t.getOutlines();[this.x,this.y,this.width,this.height]=this.#Go.box;const e=new HighlightOutliner(this.#Oo,.0025,.001,"ltr"===this._uiManager.direction);this.#No=e.getOutlines();const{firstPoint:i}=this.#Go;this.#Eo=[(i[0]-this.x)/this.width,(i[1]-this.y)/this.height];const{lastPoint:s}=this.#No;this.#To=[(s[0]-this.x)/this.width,(s[1]-this.y)/this.height]}#$o({highlightOutlines:t,highlightId:e,clipPathId:i}){this.#Go=t;this.#No=t.getNewOutline(this.#ho/2+1.5,.0025);if(e>=0){this.#S=e;this.#Lo=i;this.parent.drawLayer.finalizeDraw(e,{bbox:t.box,path:{d:t.toSVGPath()}});this.#Vo=this.parent.drawLayer.drawOutline({rootClass:{highlightOutline:!0,free:!0},bbox:this.#No.box,path:{d:this.#No.toSVGPath()}},!0)}else if(this.parent){const e=this.parent.viewport.rotation;this.parent.drawLayer.updateProperties(this.#S,{bbox:HighlightEditor.#Ko(this.#Go.box,(e-this.rotation+360)%360),path:{d:t.toSVGPath()}});this.parent.drawLayer.updateProperties(this.#Vo,{bbox:HighlightEditor.#Ko(this.#No.box,e),path:{d:this.#No.toSVGPath()}})}const[s,n,r,a]=t.box;switch(this.rotation){case 0:this.x=s;this.y=n;this.width=r;this.height=a;break;case 90:{const[t,e]=this.parentDimensions;this.x=n;this.y=1-s;this.width=r*e/t;this.height=a*t/e;break}case 180:this.x=1-s;this.y=1-n;this.width=r;this.height=a;break;case 270:{const[t,e]=this.parentDimensions;this.x=1-n;this.y=s;this.width=r*e/t;this.height=a*t/e;break}}const{firstPoint:o}=t;this.#Eo=[(o[0]-s)/r,(o[1]-n)/a];const{lastPoint:l}=this.#No;this.#To=[(l[0]-s)/r,(l[1]-n)/a]}static initialize(t,e){AnnotationEditor.initialize(t,e);HighlightEditor._defaultColor||=e.highlightColors?.values().next().value||"#fff066"}static updateDefaultParams(t,e){switch(t){case f.HIGHLIGHT_COLOR:HighlightEditor._defaultColor=e;break;case f.HIGHLIGHT_THICKNESS:HighlightEditor._defaultThickness=e}}translateInPage(t,e){}get toolbarPosition(){return this.#To}get commentButtonPosition(){return this.#Eo}updateParams(t,e){switch(t){case f.HIGHLIGHT_COLOR:this.#ba(e);break;case f.HIGHLIGHT_THICKNESS:this.#Yo(e)}}static get defaultPropertiesToUpdate(){return[[f.HIGHLIGHT_COLOR,HighlightEditor._defaultColor],[f.HIGHLIGHT_THICKNESS,HighlightEditor._defaultThickness]]}get propertiesToUpdate(){return[[f.HIGHLIGHT_COLOR,this.color||HighlightEditor._defaultColor],[f.HIGHLIGHT_THICKNESS,this.#ho||HighlightEditor._defaultThickness],[f.HIGHLIGHT_FREE,this.#Wo]]}onUpdatedColor(){this.parent?.drawLayer.updateProperties(this.#S,{root:{fill:this.color,"fill-opacity":this.opacity}});this.#r?.updateColor(this.color);super.onUpdatedColor()}#ba(t){const setColorAndOpacity=(t,e)=>{this.color=t;this.opacity=e;this.onUpdatedColor()},e=this.color,i=this.opacity;this.addCommands({cmd:setColorAndOpacity.bind(this,t,HighlightEditor._defaultOpacity),undo:setColorAndOpacity.bind(this,e,i),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:f.HIGHLIGHT_COLOR,overwriteIfSameType:!0,keepUndo:!0});this._reportTelemetry({action:"color_changed",color:this._uiManager.getNonHCMColorName(t)},!0)}#Yo(t){const e=this.#ho,setThickness=t=>{this.#ho=t;this.#Qo(t)};this.addCommands({cmd:setThickness.bind(this,t),undo:setThickness.bind(this,e),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:f.INK_THICKNESS,overwriteIfSameType:!0,keepUndo:!0});this._reportTelemetry({action:"thickness_changed",thickness:t},!0)}get toolbarButtons(){if(this._uiManager.highlightColors){return[["colorPicker",this.#r=new ColorPicker({editor:this})]]}return super.toolbarButtons}disableEditing(){super.disableEditing();this.div.classList.toggle("disabled",!0)}enableEditing(){super.enableEditing();this.div.classList.toggle("disabled",!1)}fixAndSetPosition(){return super.fixAndSetPosition(this.#Jo())}getBaseTranslation(){return[0,0]}getRect(t,e){return super.getRect(t,e,this.#Jo())}onceAdded(t){this.annotationElementId||this.parent.addUndoableEditor(this);t&&this.div.focus()}remove(){this.#Zo();this._reportTelemetry({action:"deleted"});super.remove()}rebuild(){if(this.parent){super.rebuild();if(null!==this.div){this.#Xo();this.isAttachedToDOM||this.parent.add(this)}}}setParent(t){let e=!1;if(this.parent&&!t)this.#Zo();else if(t){this.#Xo(t);e=!this.parent&&this.div?.classList.contains("selectedEditor")}super.setParent(t);this.show(this._isVisible);e&&this.select()}#Qo(t){if(this.#Wo){this.#$o({highlightOutlines:this.#Go.getNewOutline(t/2)});this.fixAndSetPosition();this.setDims()}}#Zo(){if(null!==this.#S&&this.parent){this.parent.drawLayer.remove(this.#S);this.#S=null;this.parent.drawLayer.remove(this.#Vo);this.#Vo=null}}#Xo(t=this.parent){if(null===this.#S){({id:this.#S,clipPathId:this.#Lo}=t.drawLayer.draw({bbox:this.#Go.box,root:{viewBox:"0 0 1 1",fill:this.color,"fill-opacity":this.opacity},rootClass:{highlight:!0,free:this.#Wo},path:{d:this.#Go.toSVGPath()}},!1,!0));this.#Vo=t.drawLayer.drawOutline({rootClass:{highlightOutline:!0,free:this.#Wo},bbox:this.#No.box,path:{d:this.#No.toSVGPath()}},this.#Wo);this.#zo&&(this.#zo.style.clipPath=this.#Lo)}}static#Ko([t,e,i,s],n){switch(n){case 90:return[1-e-s,t,s,i];case 180:return[1-t-i,1-e-s,i,s];case 270:return[e,1-t-i,s,i]}return[t,e,i,s]}rotate(t){const{drawLayer:e}=this.parent;let i;if(this.#Wo){t=(t-this.rotation+360)%360;i=HighlightEditor.#Ko(this.#Go.box,t)}else i=HighlightEditor.#Ko([this.x,this.y,this.width,this.height],t);e.updateProperties(this.#S,{bbox:i,root:{"data-main-rotation":t}});e.updateProperties(this.#Vo,{bbox:HighlightEditor.#Ko(this.#No.box,t),root:{"data-main-rotation":t}})}render(){if(this.div)return this.div;const t=super.render();if(this.#be){t.setAttribute("aria-label",this.#be);t.setAttribute("role","mark")}this.#Wo?t.classList.add("free"):this.div.addEventListener("keydown",this.#tl.bind(this),{signal:this._uiManager._signal});const e=this.#zo=document.createElement("div");t.append(e);e.setAttribute("aria-hidden","true");e.className="internal";e.style.clipPath=this.#Lo;this.setDims();bindEvents(this,this.#zo,["pointerover","pointerleave"]);this.enableEditing();return t}pointerover(){this.isSelected||this.parent?.drawLayer.updateProperties(this.#Vo,{rootClass:{hovered:!0}})}pointerleave(){this.isSelected||this.parent?.drawLayer.updateProperties(this.#Vo,{rootClass:{hovered:!1}})}#tl(t){HighlightEditor._keyboardManager.exec(this,t)}_moveCaret(t){this.parent.unselect(this);switch(t){case 0:case 2:this.#el(!0);break;case 1:case 3:this.#el(!1)}}#el(t){if(!this.#Bo)return;const e=window.getSelection();t?e.setPosition(this.#Bo,this.#Ro):e.setPosition(this.#Uo,this.#Ho)}select(){super.select();this.#Vo&&this.parent?.drawLayer.updateProperties(this.#Vo,{rootClass:{hovered:!1,selected:!0}})}unselect(){super.unselect();if(this.#Vo){this.parent?.drawLayer.updateProperties(this.#Vo,{rootClass:{selected:!1}});this.#Wo||this.#el(!1)}}get _mustFixPosition(){return!this.#Wo}show(t=this._isVisible){super.show(t);if(this.parent){this.parent.drawLayer.updateProperties(this.#S,{rootClass:{hidden:!t}});this.parent.drawLayer.updateProperties(this.#Vo,{rootClass:{hidden:!t}})}}#Jo(){return this.#Wo?this.rotation:0}#il(){if(this.#Wo)return null;const[t,e]=this.pageDimensions,[i,s]=this.pageTranslation,n=this.#Oo,r=new Float32Array(8*n.length);let a=0;for(const{x:o,y:l,width:h,height:d}of n){const n=o*t+i,c=(1-l)*e+s;r[a]=r[a+4]=n;r[a+1]=r[a+3]=c;r[a+2]=r[a+6]=n+h*t;r[a+5]=r[a+7]=c-d*e;a+=8}return r}#sl(t){return this.#Go.serialize(t,this.#Jo())}static startHighlighting(t,e,{target:i,x:s,y:n}){const{x:r,y:a,width:o,height:l}=i.getBoundingClientRect(),h=new AbortController,d=t.combinedSignal(h),pointerUpCallback=e=>{h.abort();this.#nl(t,e)};window.addEventListener("blur",pointerUpCallback,{signal:d});window.addEventListener("pointerup",pointerUpCallback,{signal:d});window.addEventListener("pointerdown",stopEvent,{capture:!0,passive:!1,signal:d});window.addEventListener("contextmenu",noContextMenu,{signal:d});i.addEventListener("pointermove",this.#rl.bind(this,t),{signal:d});this._freeHighlight=new FreeHighlightOutliner({x:s,y:n},[r,a,o,l],t.scale,this._defaultThickness/2,e,.001);({id:this._freeHighlightId,clipPathId:this._freeHighlightClipId}=t.drawLayer.draw({bbox:[0,0,1,1],root:{viewBox:"0 0 1 1",fill:this._defaultColor,"fill-opacity":this._defaultOpacity},rootClass:{highlight:!0,free:!0},path:{d:this._freeHighlight.toSVGPath()}},!0,!0))}static#rl(t,e){this._freeHighlight.add(e)&&t.drawLayer.updateProperties(this._freeHighlightId,{path:{d:this._freeHighlight.toSVGPath()}})}static#nl(t,e){this._freeHighlight.isEmpty()?t.drawLayer.remove(this._freeHighlightId):t.createAndAddNewEditor(e,!1,{highlightId:this._freeHighlightId,highlightOutlines:this._freeHighlight.getOutlines(),clipPathId:this._freeHighlightClipId,methodOfCreation:"main_toolbar"});this._freeHighlightId=-1;this._freeHighlight=null;this._freeHighlightClipId=""}static async deserialize(t,e,i){let s=null;if(t instanceof HighlightAnnotationElement){const{data:{quadPoints:e,rect:i,rotation:n,id:r,color:a,opacity:o,popupRef:l,richText:h,contentsObj:d,creationDate:c,modificationDate:u},parent:{page:{pageNumber:p}}}=t;s=t={annotationType:m.HIGHLIGHT,color:Array.from(a),opacity:o,quadPoints:e,boxes:null,pageIndex:p-1,rect:i.slice(0),rotation:n,annotationElementId:r,id:r,deleted:!1,popupRef:l,richText:h,comment:d?.str||null,creationDate:c,modificationDate:u}}else if(t instanceof InkAnnotationElement){const{data:{inkLists:e,rect:i,rotation:n,id:r,color:a,borderStyle:{rawWidth:o},popupRef:l,richText:h,contentsObj:d,creationDate:c,modificationDate:u},parent:{page:{pageNumber:p}}}=t;s=t={annotationType:m.HIGHLIGHT,color:Array.from(a),thickness:o,inkLists:e,boxes:null,pageIndex:p-1,rect:i.slice(0),rotation:n,annotationElementId:r,id:r,deleted:!1,popupRef:l,richText:h,comment:d?.str||null,creationDate:c,modificationDate:u}}const{color:n,quadPoints:r,inkLists:a,outlines:o,opacity:l}=t,h=await super.deserialize(t,e,i);h.color=Util.makeHexColor(...n);h.opacity=l||1;a&&(h.#ho=t.thickness);h._initialData=s;t.comment&&h.setCommentData(t);const[d,c]=h.pageDimensions,[u,p]=h.pageTranslation;if(r){const t=h.#Oo=[];for(let e=0;et!==e[i])}renderAnnotationElement(t){if(this.deleted){t.hide();return null}t.updateEdited({rect:this.getPDFRect(),popup:this.comment});return null}static canCreateNewEmptyEditor(){return!1}}class DrawingOptions{#al=Object.create(null);updateProperty(t,e){this[t]=e;this.updateSVGProperty(t,e)}updateProperties(t){if(t)for(const[e,i]of Object.entries(t))e.startsWith("_")||this.updateProperty(e,i)}updateSVGProperty(t,e){this.#al[t]=e}toSVGProperties(){const t=this.#al;this.#al=Object.create(null);return{root:t}}reset(){this.#al=Object.create(null)}updateAll(t=this){this.updateProperties(t)}clone(){unreachable("Not implemented")}}class DrawingEditor extends AnnotationEditor{#ol=null;#ll;_colorPicker=null;_drawId=null;static _currentDrawId=-1;static _currentParent=null;static#hl=null;static#dl=null;static#cl=null;static _INNER_MARGIN=3;constructor(t){super(t);this.#ll=t.mustBeCommitted||!1;this._addOutlines(t)}onUpdatedColor(){this._colorPicker?.update(this.color);super.onUpdatedColor()}onUpdatedOpacity(){this._colorPicker?.updateOpacity?.(this.opacity)}_addOutlines(t){if(t.drawOutlines){this.#ul(t);this.#Xo()}}#ul({drawOutlines:t,drawId:e,drawingOptions:i}){this.#ol=t;this._drawingOptions||=i;this.annotationElementId||this._uiManager.a11yAlert(`pdfjs-editor-${this.editorType}-added-alert`);if(e>=0){this._drawId=e;this.parent.drawLayer.finalizeDraw(e,t.defaultProperties)}else this._drawId=this.#pl(t,this.parent);this.#gl(t.box)}#pl(t,e){const{id:i}=e.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(),t.defaultSVGProperties),!1,!1);return i}static _mergeSVGProperties(t,e){const i=new Set(Object.keys(t));for(const[s,n]of Object.entries(e))i.has(s)?Object.assign(t[s],n):t[s]=n;return t}static getDefaultDrawingOptions(t){unreachable("Not implemented")}static get typesMap(){unreachable("Not implemented")}static get isDrawer(){return!0}static get supportMultipleDrawings(){return!1}static updateDefaultParams(t,e){const i=this.typesMap.get(t);i&&this._defaultDrawingOptions.updateProperty(i,e);if(this._currentParent){DrawingEditor.#hl.updateProperty(i,e);this._currentParent.drawLayer.updateProperties(this._currentDrawId,this._defaultDrawingOptions.toSVGProperties())}}updateParams(t,e){const i=this.constructor.typesMap.get(t);i&&this._updateProperty(t,i,e)}static get defaultPropertiesToUpdate(){const t=[],e=this._defaultDrawingOptions;for(const[i,s]of this.typesMap)t.push([i,e[s]]);return t}get propertiesToUpdate(){const t=[],{_drawingOptions:e}=this;for(const[i,s]of this.constructor.typesMap)t.push([i,e[s]]);return t}_updateProperty(t,e,i){const s=this._drawingOptions,n=s[e],setter=i=>{s.updateProperty(e,i);const n=this.#ol.updateProperty(e,i);n&&this.#gl(n);this.parent?.drawLayer.updateProperties(this._drawId,s.toSVGProperties());t===this.colorType?this.onUpdatedColor():t===this.opacityType&&this.onUpdatedOpacity()};this.addCommands({cmd:setter.bind(this,i),undo:setter.bind(this,n),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:t,overwriteIfSameType:!0,keepUndo:!0})}_updateColorAndOpacity(t,e){const i=this.constructor.typesMap.get(this.colorType),s=this.constructor.typesMap.get(this.opacityType),n=this._drawingOptions,r=n[i],a=n[s],setter=(t,e)=>{n.updateProperty(i,t);n.updateProperty(s,e);this.#ol.updateProperty(i,t);this.#ol.updateProperty(s,e);this.parent?.drawLayer.updateProperties(this._drawId,n.toSVGProperties());this.onUpdatedColor();this.onUpdatedOpacity()};this.addCommands({cmd:setter.bind(this,t,e),undo:setter.bind(this,r,a),post:this._uiManager.updateUI.bind(this._uiManager,this),mustExec:!0,type:f.INK_COLOR_AND_OPACITY,overwriteIfSameType:!0,keepUndo:!0})}_onResizing(){this.parent?.drawLayer.updateProperties(this._drawId,DrawingEditor._mergeSVGProperties(this.#ol.getPathResizingSVGProperties(this.#ml()),{bbox:this.#fl()}))}_onResized(){this.parent?.drawLayer.updateProperties(this._drawId,DrawingEditor._mergeSVGProperties(this.#ol.getPathResizedSVGProperties(this.#ml()),{bbox:this.#fl()}))}_onTranslating(t,e){this.parent?.drawLayer.updateProperties(this._drawId,{bbox:this.#fl()})}_onTranslated(){this.parent?.drawLayer.updateProperties(this._drawId,DrawingEditor._mergeSVGProperties(this.#ol.getPathTranslatedSVGProperties(this.#ml(),this.parentDimensions),{bbox:this.#fl()}))}_onStartDragging(){this.parent?.drawLayer.updateProperties(this._drawId,{rootClass:{moving:!0}})}_onStopDragging(){this.parent?.drawLayer.updateProperties(this._drawId,{rootClass:{moving:!1}})}commit(){super.commit();this.disableEditMode();this.disableEditing()}disableEditing(){super.disableEditing();this.div.classList.toggle("disabled",!0)}enableEditing(){super.enableEditing();this.div.classList.toggle("disabled",!1)}getBaseTranslation(){return[0,0]}get isResizable(){return!0}onceAdded(t){this.annotationElementId||this.parent.addUndoableEditor(this);this._isDraggable=!0;if(this.#ll){this.#ll=!1;this.commit();this.parent.setSelected(this);t&&this.isOnScreen&&this.div.focus()}}remove(){this.#Zo();super.remove()}rebuild(){if(this.parent){super.rebuild();if(null!==this.div){this.#Xo();this.#gl(this.#ol.box);this.isAttachedToDOM||this.parent.add(this)}}}setParent(t){let e=!1;if(this.parent&&!t){this._uiManager.removeShouldRescale(this);this.#Zo()}else if(t){this._uiManager.addShouldRescale(this);this.#Xo(t);e=!this.parent&&this.div?.classList.contains("selectedEditor")}super.setParent(t);e&&this.select()}#Zo(){if(null!==this._drawId&&this.parent){this.parent.drawLayer.remove(this._drawId);this._drawId=null;this._drawingOptions.reset()}}#Xo(t=this.parent){if(null===this._drawId||this.parent!==t)if(null===this._drawId){this._drawingOptions.updateAll();this._drawId=this.#pl(this.#ol,t)}else this.parent.drawLayer.updateParent(this._drawId,t.drawLayer)}#bl([t,e,i,s]){const{parentDimensions:[n,r],rotation:a}=this;switch(a){case 90:return[e,1-t,i*(r/n),s*(n/r)];case 180:return[1-t,1-e,i,s];case 270:return[1-e,t,i*(r/n),s*(n/r)];default:return[t,e,i,s]}}#ml(){const{x:t,y:e,width:i,height:s,parentDimensions:[n,r],rotation:a}=this;switch(a){case 90:return[1-e,t,i*(n/r),s*(r/n)];case 180:return[1-t,1-e,i,s];case 270:return[e,1-t,i*(n/r),s*(r/n)];default:return[t,e,i,s]}}#gl(t){[this.x,this.y,this.width,this.height]=this.#bl(t);if(this.div){this.fixAndSetPosition();this.setDims()}this._onResized()}#fl(){const{x:t,y:e,width:i,height:s,rotation:n,parentRotation:r,parentDimensions:[a,o]}=this;switch((4*n+r)/90){case 1:return[1-e-s,t,s,i];case 2:return[1-t-i,1-e-s,i,s];case 3:return[e,1-t-i,s,i];case 4:return[t,e-i*(a/o),s*(o/a),i*(a/o)];case 5:return[1-e,t,i*(a/o),s*(o/a)];case 6:return[1-t-s*(o/a),1-e,s*(o/a),i*(a/o)];case 7:return[e-i*(a/o),1-t-s*(o/a),i*(a/o),s*(o/a)];case 8:return[t-i,e-s,i,s];case 9:return[1-e,t-i,s,i];case 10:return[1-t,1-e,i,s];case 11:return[e-s,1-t,s,i];case 12:return[t-s*(o/a),e,s*(o/a),i*(a/o)];case 13:return[1-e-i*(a/o),t-s*(o/a),i*(a/o),s*(o/a)];case 14:return[1-t,1-e-i*(a/o),s*(o/a),i*(a/o)];case 15:return[e,1-t,i*(a/o),s*(o/a)];default:return[t,e,i,s]}}rotate(){this.parent&&this.parent.drawLayer.updateProperties(this._drawId,DrawingEditor._mergeSVGProperties({bbox:this.#fl()},this.#ol.updateRotation((this.parentRotation-this.rotation+360)%360)))}onScaleChanging(){this.parent&&this.#gl(this.#ol.updateParentDimensions(this.parentDimensions,this.parent.scale))}static onScaleChangingWhenDrawing(){}render(){if(this.div)return this.div;let t,e;if(this._isCopy){t=this.x;e=this.y}const i=super.render();i.classList.add("draw");const s=document.createElement("div");i.append(s);s.setAttribute("aria-hidden","true");s.className="internal";this.setDims();this._uiManager.addShouldRescale(this);this.disableEditing();this._isCopy&&this._moveAfterPaste(t,e);return i}static createDrawerInstance(t,e,i,s,n){unreachable("Not implemented")}static startDrawing(t,e,i,s){const{target:n,offsetX:r,offsetY:a,pointerId:o,pointerType:l}=s;if(CurrentPointers.isInitializedAndDifferentPointerType(l))return;const{viewport:{rotation:h}}=t,{width:d,height:c}=n.getBoundingClientRect(),u=DrawingEditor.#dl=new AbortController,p=t.combinedSignal(u);CurrentPointers.setPointer(l,o);window.addEventListener("pointerup",t=>{CurrentPointers.isSamePointerIdOrRemove(t.pointerId)&&this._endDraw(t)},{signal:p});window.addEventListener("pointercancel",t=>{CurrentPointers.isSamePointerIdOrRemove(t.pointerId)&&this._currentParent.endDrawingSession()},{signal:p});window.addEventListener("pointerdown",t=>{if(CurrentPointers.isSamePointerType(t.pointerType)){CurrentPointers.initializeAndAddPointerId(t.pointerId);if(DrawingEditor.#hl.isCancellable()){DrawingEditor.#hl.removeLastElement();DrawingEditor.#hl.isEmpty()?this._currentParent.endDrawingSession(!0):this._endDraw(null)}}},{capture:!0,passive:!1,signal:p});window.addEventListener("contextmenu",noContextMenu,{signal:p});n.addEventListener("pointermove",this._drawMove.bind(this),{signal:p});n.addEventListener("touchmove",t=>{CurrentPointers.isSameTimeStamp(t.timeStamp)&&stopEvent(t)},{signal:p});t.toggleDrawing();e._editorUndoBar?.hide();if(DrawingEditor.#hl)t.drawLayer.updateProperties(this._currentDrawId,DrawingEditor.#hl.startNew(r,a,d,c,h));else{e.updateUIForDefaultProperties(this);DrawingEditor.#hl=this.createDrawerInstance(r,a,d,c,h);DrawingEditor.#cl=this.getDefaultDrawingOptions();this._currentParent=t;({id:this._currentDrawId}=t.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#cl.toSVGProperties(),DrawingEditor.#hl.defaultSVGProperties),!0,!1))}}static _drawMove(t){CurrentPointers.isSameTimeStamp(t.timeStamp);if(!DrawingEditor.#hl)return;const{offsetX:e,offsetY:i,pointerId:s}=t;if(CurrentPointers.isSamePointerId(s))if(CurrentPointers.isUsingMultiplePointers())this._endDraw(t);else{this._currentParent.drawLayer.updateProperties(this._currentDrawId,DrawingEditor.#hl.add(e,i));CurrentPointers.setTimeStamp(t.timeStamp);stopEvent(t)}}static _cleanup(t){if(t){this._currentDrawId=-1;this._currentParent=null;DrawingEditor.#hl=null;DrawingEditor.#cl=null;CurrentPointers.clearTimeStamp()}if(DrawingEditor.#dl){DrawingEditor.#dl.abort();DrawingEditor.#dl=null;CurrentPointers.clearPointerIds()}}static _endDraw(t){const e=this._currentParent;if(e){e.toggleDrawing(!0);this._cleanup(!1);t?.target===e.div&&e.drawLayer.updateProperties(this._currentDrawId,DrawingEditor.#hl.end(t.offsetX,t.offsetY));if(this.supportMultipleDrawings){const t=DrawingEditor.#hl,i=this._currentDrawId,s=t.getLastElement();e.addCommands({cmd:()=>{e.drawLayer.updateProperties(i,t.setLastElement(s))},undo:()=>{e.drawLayer.updateProperties(i,t.removeLastElement())},mustExec:!1,type:f.DRAW_STEP});return}this.endDrawing(!1)}}static endDrawing(t){const e=this._currentParent;if(!e)return null;e.toggleDrawing(!0);e.cleanUndoStack(f.DRAW_STEP);if(!DrawingEditor.#hl.isEmpty()){const{pageDimensions:[i,s],scale:n}=e,r=e.createAndAddNewEditor({offsetX:0,offsetY:0},!1,{drawId:this._currentDrawId,drawOutlines:DrawingEditor.#hl.getOutlines(i*n,s*n,n,this._INNER_MARGIN),drawingOptions:DrawingEditor.#cl,mustBeCommitted:!t});this._cleanup(!0);return r}e.drawLayer.remove(this._currentDrawId);this._cleanup(!0);return null}createDrawingOptions(t){}static deserializeDraw(t,e,i,s,n,r){unreachable("Not implemented")}static async deserialize(t,e,i){const{rawDims:{pageWidth:s,pageHeight:n,pageX:r,pageY:a}}=e.viewport,o=this.deserializeDraw(r,a,s,n,this._INNER_MARGIN,t),l=await super.deserialize(t,e,i);l.createDrawingOptions(t);l.#ul({drawOutlines:o});l.#Xo();l.onScaleChanging();l.rotate();return l}serializeDraw(t){const[e,i]=this.pageTranslation,[s,n]=this.pageDimensions;return this.#ol.serialize([e,i,s,n],t)}renderAnnotationElement(t){t.updateEdited({rect:this.getPDFRect()});return null}static canCreateNewEmptyEditor(){return!1}}class InkDrawOutliner{#so=new Float64Array(6);#Ea;#yl;#In;#ho;#do;#Al="";#vl=0;#Fo=new InkDrawOutline;#wl;#xl;constructor(t,e,i,s,n,r){this.#wl=i;this.#xl=s;this.#In=n;this.#ho=r;[t,e]=this.#Cl(t,e);const a=this.#Ea=[NaN,NaN,NaN,NaN,t,e];this.#do=[t,e];this.#yl=[{line:a,points:this.#do}];this.#so.set(a,0)}updateProperty(t,e){"stroke-width"===t&&(this.#ho=e)}#Cl(t,e){return Outline._normalizePoint(t,e,this.#wl,this.#xl,this.#In)}isEmpty(){return!this.#yl||0===this.#yl.length}isCancellable(){return this.#do.length<=10}add(t,e){[t,e]=this.#Cl(t,e);const[i,s,n,r]=this.#so.subarray(2,6),a=t-n,o=e-r;if(Math.hypot(this.#wl*a,this.#xl*o)<=2)return null;this.#do.push(t,e);if(isNaN(i)){this.#so.set([n,r,t,e],2);this.#Ea.push(NaN,NaN,NaN,NaN,t,e);return{path:{d:this.toSVGPath()}}}isNaN(this.#so[0])&&this.#Ea.splice(6,6);this.#so.set([i,s,n,r,t,e],0);this.#Ea.push(...Outline.createBezierPoints(i,s,n,r,t,e));return{path:{d:this.toSVGPath()}}}end(t,e){const i=this.add(t,e);return i||(2===this.#do.length?{path:{d:this.toSVGPath()}}:null)}startNew(t,e,i,s,n){this.#wl=i;this.#xl=s;this.#In=n;[t,e]=this.#Cl(t,e);const r=this.#Ea=[NaN,NaN,NaN,NaN,t,e];this.#do=[t,e];const a=this.#yl.at(-1);if(a){a.line=new Float32Array(a.line);a.points=new Float32Array(a.points)}this.#yl.push({line:r,points:this.#do});this.#so.set(r,0);this.#vl=0;this.toSVGPath();return null}getLastElement(){return this.#yl.at(-1)}setLastElement(t){if(!this.#yl)return this.#Fo.setLastElement(t);this.#yl.push(t);this.#Ea=t.line;this.#do=t.points;this.#vl=0;return{path:{d:this.toSVGPath()}}}removeLastElement(){if(!this.#yl)return this.#Fo.removeLastElement();this.#yl.pop();this.#Al="";for(let t=0,e=this.#yl.length;tt??NaN),d,c,u,p),points:g(a[t].map(t=>t??NaN),d,c,u,p)});const m=new this.prototype.constructor;m.build(h,i,s,1,o,l,n);return m}#Pl(t=this.#ho){const e=this.#to+t/2*this.#Tl;return this.#In%180==0?[e/this.#wl,e/this.#xl]:[e/this.#xl,e/this.#wl]}#_l(){const[t,e,i,s]=this.#wo,[n,r]=this.#Pl(0);return[t+n,e+r,i-2*n,s-2*r]}#Sl(){const t=this.#wo=i.slice();for(const{line:e}of this.#yl){if(e.length<=12){for(let i=4,s=e.length;it!==e[i])||t.thickness!==i||t.opacity!==s||t.pageIndex!==n}renderAnnotationElement(t){if(this.deleted){t.hide();return null}const{points:e,rect:i}=this.serializeDraw(!1);t.updateEdited({rect:i,thickness:this._drawingOptions["stroke-width"],points:e,popup:this.comment});return null}}class ContourDrawOutline extends InkDrawOutline{toSVGPath(){let t=super.toSVGPath();t.endsWith("Z")||(t+="Z");return t}}class SignatureExtractor{static#Dl={maxDim:512,sigmaSFactor:.02,sigmaR:25,kernelSize:16};static#Ml(t,e,i,s){s-=e;return 0===(i-=t)?s>0?0:4:1===i?s+6:2-s}static#kl=new Int32Array([0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1]);static#Il(t,e,i,s,n,r,a){const o=this.#Ml(i,s,n,r);for(let n=0;n<8;n++){const r=(-n+o-a+16)%8;if(0!==t[(i+this.#kl[2*r])*e+(s+this.#kl[2*r+1])])return r}return-1}static#Fl(t,e,i,s,n,r,a){const o=this.#Ml(i,s,n,r);for(let n=0;n<8;n++){const r=(n+o+a+16)%8;if(0!==t[(i+this.#kl[2*r])*e+(s+this.#kl[2*r+1])])return r}return-1}static#Bl(t,e,i,s){const n=t.length,r=new Int32Array(n);for(let e=0;e=1&&0===r[s+1])){1!==n&&(a=Math.abs(n));continue}o+=1;d+=1;n>1&&(a=n)}const c=[i,t],u=d===i+1,p={isHole:u,points:c,id:o,parent:0};l.push(p);let g;for(const t of l)if(t.id===a){g=t;break}g?g.isHole?p.parent=u?g.parent:a:p.parent=u?a:g.parent:p.parent=u?a:0;const m=this.#Il(r,e,t,i,h,d,0);if(-1===m){r[s]=-o;1!==r[s]&&(a=Math.abs(r[s]));continue}let f=this.#kl[2*m],b=this.#kl[2*m+1];const y=t+f,A=i+b;h=y;d=A;let v=t,w=i;for(;;){const n=this.#Fl(r,e,v,w,h,d,1);f=this.#kl[2*n];b=this.#kl[2*n+1];const l=v+f,u=w+b;c.push(u,l);const p=v*e+w;0===r[p+1]?r[p]=-o:1===r[p]&&(r[p]=o);if(l===t&&u===i&&v===y&&w===A){1!==r[s]&&(a=Math.abs(r[s]));break}h=v;d=w;v=l;w=u}}}return l}static#Rl(t,e,i,s){if(i-e<=4){for(let n=e;nv){w=s;v=e}}if(v>(l*A)**2){this.#Rl(t,e,w+2,s);this.#Rl(t,w,i,s)}else s.push(n,r)}static#Ol(t){const e=[],i=t.length;this.#Rl(t,0,i,e);e.push(t[i-2],t[i-1]);return e.length<=4?null:e}static#Ll(t,e,i,s,n,r){const a=new Float32Array(r**2),o=-2*s**2,l=r>>1;for(let t=0;t=i))for(let i=0;i=e)continue;const p=t[u*e+s],m=a[o*r+i]*h[Math.abs(p-d)];c+=p*m;g+=m}}p[u[o]=Math.round(c/g)]++}return[u,p]}static#Nl(t){const e=new Uint32Array(256);for(const i of t)e[i]++;return e}static#Ul(t){const e=t.length,i=new Uint8ClampedArray(e>>2);let s=-1/0,n=1/0;for(let e=0,r=i.length;e0!==t);let r=n,a=n;for(e=n;e<256;e++){const n=t[e];if(n>i){if(e-r>s){s=e-r;a=e-1}i=n;r=e}}for(e=a-1;e>=0&&!(t[e]>t[e+1]);e--);return e}static#zl(t){const e=t,{width:i,height:s}=t,{maxDim:n}=this.#Dl;let r=i,a=s;if(i>n||s>n){let o=i,l=s,h=Math.log2(Math.max(i,s)/n);const d=Math.floor(h);h=h===d?d-1:d;for(let i=0;i=-128&&o<=127?Int8Array:a>=-32768&&o<=32767?Int16Array:Int32Array;const h=t.length,d=8+3*h,c=new Uint32Array(d);let u=0;c[u++]=d*Uint32Array.BYTES_PER_ELEMENT+(l-2*h)*r.BYTES_PER_ELEMENT;c[u++]=0;c[u++]=s;c[u++]=n;c[u++]=e?0:1;c[u++]=Math.max(0,Math.floor(i??0));c[u++]=h;c[u++]=r.BYTES_PER_ELEMENT;for(const e of t){c[u++]=e.length-2;c[u++]=e[0];c[u++]=e[1]}const p=new CompressionStream("deflate-raw"),g=p.writable.getWriter();await g.ready;g.write(c);const m=r.prototype.constructor;for(const e of t){const t=new m(e.length-2);for(let i=2,s=e.length;i{await n.ready;await n.close()}).catch(()=>{});let r=null,a=0;for await(const t of i){r||=new Uint8Array(new Uint32Array(t.buffer,0,4)[0]);r.set(t,a);a+=t.length}const o=new Uint32Array(r.buffer,0,r.length>>2),l=o[1];if(0!==l)throw new Error(`Invalid version: ${l}`);const h=o[2],d=o[3],c=0===o[4],u=o[5],p=o[6],g=o[7],m=[],f=(8+3*p)*Uint32Array.BYTES_PER_ELEMENT;let b;switch(g){case Int8Array.BYTES_PER_ELEMENT:b=new Int8Array(r.buffer,f);break;case Int16Array.BYTES_PER_ELEMENT:b=new Int16Array(r.buffer,f);break;case Int32Array.BYTES_PER_ELEMENT:b=new Int32Array(r.buffer,f)}a=0;for(let t=0;t{e?.updateEditSignatureButton(t)})}}getSignaturePreview(){const{newCurves:t,areContours:e,thickness:i,width:s,height:n}=this.#Vl,r=Math.max(s,n);return{areContours:e,outline:SignatureExtractor.processDrawnLines({lines:{curves:t.map(t=>({points:t})),thickness:i,width:s,height:n},pageWidth:r,pageHeight:r,rotation:0,innerMargin:0,mustSmooth:!1,areContours:e}).outline}}get toolbarButtons(){return this._uiManager.signatureManager?[["editSignature",this._uiManager.signatureManager]]:super.toolbarButtons}addSignature(t,e,i,s){const{x:n,y:r}=this,{outline:a}=this.#Vl=t;this.#Gl=a instanceof ContourDrawOutline;this.description=i;let o;if(this.#Gl)o=SignatureEditor.getDefaultDrawingOptions();else{o=SignatureEditor._defaultDrawnSignatureOptions.clone();o.updateProperties({"stroke-width":a.thickness})}this._addOutlines({drawOutlines:a,drawingOptions:o});const[,l]=this.pageDimensions;let h=e/l;h=h>=1?.5:h;this.width*=h/this.height;if(this.width>=1){h*=.9/this.width;this.width=.9}this.height=h;this.setDims();this.x=n;this.y=r;this.center();this._onResized();this.onScaleChanging();this.rotate();this._uiManager.addToAnnotationStorage(this);this.setUuid(s);this._reportTelemetry({action:"pdfjs.signature.inserted",data:{hasBeenSaved:!!s,hasDescription:!!i}});this.div.hidden=!1}getFromImage(t){const{rawDims:{pageWidth:e,pageHeight:i},rotation:s}=this.parent.viewport;return SignatureExtractor.process(t,e,i,s,SignatureEditor._INNER_MARGIN)}getFromText(t,e){const{rawDims:{pageWidth:i,pageHeight:s},rotation:n}=this.parent.viewport;return SignatureExtractor.extractContoursFromText(t,e,i,s,n,SignatureEditor._INNER_MARGIN)}getDrawnSignature(t){const{rawDims:{pageWidth:e,pageHeight:i},rotation:s}=this.parent.viewport;return SignatureExtractor.processDrawnLines({lines:t,pageWidth:e,pageHeight:i,rotation:s,innerMargin:SignatureEditor._INNER_MARGIN,mustSmooth:!1,areContours:!1})}createDrawingOptions({areContours:t,thickness:e}){if(t)this._drawingOptions=SignatureEditor.getDefaultDrawingOptions();else{this._drawingOptions=SignatureEditor._defaultDrawnSignatureOptions.clone();this._drawingOptions.updateProperties({"stroke-width":e})}}serialize(t=!1){if(this.isEmpty())return null;const{lines:e,points:i}=this.serializeDraw(t),{_drawingOptions:{"stroke-width":s}}=this,n=Object.assign(super.serialize(t),{isSignature:!0,areContours:this.#Gl,color:[0,0,0],thickness:this.#Gl?0:s});this.addComment(n);if(t){n.paths={lines:e,points:i};n.uuid=this.#jl;n.isCopy=!0}else n.lines=e;this.#Wl&&(n.accessibilityData={type:"Figure",alt:this.#Wl});return n}static deserializeDraw(t,e,i,s,n,r){return r.areContours?ContourDrawOutline.deserialize(t,e,i,s,n,r):InkDrawOutline.deserialize(t,e,i,s,n,r)}static async deserialize(t,e,i){const s=await super.deserialize(t,e,i);s.#Gl=t.areContours;s.description=t.accessibilityData?.alt||"";s.#jl=t.uuid;return s}}class StampEditor extends AnnotationEditor{#$l=null;#Xl=null;#ql=null;#Kl=null;#Yl=null;#Ql="";#Jl=null;#Zl=!1;#th=null;#eh=!1;#ih=!1;static _type="stamp";static _editorType=m.STAMP;constructor(t){super({...t,name:"stampEditor"});this.#Kl=t.bitmapUrl;this.#Yl=t.bitmapFile;this.defaultL10nId="pdfjs-editor-stamp-editor"}static initialize(t,e){AnnotationEditor.initialize(t,e)}static isHandlingMimeForPasting(t){return j.includes(t)}static paste(t,e){e.pasteEditor({mode:m.STAMP},{bitmapFile:t.getAsFile()})}altTextFinish(){this._uiManager.useNewAltTextFlow&&(this.div.hidden=!1);super.altTextFinish()}get telemetryFinalData(){return{type:"stamp",hasAltText:!!this.altTextData?.altText}}static computeTelemetryFinalData(t){const e=t.get("hasAltText");return{hasAltText:e.get(!0)??0,hasNoAltText:e.get(!1)??0}}#sh(t,e=!1){if(t){this.#$l=t.bitmap;if(!e){this.#Xl=t.id;this.#eh=t.isSvg}t.file&&(this.#Ql=t.file.name);this.#nh()}else this.remove()}#rh(){this.#ql=null;this._uiManager.enableWaiting(!1);if(this.#Jl)if(this._uiManager.useNewAltTextWhenAddingImage&&this._uiManager.useNewAltTextFlow&&this.#$l)this.addEditToolbar().then(()=>{this._editToolbar.hide();this._uiManager.editAltText(this,!0)});else{if(!this._uiManager.useNewAltTextWhenAddingImage&&this._uiManager.useNewAltTextFlow&&this.#$l){this._reportTelemetry({action:"pdfjs.image.image_added",data:{alt_text_modal:!1,alt_text_type:"empty"}});try{this.mlGuessAltText()}catch{}}this.div.focus()}}async mlGuessAltText(t=null,e=!0){if(this.hasAltTextData())return null;const{mlManager:i}=this._uiManager;if(!i)throw new Error("No ML.");if(!await i.isEnabledFor("altText"))throw new Error("ML isn't enabled for alt text.");const{data:s,width:n,height:r}=t||this.copyCanvas(null,null,!0).imageData,a=await i.guess({name:"altText",request:{data:s,width:n,height:r,channels:s.length/(n*r)}});if(!a)throw new Error("No response from the AI service.");if(a.error)throw new Error("Error from the AI service.");if(a.cancel)return null;if(!a.output)throw new Error("No valid response from the AI service.");const o=a.output;await this.setGuessedAltText(o);e&&!this.hasAltTextData()&&(this.altTextData={alt:o,decorative:!1});return o}#ah(){if(this.#Xl){this._uiManager.enableWaiting(!0);this._uiManager.imageManager.getFromId(this.#Xl).then(t=>this.#sh(t,!0)).finally(()=>this.#rh());return}if(this.#Kl){const t=this.#Kl;this.#Kl=null;this._uiManager.enableWaiting(!0);this.#ql=this._uiManager.imageManager.getFromUrl(t).then(t=>this.#sh(t)).finally(()=>this.#rh());return}if(this.#Yl){const t=this.#Yl;this.#Yl=null;this._uiManager.enableWaiting(!0);this.#ql=this._uiManager.imageManager.getFromFile(t).then(t=>this.#sh(t)).finally(()=>this.#rh());return}const t=document.createElement("input");t.type="file";t.accept=j.join(",");const e=this._uiManager._signal;this.#ql=new Promise(i=>{t.addEventListener("change",async()=>{if(t.files&&0!==t.files.length){this._uiManager.enableWaiting(!0);const e=await this._uiManager.imageManager.getFromFile(t.files[0]);this._reportTelemetry({action:"pdfjs.image.image_selected",data:{alt_text_modal:this._uiManager.useNewAltTextFlow}});this.#sh(e)}else this.remove();i()},{signal:e});t.addEventListener("cancel",()=>{this.remove();i()},{signal:e})}).finally(()=>this.#rh());t.click()}remove(){if(this.#Xl){this.#$l=null;this._uiManager.imageManager.deleteId(this.#Xl);this.#Jl?.remove();this.#Jl=null;if(this.#th){clearTimeout(this.#th);this.#th=null}}super.remove()}rebuild(){if(this.parent){super.rebuild();if(null!==this.div){this.#Xl&&null===this.#Jl&&this.#ah();this.isAttachedToDOM||this.parent.add(this)}}else this.#Xl&&this.#ah()}onceAdded(t){this._isDraggable=!0;t&&this.div.focus()}isEmpty(){return!(this.#ql||this.#$l||this.#Kl||this.#Yl||this.#Xl||this.#Zl)}get toolbarButtons(){return[["altText",this.createAltText()]]}get isResizable(){return!0}render(){if(this.div)return this.div;let t,e;if(this._isCopy){t=this.x;e=this.y}super.render();this.div.hidden=!0;this.createAltText();this.#Zl||(this.#$l?this.#nh():this.#ah());this._isCopy&&this._moveAfterPaste(t,e);this._uiManager.addShouldRescale(this);return this.div}setCanvas(t,e){const{id:i,bitmap:s}=this._uiManager.imageManager.getFromCanvas(t,e);e.remove();if(i&&this._uiManager.imageManager.isValidId(i)){this.#Xl=i;s&&(this.#$l=s);this.#Zl=!1;this.#nh()}}_onResized(){this.onScaleChanging()}onScaleChanging(){if(!this.parent)return;null!==this.#th&&clearTimeout(this.#th);this.#th=setTimeout(()=>{this.#th=null;this.#oh()},200)}#nh(){const{div:t}=this;let{width:e,height:i}=this.#$l;const[s,n]=this.pageDimensions,r=.75;if(this.width){e=this.width*s;i=this.height*n}else if(e>r*s||i>r*n){const t=Math.min(r*s/e,r*n/i);e*=t;i*=t}this._uiManager.enableWaiting(!1);const a=this.#Jl=document.createElement("canvas");a.setAttribute("role","img");this.addContainer(a);this.width=e/s;this.height=i/n;this.setDims();this._initialOptions?.isCentered?this.center():this.fixAndSetPosition();this._initialOptions=null;this._uiManager.useNewAltTextWhenAddingImage&&this._uiManager.useNewAltTextFlow&&!this.annotationElementId||(t.hidden=!1);this.#oh();if(!this.#ih){this.parent.addUndoableEditor(this);this.#ih=!0}this._reportTelemetry({action:"inserted_image"});this.#Ql&&this.div.setAttribute("aria-description",this.#Ql);this.annotationElementId||this._uiManager.a11yAlert("pdfjs-editor-stamp-added-alert")}copyCanvas(t,e,i=!1){t||(t=224);const{width:s,height:n}=this.#$l,r=new OutputScale;let a=this.#$l,o=s,l=n,h=null;if(e){if(s>e||n>e){const t=Math.min(e/s,e/n);o=Math.floor(s*t);l=Math.floor(n*t)}h=document.createElement("canvas");const t=h.width=Math.ceil(o*r.sx),i=h.height=Math.ceil(l*r.sy);this.#eh||(a=this.#lh(t,i));const d=h.getContext("2d");d.filter=this._uiManager.hcmFilter;let c="white",u="#cfcfd8";if("none"!==this._uiManager.hcmFilter)u="black";else if(ColorScheme.isDarkMode){c="#8f8f9d";u="#42414d"}const p=15,g=p*r.sx,m=p*r.sy,f=new OffscreenCanvas(2*g,2*m),b=f.getContext("2d");b.fillStyle=c;b.fillRect(0,0,2*g,2*m);b.fillStyle=u;b.fillRect(0,0,g,m);b.fillRect(g,m,g,m);d.fillStyle=d.createPattern(f,"repeat");d.fillRect(0,0,t,i);d.drawImage(a,0,0,a.width,a.height,0,0,t,i)}let d=null;if(i){let e,i;if(r.symmetric&&a.widtht||n>t){const r=Math.min(t/s,t/n);e=Math.floor(s*r);i=Math.floor(n*r);this.#eh||(a=this.#lh(e,i))}}const o=new OffscreenCanvas(e,i).getContext("2d",{willReadFrequently:!0});o.drawImage(a,0,0,a.width,a.height,0,0,e,i);d={width:e,height:i,data:o.getImageData(0,0,e,i).data}}return{canvas:h,width:o,height:l,imageData:d}}#lh(t,e){const{width:i,height:s}=this.#$l;let n=i,r=s,a=this.#$l;for(;n>2*t||r>2*e;){const i=n,s=r;n>2*t&&(n=Math.ceil(n/2));r>2*e&&(r=Math.ceil(r/2));const o=new OffscreenCanvas(n,r);o.getContext("2d").drawImage(a,0,0,i,s,0,0,n,r);a=o.transferToImageBitmap()}return a}#oh(){const[t,e]=this.parentDimensions,{width:i,height:s}=this,n=new OutputScale,r=Math.ceil(i*t*n.sx),a=Math.ceil(s*e*n.sy),o=this.#Jl;if(!o||o.width===r&&o.height===a)return;o.width=r;o.height=a;const l=this.#eh?this.#$l:this.#lh(r,a),h=o.getContext("2d");h.filter=this._uiManager.hcmFilter;h.drawImage(l,0,0,l.width,l.height,0,0,r,a)}#hh(t){if(t){if(this.#eh){const t=this._uiManager.imageManager.getSvgUrl(this.#Xl);if(t)return t}const t=document.createElement("canvas");({width:t.width,height:t.height}=this.#$l);t.getContext("2d").drawImage(this.#$l,0,0);return t.toDataURL()}if(this.#eh){const[t,e]=this.pageDimensions,i=Math.round(this.width*t*PixelsPerInch.PDF_TO_CSS_UNITS),s=Math.round(this.height*e*PixelsPerInch.PDF_TO_CSS_UNITS),n=new OffscreenCanvas(i,s);n.getContext("2d").drawImage(this.#$l,0,0,this.#$l.width,this.#$l.height,0,0,i,s);return n.transferToImageBitmap()}return structuredClone(this.#$l)}static async deserialize(t,e,i){let s=null,n=!1;if(t instanceof StampAnnotationElement){const{data:{rect:r,rotation:a,id:o,structParent:l,popupRef:h,richText:d,contentsObj:c,creationDate:u,modificationDate:p},container:g,parent:{page:{pageNumber:f}},canvas:b}=t;let y,A;if(b){delete t.canvas;({id:y,bitmap:A}=i.imageManager.getFromCanvas(g.id,b));b.remove()}else{n=!0;t._hasNoCanvas=!0}const v=(await e._structTree.getAriaAttributes(`${W}${o}`))?.get("aria-label")||"";s=t={annotationType:m.STAMP,bitmapId:y,bitmap:A,pageIndex:f-1,rect:r.slice(0),rotation:a,annotationElementId:o,id:o,deleted:!1,accessibilityData:{decorative:!1,altText:v},isSvg:!1,structParent:l,popupRef:h,richText:d,comment:c?.str||null,creationDate:u,modificationDate:p}}const r=await super.deserialize(t,e,i),{rect:a,bitmap:o,bitmapUrl:l,bitmapId:h,isSvg:d,accessibilityData:c}=t;if(n){i.addMissingCanvas(t.id,r);r.#Zl=!0}else if(h&&i.imageManager.isValidId(h)){r.#Xl=h;o&&(r.#$l=o)}else r.#Kl=l;r.#eh=d;const[u,p]=r.pageDimensions;r.width=(a[2]-a[0])/u;r.height=(a[3]-a[1])/p;c&&(r.altTextData=c);r._initialData=s;t.comment&&r.setCommentData(t);r.#ih=!!s;return r}serialize(t=!1,e=null){if(this.isEmpty())return null;if(this.deleted)return this.serializeDeleted();const i=Object.assign(super.serialize(t),{bitmapId:this.#Xl,isSvg:this.#eh});this.addComment(i);if(t){i.bitmapUrl=this.#hh(!0);i.accessibilityData=this.serializeAltText(!0);i.isCopy=!0;return i}const{decorative:s,altText:n}=this.serializeAltText(!1);!s&&n&&(i.accessibilityData={type:"Figure",alt:n});if(this.annotationElementId){const t=this.#Qa(i);if(t.isSame)return null;t.isSameAltText?delete i.accessibilityData:i.accessibilityData.structParent=this._initialData.structParent??-1;i.id=this.annotationElementId;delete i.bitmapId;return i}if(null===e)return i;e.stamps||=new Map;const r=this.#eh?(i.rect[2]-i.rect[0])*(i.rect[3]-i.rect[1]):null;if(e.stamps.has(this.#Xl)){if(this.#eh){const t=e.stamps.get(this.#Xl);if(r>t.area){t.area=r;t.serialized.bitmap.close();t.serialized.bitmap=this.#hh(!1)}}}else{e.stamps.set(this.#Xl,{area:r,serialized:i});i.bitmap=this.#hh(!1)}return i}#Qa(t){const{pageIndex:e,accessibilityData:{altText:i}}=this._initialData,s=t.pageIndex===e,n=(t.accessibilityData?.alt||"")===i;return{isSame:!this.hasEditedComment&&!this._hasBeenMoved&&!this._hasBeenResized&&s&&n,isSameAltText:n}}renderAnnotationElement(t){if(this.deleted){t.hide();return null}t.updateEdited({rect:this.getPDFRect(),popup:this.comment});return null}}class AnnotationEditorLayer{#Fa;#dh=!1;#ch=null;#uh=null;#ph=null;#gh=new Map;#mh=!1;#fh=!1;#bh=!1;#yh=null;#Ah=null;#vh=null;#wh=null;#xh=null;#Ch=-1;#y;static _initialized=!1;static#Q=new Map([FreeTextEditor,InkEditor,StampEditor,HighlightEditor,SignatureEditor].map(t=>[t._editorType,t]));constructor({uiManager:t,pageIndex:e,div:i,structTreeLayer:s,accessibilityManager:n,annotationLayer:r,drawLayer:a,textLayer:o,viewport:l,l10n:h}){const d=[...AnnotationEditorLayer.#Q.values()];if(!AnnotationEditorLayer._initialized){AnnotationEditorLayer._initialized=!0;for(const e of d)e.initialize(h,t)}t.registerEditorTypes(d);this.#y=t;this.pageIndex=e;this.div=i;this.#Fa=n;this.#ch=r;this.viewport=l;this.#vh=o;this.drawLayer=a;this._structTree=s;this.#y.addLayer(this)}get isEmpty(){return 0===this.#gh.size}get isInvisible(){return this.isEmpty&&this.#y.getMode()===m.NONE}updateToolbar(t){this.#y.updateToolbar(t)}updateMode(t=this.#y.getMode()){this.#Eh();switch(t){case m.NONE:this.div.classList.toggle("nonEditing",!0);this.disableTextSelection();this.togglePointerEvents(!1);this.toggleAnnotationLayerPointerEvents(!0);this.disableClick();return;case m.INK:this.disableTextSelection();this.togglePointerEvents(!0);this.enableClick();break;case m.HIGHLIGHT:this.enableTextSelection();this.togglePointerEvents(!1);this.disableClick();break;default:this.disableTextSelection();this.togglePointerEvents(!0);this.enableClick()}this.toggleAnnotationLayerPointerEvents(!1);const{classList:e}=this.div;e.toggle("nonEditing",!1);if(t===m.POPUP)e.toggle("commentEditing",!0);else{e.toggle("commentEditing",!1);for(const i of AnnotationEditorLayer.#Q.values())e.toggle(`${i._type}Editing`,t===i._editorType)}this.div.hidden=!1}hasTextLayer(t){return t===this.#vh?.div}setEditingState(t){this.#y.setEditingState(t)}addCommands(t){this.#y.addCommands(t)}cleanUndoStack(t){this.#y.cleanUndoStack(t)}toggleDrawing(t=!1){this.div.classList.toggle("drawing",!t)}togglePointerEvents(t=!1){this.div.classList.toggle("disabled",!t)}toggleAnnotationLayerPointerEvents(t=!1){this.#ch?.togglePointerEvents(t)}get#Th(){return 0!==this.#gh.size?this.#gh.values():this.#y.getEditors(this.pageIndex)}async enable(){this.#bh=!0;this.div.tabIndex=0;this.togglePointerEvents(!0);this.div.classList.toggle("nonEditing",!1);this.#xh?.abort();this.#xh=null;const t=new Set;for(const e of this.#Th){e.enableEditing();e.show(!0);if(e.annotationElementId){this.#y.removeChangedExistingAnnotation(e);t.add(e.annotationElementId)}}const e=this.#ch;if(e)for(const i of e.getEditableAnnotations()){i.hide();if(this.#y.isDeletedAnnotationElement(i.data.id))continue;if(t.has(i.data.id))continue;const e=await this.deserialize(i);if(e){this.addOrRebuild(e);e.enableEditing()}}this.#bh=!1;this.#y._eventBus.dispatch("editorsrendered",{source:this,pageNumber:this.pageIndex+1})}disable(){this.#fh=!0;this.div.tabIndex=-1;this.togglePointerEvents(!1);this.div.classList.toggle("nonEditing",!0);if(this.#vh&&!this.#xh){this.#xh=new AbortController;const t=this.#y.combinedSignal(this.#xh);this.#vh.div.addEventListener("pointerdown",t=>{const{clientX:e,clientY:i,timeStamp:s}=t;if(s-this.#Ch>500){this.#Ch=s;return}this.#Ch=-1;const{classList:n}=this.div;n.toggle("getElements",!0);const r=document.elementsFromPoint(e,i);n.toggle("getElements",!1);if(!this.div.contains(r[0]))return;let a;const o=new RegExp(`^${g}[0-9]+$`);for(const t of r)if(o.test(t.id)){a=t.id;break}if(!a)return;const l=this.#gh.get(a);if(null===l?.annotationElementId){stopEvent(t);l.dblclick(t)}},{signal:t,capture:!0})}const t=this.#ch,e=[];if(t){const i=new Map,s=new Map;for(const t of this.#Th){t.disableEditing();if(t.annotationElementId)if(null===t.serialize()){s.set(t.annotationElementId,t);this.getEditableAnnotation(t.annotationElementId)?.show();t.remove()}else i.set(t.annotationElementId,t);else e.push(t)}for(const e of t.getEditableAnnotations()){const{id:t}=e.data;if(this.#y.isDeletedAnnotationElement(t)){e.updateEdited({deleted:!0});continue}let n=s.get(t);if(n){n.resetAnnotationElement(e);n.show(!1);e.show()}else{n=i.get(t);if(n){this.#y.addChangedExistingAnnotation(n);n.renderAnnotationElement(e)&&n.show(!1)}e.show()}}}this.#Eh();this.isEmpty&&(this.div.hidden=!0);const{classList:i}=this.div;for(const t of AnnotationEditorLayer.#Q.values())i.remove(`${t._type}Editing`);this.disableTextSelection();this.toggleAnnotationLayerPointerEvents(!0);t?.updateFakeAnnotations(e);this.#fh=!1}getEditableAnnotation(t){return this.#ch?.getEditableAnnotation(t)||null}setActiveEditor(t){this.#y.getActive()!==t&&this.#y.setActiveEditor(t)}enableTextSelection(){this.div.tabIndex=-1;if(this.#vh?.div&&!this.#wh){this.#wh=new AbortController;const t=this.#y.combinedSignal(this.#wh);this.#vh.div.addEventListener("pointerdown",this.#Sh.bind(this),{signal:t});this.#vh.div.classList.add("highlighting")}}disableTextSelection(){this.div.tabIndex=0;if(this.#vh?.div&&this.#wh){this.#wh.abort();this.#wh=null;this.#vh.div.classList.remove("highlighting")}}#Sh(t){this.#y.unselectAll();const{target:e}=t;if(e===this.#vh.div||("img"===e.getAttribute("role")||e.classList.contains("endOfContent")||e.classList.contains("textLayerImagePlaceholder"))&&this.#vh.div.contains(e)){const{isMac:e}=FeatureTest.platform;if(0!==t.button||t.ctrlKey&&e)return;this.#y.showAllEditors("highlight",!0,!0);this.#vh.div.classList.add("free");this.toggleDrawing();HighlightEditor.startHighlighting(this,"ltr"===this.#y.direction,{target:this.#vh.div,x:t.x,y:t.y});this.#vh.div.addEventListener("pointerup",()=>{this.#vh.div.classList.remove("free");this.toggleDrawing(!0)},{once:!0,signal:this.#y._signal});t.preventDefault()}}enableClick(){if(this.#uh)return;this.#uh=new AbortController;const t=this.#y.combinedSignal(this.#uh);this.div.addEventListener("pointerdown",this.pointerdown.bind(this),{signal:t});const e=this.pointerup.bind(this);this.div.addEventListener("pointerup",e,{signal:t});this.div.addEventListener("pointercancel",e,{signal:t})}disableClick(){this.#uh?.abort();this.#uh=null}attach(t){this.#gh.set(t.id,t);const{annotationElementId:e}=t;e&&this.#y.isDeletedAnnotationElement(e)&&this.#y.removeDeletedAnnotationElement(t)}detach(t){this.#gh.delete(t.id);this.#Fa?.removePointerInTextLayer(t.contentDiv);!this.#fh&&t.annotationElementId&&this.#y.addDeletedAnnotationElement(t)}remove(t){this.detach(t);this.#y.removeEditor(t);t.div.remove();t.isAttachedToDOM=!1}changeParent(t){if(t.parent!==this){if(t.parent&&t.annotationElementId){this.#y.addDeletedAnnotationElement(t);AnnotationEditor.deleteAnnotationElement(t);t.annotationElementId=null}this.attach(t);t.parent?.detach(t);t.setParent(this);if(t.div&&t.isAttachedToDOM){t.div.remove();this.div.append(t.div)}}}add(t){if(t.parent!==this||!t.isAttachedToDOM){this.changeParent(t);this.#y.addEditor(t);this.attach(t);if(!t.isAttachedToDOM){const e=t.render();this.div.append(e);t.isAttachedToDOM=!0}t.fixAndSetPosition();t.onceAdded(!this.#bh);this.#y.addToAnnotationStorage(t);t._reportTelemetry(t.telemetryInitialData)}}moveEditorInDOM(t){if(!t.isAttachedToDOM)return;const{activeElement:e}=document;if(t.div.contains(e)&&!this.#ph){t._focusEventsAllowed=!1;this.#ph=setTimeout(()=>{this.#ph=null;if(t.div.contains(document.activeElement))t._focusEventsAllowed=!0;else{t.div.addEventListener("focusin",()=>{t._focusEventsAllowed=!0},{once:!0,signal:this.#y._signal});e.focus()}},0)}t._structTreeParentId=this.#Fa?.moveElementInDOM(this.div,t.div,t.contentDiv,!0)}addOrRebuild(t){if(t.needsToBeRebuilt()){t.parent||=this;t.rebuild();t.show()}else this.add(t)}addUndoableEditor(t){this.addCommands({cmd:()=>t._uiManager.rebuild(t),undo:()=>{t.remove()},mustExec:!1})}getEditorByUID(t){for(const e of this.#gh.values())if(e.uid===t)return e;return null}get#_h(){return AnnotationEditorLayer.#Q.get(this.#y.getMode())}combinedSignal(t){return this.#y.combinedSignal(t)}#Ph(t){const e=this.#_h;return e?new e.prototype.constructor(t):null}canCreateNewEmptyEditor(){return this.#_h?.canCreateNewEmptyEditor()}async pasteEditor(t,e){this.updateToolbar(t);await this.#y.updateMode(t.mode);const{offsetX:i,offsetY:s}=this.#Dh(),n=this.#y.getId(),r=this.#Ph({parent:this,id:n,x:i,y:s,uiManager:this.#y,isCentered:!0,...e});r&&this.add(r)}async deserialize(t){return await(AnnotationEditorLayer.#Q.get(t.annotationType??t.annotationEditorType)?.deserialize(t,this,this.#y))||null}createAndAddNewEditor(t,e,i={}){const s=this.#y.getId(),n=this.#Ph({parent:this,id:s,x:t.offsetX,y:t.offsetY,uiManager:this.#y,isCentered:e,...i});n&&this.add(n);return n}get boundingClientRect(){return this.div.getBoundingClientRect()}#Dh(){const{x:t,y:e,width:i,height:s}=this.boundingClientRect,n=Math.max(0,t),r=Math.max(0,e),a=(n+Math.min(window.innerWidth,t+i))/2-t,o=(r+Math.min(window.innerHeight,e+s))/2-e,[l,h]=this.viewport.rotation%180==0?[a,o]:[o,a];return{offsetX:l,offsetY:h}}addNewEditor(t={}){this.createAndAddNewEditor(this.#Dh(),!0,t)}setSelected(t){this.#y.setSelected(t)}toggleSelected(t){this.#y.toggleSelected(t)}unselect(t){this.#y.unselect(t)}pointerup(t){const{isMac:e}=FeatureTest.platform;if(0!==t.button||t.ctrlKey&&e)return;if(t.target!==this.div)return;if(!this.#mh)return;this.#mh=!1;if(this.#_h?.isDrawer&&this.#_h.supportMultipleDrawings)return;if(!this.#dh){this.#dh=!0;return}const i=this.#y.getMode();i!==m.STAMP&&i!==m.POPUP&&i!==m.SIGNATURE?this.createAndAddNewEditor(t,!1):this.#y.unselectAll()}pointerdown(t){this.#y.getMode()===m.HIGHLIGHT&&this.enableTextSelection();if(this.#mh){this.#mh=!1;return}const{isMac:e}=FeatureTest.platform;if(0!==t.button||t.ctrlKey&&e)return;if(t.target!==this.div)return;this.#mh=!0;if(this.#_h?.isDrawer){this.startDrawingSession(t);return}const i=this.#y.getActive();this.#dh=!i||i.isEmpty()}startDrawingSession(t){this.div.focus({preventScroll:!0});if(this.#yh){this.#_h.startDrawing(this,this.#y,!1,t);return}this.#y.setCurrentDrawingSession(this);this.#yh=new AbortController;const e=this.#y.combinedSignal(this.#yh);this.div.addEventListener("blur",({relatedTarget:t})=>{if(t&&!this.div.contains(t)){this.#Ah=null;this.commitOrRemove()}},{signal:e});this.#_h.startDrawing(this,this.#y,!1,t)}pause(t){if(t){const{activeElement:t}=document;this.div.contains(t)&&(this.#Ah=t);return}this.#Ah&&setTimeout(()=>{this.#Ah?.focus();this.#Ah=null},0)}endDrawingSession(t=!1){if(!this.#yh)return null;this.#y.setCurrentDrawingSession(null);this.#yh.abort();this.#yh=null;this.#Ah=null;return this.#_h.endDrawing(t)}findNewParent(t,e,i){const s=this.#y.findParent(e,i);if(null===s||s===this)return!1;s.changeParent(t);return!0}commitOrRemove(){if(this.#yh){this.endDrawingSession();return!0}return!1}onScaleChanging(){this.#yh&&this.#_h.onScaleChangingWhenDrawing(this)}destroy(){this.commitOrRemove();if(this.#y.getActive()?.parent===this){this.#y.commitOrRemove();this.#y.setActiveEditor(null)}if(this.#ph){clearTimeout(this.#ph);this.#ph=null}for(const t of this.#gh.values()){this.#Fa?.removePointerInTextLayer(t.contentDiv);t.setParent(null);t.isAttachedToDOM=!1;t.div.remove()}this.div=null;this.#gh.clear();this.#y.removeLayer(this)}#Eh(){for(const t of this.#gh.values())t.isEmpty()&&t.remove()}async render({viewport:t}){this.viewport=t;setLayerDimensions(this.div,t);for(const t of this.#y.getEditors(this.pageIndex)){this.add(t);t.rebuild()}await this.#y.findClonesForPage(this);this.div.hidden=this.isEmpty;this.updateMode()}update({viewport:t}){this.#y.commitOrRemove();this.#Eh();const e=this.viewport.rotation,i=t.rotation;this.viewport=t;setLayerDimensions(this.div,{rotation:i});if(e!==i)for(const t of this.#gh.values())t.rotate(i)}get pageDimensions(){const{pageWidth:t,pageHeight:e}=this.viewport.rawDims;return[t,e]}get scale(){return this.#y.viewParameters.realScale}}class DrawLayer{#sa=null;#Mh=new Map;#kh=new Map;static#S=0;setParent(t){if(this.#sa){if(this.#sa!==t){if(this.#Mh.size>0)for(const e of this.#Mh.values()){e.remove();t.append(e)}this.#sa=t}}else this.#sa=t}static get _svgFactory(){return shadow(this,"_svgFactory",new DOMSVGFactory)}static#Ih(t,[e,i,s,n]){const{style:r}=t;r.top=100*i+"%";r.left=100*e+"%";r.width=100*s+"%";r.height=100*n+"%"}#Fh(){const t=DrawLayer._svgFactory.create(1,1,!0);this.#sa.append(t);t.setAttribute("aria-hidden",!0);return t}#Bh(t,e){const i=DrawLayer._svgFactory.createElement("clipPath");t.append(i);const s=`clip_${e}`;i.setAttribute("id",s);i.setAttribute("clipPathUnits","objectBoundingBox");const n=DrawLayer._svgFactory.createElement("use");i.append(n);n.setAttribute("href",`#${e}`);n.classList.add("clip");return s}#Rh(t,e){for(const[i,s]of Object.entries(e))null===s?t.removeAttribute(i):t.setAttribute(i,s)}draw(t,e=!1,i=!1){const s=DrawLayer.#S++,n=this.#Fh(),r=DrawLayer._svgFactory.createElement("defs");n.append(r);const a=DrawLayer._svgFactory.createElement("path");r.append(a);const o=`path_${s}`;a.setAttribute("id",o);a.setAttribute("vector-effect","non-scaling-stroke");e&&this.#kh.set(s,a);const l=i?this.#Bh(r,o):null,h=DrawLayer._svgFactory.createElement("use");n.append(h);h.setAttribute("href",`#${o}`);this.updateProperties(n,t);this.#Mh.set(s,n);return{id:s,clipPathId:`url(#${l})`}}drawOutline(t,e){const i=DrawLayer.#S++,s=this.#Fh(),n=DrawLayer._svgFactory.createElement("defs");s.append(n);const r=DrawLayer._svgFactory.createElement("path");n.append(r);const a=`path_${i}`;r.setAttribute("id",a);r.setAttribute("vector-effect","non-scaling-stroke");let o;if(e){const t=DrawLayer._svgFactory.createElement("mask");n.append(t);o=`mask_${i}`;t.setAttribute("id",o);t.setAttribute("maskUnits","objectBoundingBox");const e=DrawLayer._svgFactory.createElement("rect");t.append(e);e.setAttribute("width","1");e.setAttribute("height","1");e.setAttribute("fill","white");const s=DrawLayer._svgFactory.createElement("use");t.append(s);s.setAttribute("href",`#${a}`);s.setAttribute("stroke","none");s.setAttribute("fill","black");s.setAttribute("fill-rule","nonzero");s.classList.add("mask")}const l=DrawLayer._svgFactory.createElement("use");s.append(l);l.setAttribute("href",`#${a}`);o&&l.setAttribute("mask",`url(#${o})`);const h=l.cloneNode();s.append(h);l.classList.add("mainOutline");h.classList.add("secondaryOutline");this.updateProperties(s,t);this.#Mh.set(i,s);return i}finalizeDraw(t,e){this.#kh.delete(t);this.updateProperties(t,e)}updateProperties(t,e){if(!e)return;const{root:i,bbox:s,rootClass:n,path:r}=e,a="number"==typeof t?this.#Mh.get(t):t;if(a){i&&this.#Rh(a,i);s&&DrawLayer.#Ih(a,s);if(n){const{classList:t}=a;for(const[e,i]of Object.entries(n))t.toggle(e,i)}if(r){const t=a.firstElementChild.firstElementChild;this.#Rh(t,r)}}}updateParent(t,e){if(e===this)return;const i=this.#Mh.get(t);if(i){e.#sa.append(i);this.#Mh.delete(t);e.#Mh.set(t,i)}}remove(t){this.#kh.delete(t);if(null!==this.#sa){this.#Mh.get(t).remove();this.#Mh.delete(t)}}destroy(){this.#sa=null;for(const t of this.#Mh.values())t.remove();this.#Mh.clear();this.#kh.clear()}}function percentage(t){return`${(100*t).toFixed(2)}%`}class TextLayerImages{#Oh=[];#Lh=new Map;#Nh=null;#Uh=0;#Dn=0;#Pn=0;static#Hh=null;constructor(t,e,i,s){this.#Uh=t;this.#Oh=e;this.#Dn=i.rawDims.pageWidth;this.#Pn=i.rawDims.pageHeight;this.#Nh=s}render(){const t=document.createElement("div");t.className="textLayerImages";for(let e=0;e{if(!(t.target instanceof HTMLCanvasElement))return;const e=t.target,i=this.#Lh.get(e);if(!i)return;const s=TextLayerImages.#Hh?.deref();if(s===e)return;if(s){s.width=0;s.height=0}TextLayerImages.#Hh=new WeakRef(e);const{inverseTransform:n,x1:r,y1:a,width:o,height:l}=i,h=this.#Nh(),d=Math.ceil(r*h.width),c=Math.ceil(a*h.height),u=Math.floor((r+o/this.#Dn)*h.width),p=Math.floor((a+l/this.#Pn)*h.height);e.width=u-d;e.height=p-c;const g=e.getContext("2d");g.setTransform(...n);g.translate(-d,-c);g.drawImage(h,0,0)});return t}#zh([t,e,i,s,n,r]){const a=Math.hypot((n-t)*this.#Dn,(r-e)*this.#Pn),o=Math.hypot((i-t)*this.#Dn,(s-e)*this.#Pn);if(a=ce&&console.info(`Info: ${e}`)}function warn(e){ta>=fe&&console.warn(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function assert(e,t){e||unreachable(t)}function createValidAbsoluteUrl(e,t=null,a=null){if(!e)return null;if(a&&"string"==typeof e){if(a.addDefaultProtocol&&e.startsWith("www.")){const t=e.match(/\./g);t?.length>=2&&(e=`http://${e}`)}if(a.tryConvertEncoding)try{e=stringToUTF8String(e)}catch{}}const n=t?URL.parse(e,t):URL.parse(e);return function _isValidProtocol(e){switch(e?.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(n)?n:null}function shadow(e,t,a,n=!1){Object.defineProperty(e,t,{value:a,enumerable:!n,configurable:!0,writable:!1});return a}const aa=function BaseExceptionClosure(){function BaseException(e,t){this.message=e;this.name=t}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();class PasswordException extends aa{constructor(e,t){super(e,"PasswordException");this.code=t}}class UnknownErrorException extends aa{constructor(e,t){super(e,"UnknownErrorException");this.details=t}}class InvalidPDFException extends aa{constructor(e){super(e,"InvalidPDFException")}}class ResponseException extends aa{constructor(e,t,a){super(e,"ResponseException");this.status=t;this.missing=a}}class FormatError extends aa{constructor(e){super(e,"FormatError")}}class AbortException extends aa{constructor(e){super(e,"AbortException")}}function bytesToString(e){"object"==typeof e&&void 0!==e?.length||unreachable("Invalid argument for bytesToString");const t=e.length,a=8192;if(t{if("undefined"==typeof document)return!1;const e=document.createElement("input");e.type="color";e.setAttribute("alpha","");e.value="#ff000080";return"#ff0000"!==e.value})())}}class Util{static get hexNums(){return shadow(this,"hexNums",Array.from(Array(256).keys(),e=>e.toString(16).padStart(2,"0")))}static makeHexColor(e,t,a){return`#${this.hexNums[e]}${this.hexNums[t]}${this.hexNums[a]}`}static domMatrixToTransform(e){return[e.a,e.b,e.c,e.d,e.e,e.f]}static scaleMinMax(e,t){let a;if(e[0]){if(e[0]<0){a=t[0];t[0]=t[2];t[2]=a}t[0]*=e[0];t[2]*=e[0];if(e[3]<0){a=t[1];t[1]=t[3];t[3]=a}t[1]*=e[3];t[3]*=e[3]}else{a=t[0];t[0]=t[1];t[1]=a;a=t[2];t[2]=t[3];t[3]=a;if(e[1]<0){a=t[1];t[1]=t[3];t[3]=a}t[1]*=e[1];t[3]*=e[1];if(e[2]<0){a=t[0];t[0]=t[2];t[2]=a}t[0]*=e[2];t[2]*=e[2]}t[0]+=e[4];t[1]+=e[5];t[2]+=e[4];t[3]+=e[5]}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static multiplyByDOMMatrix(e,t){return[e[0]*t.a+e[2]*t.b,e[1]*t.a+e[3]*t.b,e[0]*t.c+e[2]*t.d,e[1]*t.c+e[3]*t.d,e[0]*t.e+e[2]*t.f+e[4],e[1]*t.e+e[3]*t.f+e[5]]}static applyTransform(e,t,a=0){const n=e[a],s=e[a+1];e[a]=n*t[0]+s*t[2]+t[4];e[a+1]=n*t[1]+s*t[3]+t[5]}static applyTransformToBezier(e,t,a=0){const n=t[0],s=t[1],r=t[2],i=t[3],o=t[4],l=t[5];for(let t=0;t<6;t+=2){const f=e[a+t],c=e[a+t+1];e[a+t]=f*n+c*r+o;e[a+t+1]=f*s+c*i+l}}static applyInverseTransform(e,t){const a=e[0],n=e[1],s=t[0]*t[3]-t[1]*t[2];e[0]=(a*t[3]-n*t[2]+t[2]*t[5]-t[4]*t[3])/s;e[1]=(-a*t[1]+n*t[0]+t[4]*t[1]-t[5]*t[0])/s}static axialAlignedBoundingBox(e,t,a){const n=t[0],s=t[1],r=t[2],i=t[3],o=t[4],l=t[5],f=e[0],c=e[1],h=e[2],u=e[3];let m=n*f+o,p=m,d=n*h+o,g=d,b=i*c+l,w=b,j=i*u+l,k=j;if(0!==s||0!==r){const e=s*f,t=s*h,a=r*c,n=r*u;m+=a;g+=a;d+=n;p+=n;b+=e;k+=e;j+=t;w+=t}a[0]=Math.min(a[0],m,d,p,g);a[1]=Math.min(a[1],b,j,w,k);a[2]=Math.max(a[2],m,d,p,g);a[3]=Math.max(a[3],b,j,w,k)}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static singularValueDecompose2dScale(e,t){const a=e[0],n=e[1],s=e[2],r=e[3],i=a**2+n**2,o=a*s+n*r,l=s**2+r**2,f=(i+l)/2,c=Math.sqrt(f**2-(i*l-o**2));t[0]=Math.sqrt(f+c||1);t[1]=Math.sqrt(f-c||1)}static normalizeRect(e){const t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t}static intersect(e,t){const a=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),n=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(a>n)return null;const s=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),r=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return s>r?null:[a,s,n,r]}static pointBoundingBox(e,t,a){a[0]=Math.min(a[0],e);a[1]=Math.min(a[1],t);a[2]=Math.max(a[2],e);a[3]=Math.max(a[3],t)}static rectBoundingBox(e,t,a,n,s){s[0]=Math.min(s[0],e,a);s[1]=Math.min(s[1],t,n);s[2]=Math.max(s[2],e,a);s[3]=Math.max(s[3],t,n)}static#e(e,t,a,n,s,r,i,o,l,f){if(l<=0||l>=1)return;const c=1-l,h=l*l,u=h*l,m=c*(c*(c*e+3*l*t)+3*h*a)+u*n,p=c*(c*(c*s+3*l*r)+3*h*i)+u*o;f[0]=Math.min(f[0],m);f[1]=Math.min(f[1],p);f[2]=Math.max(f[2],m);f[3]=Math.max(f[3],p)}static#t(e,t,a,n,s,r,i,o,l,f,c,h){if(Math.abs(l)<1e-12){Math.abs(f)>=1e-12&&this.#e(e,t,a,n,s,r,i,o,-c/f,h);return}const u=f**2-4*c*l;if(u<0)return;const m=Math.sqrt(u),p=2*l;this.#e(e,t,a,n,s,r,i,o,(-f+m)/p,h);this.#e(e,t,a,n,s,r,i,o,(-f-m)/p,h)}static bezierBoundingBox(e,t,a,n,s,r,i,o,l){l[0]=Math.min(l[0],e,i);l[1]=Math.min(l[1],t,o);l[2]=Math.max(l[2],e,i);l[3]=Math.max(l[3],t,o);this.#t(e,a,s,i,t,n,r,o,3*(3*(a-s)-e+i),6*(e-2*a+s),3*(a-e),l);this.#t(e,a,s,i,t,n,r,o,3*(3*(n-r)-t+o),6*(t-2*n+r),3*(n-t),l)}}const na=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function stringToPDFString(e,t=!1){if(e[0]>="ï"){let a;if("þ"===e[0]&&"ÿ"===e[1]){a="utf-16be";e.length%2==1&&(e=e.slice(0,-1))}else if("ÿ"===e[0]&&"þ"===e[1]){a="utf-16le";e.length%2==1&&(e=e.slice(0,-1))}else"ï"===e[0]&&"»"===e[1]&&"¿"===e[2]&&(a="utf-8");if(a)try{const n=new TextDecoder(a,{fatal:!0}),s=stringToBytes(e),r=n.decode(s);return t||!r.includes("")?r:r.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g,"")}catch(e){warn(`stringToPDFString: "${e}".`)}}const a=[];for(let n=0,s=e.length;n[],makeMap=()=>new Map,makeObj=()=>Object.create(null),ia=Symbol("CIRCULAR_REF"),oa=Symbol("EOF");let la=Object.create(null),fa=Object.create(null),ca=Object.create(null);class Name{constructor(e){this.name=e}static get(e){return fa[e]||=new Name(e)}}class Cmd{constructor(e){this.cmd=e}static get(e){return la[e]||=new Cmd(e)}}const ha=function nonSerializableClosure(){return ha};class Dict{__nonSerializable__=ha;#a=new Map;objId=null;suppressEncryption=!1;xref;constructor(e=null){this.xref=e}assignXref(e){this.xref=e}get size(){return this.#a.size}#n(e,t,a,n){let s=this.#a.get(t);if(void 0===s&&void 0!==a){s=this.#a.get(a);void 0===s&&void 0!==n&&(s=this.#a.get(n))}return s instanceof Ref&&this.xref?e?this.xref.fetchAsync(s,this.suppressEncryption):this.xref.fetch(s,this.suppressEncryption):s}get(e,t,a){return this.#n(!1,e,t,a)}async getAsync(e,t,a){return this.#n(!0,e,t,a)}getArray(e,t,a){let n=this.#n(!1,e,t,a);if(Array.isArray(n)){n=n.slice();for(let e=0,t=n.length;e{unreachable("Should not call `set` on the empty dictionary.")};return shadow(this,"empty",e)}static merge({xref:e,dictArray:t,mergeSubDicts:a=!1}){const n=new Dict(e),s=new Map;for(const e of t)if(e instanceof Dict)for(const[t,n]of e.getRawEntries()){let e=s.get(t);if(void 0===e){e=[];s.set(t,e)}else if(!(a&&n instanceof Dict))continue;e.push(n)}for(const[t,a]of s){if(1===a.length||!(a[0]instanceof Dict)){n.set(t,a[0]);continue}const s=new Dict(e);for(const e of a)for(const[t,a]of e.getRawEntries())s.setIfNotExists(t,a);s.size>0&&n.set(t,s)}s.clear();return n.size>0?n:Dict.empty}clone(){const e=new Dict(this.xref);for(const[t,a]of this.#a)e.set(t,a);return e}delete(e){this.#a.delete(e)}}class Ref{constructor(e,t){this.num=e;this.gen=t}toString(){return 0===this.gen?`${this.num}R`:`${this.num}R${this.gen}`}static fromString(e){const t=ca[e];if(t)return t;const a=/^(\d+)R(\d*)$/.exec(e);return a&&"0"!==a[1]?ca[e]=new Ref(parseInt(a[1],10),a[2]?parseInt(a[2],10):0):null}static get(e,t){const a=0===t?`${e}R`:`${e}R${t}`;return ca[a]||=new Ref(e,t)}}class RefSet{constructor(e=null){this._set=new Set(e?._set)}has(e){return this._set.has(e.toString())}put(e){this._set.add(e.toString())}remove(e){this._set.delete(e.toString())}[Symbol.iterator](){return this._set.values()}clear(){this._set.clear()}}class RefSetCache{_map=new Map;get size(){return this._map.size}get(e){return this._map.get(e.toString())}has(e){return this._map.has(e.toString())}put(e,t){this._map.set(e.toString(),t)}putAlias(e,t){this._map.set(e.toString(),this.get(t))}[Symbol.iterator](){return this._map.values()}clear(){this._map.clear()}*values(){yield*this._map.values()}*items(){for(const[e,t]of this._map)yield[Ref.fromString(e),t]}*keys(){for(const e of this._map.keys())yield Ref.fromString(e)}}function isName(e,t){return e instanceof Name&&(void 0===t||e.name===t)}function isCmd(e,t){return e instanceof Cmd&&(void 0===t||e.cmd===t)}function isDict(e,t){return e instanceof Dict&&(void 0===t||isName(e.get("Type"),t))}function isRefsEqual(e,t){return e.num===t.num&&e.gen===t.gen}class BaseStream{get length(){unreachable("Abstract getter `length` accessed")}get isEmpty(){unreachable("Abstract getter `isEmpty` accessed")}get isDataLoaded(){return shadow(this,"isDataLoaded",!0)}getByte(){unreachable("Abstract method `getByte` called")}getBytes(e){unreachable("Abstract method `getBytes` called")}async getImageData(e,t){return this.getBytes(e,t)}async asyncGetBytes(){unreachable("Abstract method `asyncGetBytes` called")}get isAsync(){return!1}get isAsyncDecoder(){return!1}get isImageStream(){return!1}get canAsyncDecodeImageFromBuffer(){return!1}async getTransferableImage(){return null}peekByte(){const e=this.getByte();-1!==e&&this.pos--;return e}peekBytes(e){const t=this.getBytes(e);this.pos-=t.length;return t}getUint16(){const e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t}getInt32(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()}getByteRange(e,t){unreachable("Abstract method `getByteRange` called")}getString(e){return bytesToString(this.getBytes(e))}skip(e){this.pos+=e||1}reset(){unreachable("Abstract method `reset` called")}moveStart(){unreachable("Abstract method `moveStart` called")}makeSubStream(e,t,a=null){unreachable("Abstract method `makeSubStream` called")}getBaseStreams(){return null}getOriginalStream(){return this.stream?.getOriginalStream()||this}}const ua=/^[1-9]\.\d$/,ma=2**31-1,pa=[1,0,0,1,0,0],da=["ColorSpace","ExtGState","Font","Pattern","Properties","Shading","XObject"],ga=["ExtGState","Font","Properties","XObject"];function getLookupTableFactory(e){let t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}}class MissingDataException extends aa{constructor(e,t){super(`Missing data [${e}, ${t})`,"MissingDataException");this.begin=e;this.end=t}}class ParserEOFException extends aa{constructor(e){super(e,"ParserEOFException")}}class XRefEntryException extends aa{constructor(e){super(e,"XRefEntryException")}}class XRefParseException extends aa{constructor(e){super(e,"XRefParseException")}}function arrayBuffersToBytes(e){const t=e.length;if(0===t)return new Uint8Array(0);if(1===t)return new Uint8Array(e[0]);let a=0;for(let n=0;n0,"The number should be a positive integer.");const a="M".repeat(e/1e3|0)+ba[e%1e3/100|0]+ba[10+(e%100/10|0)]+ba[20+e%10];return t?a.toLowerCase():a}function isWhiteSpace(e){return 32===e||9===e||13===e||10===e}function isNumberArray(e,t){return Array.isArray(e)?(null===t||e.length===t)&&e.every(e=>"number"==typeof e):ArrayBuffer.isView(e)&&!(e instanceof BigInt64Array||e instanceof BigUint64Array)&&(null===t||e.length===t)}function lookupMatrix(e,t){return isNumberArray(e,6)?e:t}function lookupRect(e,t){return isNumberArray(e,4)?e:t}function lookupNormalRect(e,t){return isNumberArray(e,4)?Util.normalizeRect(e):t}function parseXFAPath(e){const t=/(.+)\[(\d+)\]$/;return e.split(".").map(e=>{const a=e.match(t);return a?{name:a[1],pos:parseInt(a[2],10)}:{name:e,pos:0}})}function escapePDFName(e){const t=[];let a=0;for(let n=0,s=e.length;n126||35===s||40===s||41===s||60===s||62===s||91===s||93===s||123===s||125===s||47===s||37===s){a"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`)}function _collectJS(e,t,a,n){if(!e)return;let s=null;if(e instanceof Ref){if(n.has(e))return;s=e;n.put(s);e=t.fetch(e)}if(Array.isArray(e))for(const s of e)_collectJS(s,t,a,n);else if(e instanceof Dict){if(isName(e.get("S"),"JavaScript")){const t=e.get("JS");let n;t instanceof BaseStream?n=t.getString():"string"==typeof t&&(n=t);n&&=stringToPDFString(n,!0).replaceAll("\0","");n&&a.push(n.trim())}_collectJS(e.getRaw("Next"),t,a,n)}s&&n.remove(s)}function collectActions(e,t,a){const n=Object.create(null),s=getInheritableProperty({dict:t,key:"AA",stopWhenFound:!1});if(s)for(let t=s.length-1;t>=0;t--){const r=s[t];if(r instanceof Dict)for(const[t,s]of r.getRawEntries()){const r=a[t];if(!r)continue;const i=[];_collectJS(s,e,i,new RefSet);i.length>0&&(n[r]=i)}}if(t.has("A")){const a=[];_collectJS(t.get("A"),e,a,new RefSet);a.length>0&&(n.Action=a)}return objectSize(n)>0?n:null}const wa={60:"<",62:">",38:"&",34:""",39:"'"};function*codePointIter(e){for(let t=0,a=e.length;t55295&&(a<57344||a>65533)&&t++;yield a}}function encodeToXmlString(e){const t=[];let a=0;for(let n=0,s=e.length;n55295&&(s<57344||s>65533)&&n++;a=n+1}}if(0===t.length)return e;a: ${e}.`);return!1}return!0}function validateCSSFont(e){const t=new Set(["100","200","300","400","500","600","700","800","900","1000","normal","bold","bolder","lighter"]),{fontFamily:a,fontWeight:n,italicAngle:s}=e;if(!validateFontName(a,!0))return!1;const r=n?n.toString():"";e.fontWeight=t.has(r)?r:"400";const i=parseFloat(s);e.italicAngle=isNaN(i)||i<-90||i>90?"14":s.toString();return!0}function recoverJsURL(e){const t=new RegExp("^\\s*("+["app.launchURL","window.open","xfa.host.gotoURL"].join("|").replaceAll(".","\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec(e);return t?.[2]?{url:t[2],newWindow:"app.launchURL"===t[1]&&"true"===t[3]}:null}function numberToString(e){if(Number.isInteger(e))return e.toString();const t=Math.round(100*e);return t%100==0?(t/100).toString():t%10==0?e.toFixed(1):e.toFixed(2)}function getNewAnnotationsMap(e){if(!e)return null;const t=new Map;for(const[a,n]of e)a.startsWith(d)&&t.getOrInsertComputed(n.pageIndex,makeArr).push(n);return t.size>0?t:null}function stringToAsciiOrUTF16BE(e){return null==e||function isAscii(e){if("string"!=typeof e)return!1;return!e||/^[\x00-\x7F]*$/.test(e)}(e)?e:stringToUTF16String(e,!0)}function stringToUTF16HexString(e){const t=[];for(let a=0,n=e.length;a>8&255],Util.hexNums[255&n])}return t.join("")}function stringToUTF16String(e,t=!1){const a=[];t&&a.push("þÿ");for(let t=0,n=e.length;t>8&255),String.fromCharCode(255&n))}return a.join("")}function getRotationMatrix(e,t,a){switch(e){case 90:return[0,1,-1,0,t,0];case 180:return[-1,0,0,-1,t,a];case 270:return[0,-1,1,0,0,a];default:throw new Error("Invalid rotation")}}function getSizeInBytes(e){return Math.ceil(Math.ceil(Math.log2(1+e))/8)}class QCMS{static#s=null;static _memory=null;static _mustAddAlpha=!1;static _destBuffer=null;static _destOffset=0;static _destLength=0;static _cssColor="";static _makeHexColor=null;static get _memoryArray(){const e=this.#s;return e?.byteLength?e:this.#s=new Uint8Array(this._memory.buffer)}}const ja=Object.freeze({RGB8:0,0:"RGB8",RGBA8:1,1:"RGBA8",BGRA8:2,2:"BGRA8",Gray8:3,3:"Gray8",GrayA8:4,4:"GrayA8",CMYK:5,5:"CMYK"}),ka=Object.freeze({Perceptual:0,0:"Perceptual",RelativeColorimetric:1,1:"RelativeColorimetric",Saturation:2,2:"Saturation",AbsoluteColorimetric:3,3:"AbsoluteColorimetric"});function __wbg_get_imports(){return{__proto__:null,"./qcms_bg.js":{__proto__:null,__wbg___wbindgen_throw_6b64449b9b9ed33c:function(e,t){throw new Error(function getStringFromWasm0(e,t){return function decodeText(e,t){Sa+=t;if(Sa>=va){qa=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});qa.decode();Sa=t}return qa.decode(getUint8ArrayMemory0().subarray(e,e+t))}(e>>>=0,t)}(e,t))},__wbg_copy_result_0d15f3bf9d9012ae:function(e,t){!function copy_result(e,t){const{_mustAddAlpha:a,_destBuffer:n,_destOffset:s,_destLength:r,_memoryArray:i}=QCMS;if(t!==r)if(a)for(let a=e,r=e+t,o=s;a>>0,t>>>0)},__wbg_copy_rgb_0106d9d9464fce43:function(e){!function copy_rgb(e){const{_destBuffer:t,_destOffset:a,_memoryArray:n}=QCMS;t[a]=n[e];t[a+1]=n[e+1];t[a+2]=n[e+2]}(e>>>0)},__wbg_make_cssRGB_8e24b34f71f5363e:function(e){!function make_cssRGB(e){const{_memoryArray:t}=QCMS;QCMS._cssColor=QCMS._makeHexColor(t[e],t[e+1],t[e+2])}(e>>>0)},__wbindgen_init_externref_table:function(){const e=xa.__wbindgen_externrefs,t=e.grow(4);e.set(0,void 0);e.set(t+0,void 0);e.set(t+1,null);e.set(t+2,!0);e.set(t+3,!1)}}}}let ya=null;function getUint8ArrayMemory0(){null!==ya&&0!==ya.byteLength||(ya=new Uint8Array(xa.memory.buffer));return ya}function passArray8ToWasm0(e,t){const a=t(1*e.length,1)>>>0;getUint8ArrayMemory0().set(e,a/1);Ca=e.length;return a}let qa=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});qa.decode();const va=2146435072;let Sa=0;let Aa,xa,Ca=0;function __wbg_finalize_init(e,t){xa=e.exports;Aa=t;ya=null;xa.__wbindgen_start();return xa}function MathClamp(e,t,a){return Math.min(Math.max(e,t),a)}function isDefaultDecodeHelper(e,t){if(!Array.isArray(e))return!0;const a=e.length;if(at){info("Truncating too long decode map.");e.length=t}return!1}class ColorSpace{static#r=new Uint8ClampedArray(3);constructor(e,t){this.name=e;this.numComps=t}getRgb(e,t,a=new Uint8ClampedArray(3)){this.getRgbItem(e,t,a,0);return a}getRgbHex(e,t){const a=this.getRgb(e,t,ColorSpace.#r);return Util.makeHexColor(a[0],a[1],a[2])}getRgbItem(e,t,a,n){unreachable("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,a,n,s,r,i){unreachable("Should not call ColorSpace.getRgbBuffer")}getOutputLength(e,t){unreachable("Should not call ColorSpace.getOutputLength")}isPassthrough(e){return!1}isDefaultDecode(e,t){return ColorSpace.isDefaultDecode(e,this.numComps)}fillRgb(e,t,a,n,s,r,i,o,l){const f=t*a;let c=null;const h=1<h&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){const t=i<=8?new Uint8Array(h):new Uint16Array(h);for(let e=0;e=.99554525?1:MathClamp(1.055*e**(1/2.4)-.055,0,1)}#j(e){return e<0?-this.#j(-e):e>8?((e+16)/116)**3:e*CalRGBCS.#p}#k(e,t,a){if(0===e[0]&&0===e[1]&&0===e[2]){a[0]=t[0];a[1]=t[1];a[2]=t[2];return}const n=this.#j(0),s=(1-n)/(1-this.#j(e[0])),r=1-s,i=(1-n)/(1-this.#j(e[1])),o=1-i,l=(1-n)/(1-this.#j(e[2])),f=1-l;a[0]=t[0]*s+r;a[1]=t[1]*i+o;a[2]=t[2]*l+f}#y(e,t,a){if(1===e[0]&&1===e[2]){a[0]=t[0];a[1]=t[1];a[2]=t[2];return}const n=a;this.#d(CalRGBCS.#o,t,n);const s=CalRGBCS.#h;this.#g(e,n,s);this.#d(CalRGBCS.#l,s,a)}#q(e,t,a){const n=a;this.#d(CalRGBCS.#o,t,n);const s=CalRGBCS.#h;this.#b(e,n,s);this.#d(CalRGBCS.#l,s,a)}#i(e,t,a,n,s){const r=MathClamp(e[t]*s,0,1),i=MathClamp(e[t+1]*s,0,1),o=MathClamp(e[t+2]*s,0,1),l=1===r?1:r**this.GR,f=1===i?1:i**this.GG,c=1===o?1:o**this.GB,h=this.MXA*l+this.MXB*f+this.MXC*c,u=this.MYA*l+this.MYB*f+this.MYC*c,m=this.MZA*l+this.MZB*f+this.MZC*c,p=CalRGBCS.#u;p[0]=h;p[1]=u;p[2]=m;const d=CalRGBCS.#m;this.#y(this.whitePoint,p,d);const g=CalRGBCS.#u;this.#k(this.blackPoint,d,g);const b=CalRGBCS.#m;this.#q(CalRGBCS.#c,g,b);const w=CalRGBCS.#u;this.#d(CalRGBCS.#f,b,w);a[n]=255*this.#w(w[0]);a[n+1]=255*this.#w(w[1]);a[n+2]=255*this.#w(w[2])}getRgbItem(e,t,a,n){this.#i(e,t,a,n,1)}getRgbBuffer(e,t,a,n,s,r,i){const o=1/((1<this.amax||this.bmin>this.bmax){info("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}#v(e){return e>=6/29?e**3:108/841*(e-4/29)}#S(e,t,a,n){return a+e*(n-a)/t}#i(e,t,a,n,s){let r=e[t],i=e[t+1],o=e[t+2];if(!1!==a){r=this.#S(r,a,0,100);i=this.#S(i,a,this.amin,this.amax);o=this.#S(o,a,this.bmin,this.bmax)}i>this.amax?i=this.amax:ithis.bmax?o=this.bmax:ofunction qcms_convert_one(e,t,a){xa.qcms_convert_one(e,t,a)}(this.#A,255*e[t],a);break;case 3:n=ja.RGB8;this.#x=(e,t,a)=>function qcms_convert_three(e,t,a,n,s){xa.qcms_convert_three(e,t,a,n,s)}(this.#A,255*e[t],255*e[t+1],255*e[t+2],a);break;case 4:n=ja.CMYK;this.#x=(e,t,a)=>function qcms_convert_four(e,t,a,n,s,r){xa.qcms_convert_four(e,t,a,n,s,r)}(this.#A,255*e[t],255*e[t+1],255*e[t+2],255*e[t+3],a);break;default:throw new Error(`Unsupported number of components: ${a}`)}this.#A=function qcms_transformer_from_memory(e,t,a){const n=passArray8ToWasm0(e,xa.__wbindgen_malloc),s=Ca;return xa.qcms_transformer_from_memory(n,s,t,a)>>>0}(e,n,ka.Perceptual);if(!this.#A)throw new Error("Failed to create ICC color space");IccColorSpace.#F||=new FinalizationRegistry(e=>{!function qcms_drop_transformer(e){xa.qcms_drop_transformer(e)}(e)});IccColorSpace.#F.register(this,this.#A)}getRgbHex(e,t){this.#x(e,t,!0);return QCMS._cssColor}getRgbItem(e,t,a,n){QCMS._destBuffer=a;QCMS._destOffset=n;QCMS._destLength=3;this.#x(e,t,!1);QCMS._destBuffer=null}getRgbBuffer(e,t,a,n,s,r,i){e=e.subarray(t,t+a*this.numComps);if(8!==r){const t=255/((1<=this.end?-1:this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,n=this.end;if(!e){this.pos=n;return t.subarray(a,n)}let s=a+e;s>n&&(s=n);this.pos=s;return t.subarray(a,s)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);return this.bytes.subarray(e,t)}reset(){this.pos=this.start}moveStart(){this.start=this.pos}makeSubStream(e,t,a=null){return new Stream(this.bytes.buffer,e,t,a)}clone(){return new Stream(this.bytes.buffer,this.start,this.end-this.start,this.dict.clone())}}class StringStream extends Stream{constructor(e){super(stringToBytes(e))}}class NullStream extends Stream{constructor(){super(new Uint8Array(0))}}class ChunkedStream extends Stream{progressiveDataLength=0;_lastSuccessfulEnsureByteChunk=-1;_loadedChunks=new Set;constructor(e,t,a){super(new Uint8Array(e),0,e,null);this.chunkSize=t;this.numChunks=Math.ceil(e/t);this.manager=a}getMissingChunks(){const e=[];for(let t=0,a=this.numChunks;t=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(let e=a;ethis.numChunks)&&t!==this._lastSuccessfulEnsureByteChunk){if(!this._loadedChunks.has(t))throw new MissingDataException(e,e+1);this._lastSuccessfulEnsureByteChunk=t}}ensureRange(e,t){if(e>=t)return;if(t<=this.progressiveDataLength)return;const a=Math.floor(e/this.chunkSize);if(a>this.numChunks)return;const n=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let s=a;s=this.end)return-1;e>=this.progressiveDataLength&&this.ensureByte(e);return this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,n=this.end;if(!e){n>this.progressiveDataLength&&this.ensureRange(a,n);this.pos=n;return t.subarray(a,n)}let s=a+e;s>n&&(s=n);s>this.progressiveDataLength&&this.ensureRange(a,s);this.pos=s;return t.subarray(a,s)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);t>this.progressiveDataLength&&this.ensureRange(e,t);return this.bytes.subarray(e,t)}makeSubStream(e,t,a=null){t?e+t>this.progressiveDataLength&&this.ensureRange(e,e+t):e>=this.progressiveDataLength&&this.ensureByte(e);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){const e=this.chunkSize,t=Math.floor(this.start/e),a=Math.floor((this.end-1)/e)+1,n=[];for(let e=t;e0){const e=this.groupChunks(s);for(const t of e){const e=t.beginChunk*this.chunkSize,a=Math.min(t.endChunk*this.chunkSize,this.length);this.sendRequest(e,a).catch(n.reject)}}return n.promise.catch(e=>{if(!this.aborted)throw e})}getStream(){return this.stream}requestRange(e,t){t=Math.min(t,this.length);const a=this.getBeginChunk(e),n=this.getEndChunk(t),s=[];for(let e=a;ee-t);return this._requestChunks(t)}groupChunks(e){const t=[];let a=-1,n=-1;for(let s=0,r=e.length;s=0&&n+1!==r){t.push({beginChunk:a,endChunk:n+1});a=r}s+1===e.length&&t.push({beginChunk:a,endChunk:r+1});n=r}return t}onReceiveData(e){const{chunkSize:t,length:a,stream:n}=this,s=e.chunk,r=void 0===e.begin,i=r?n.progressiveDataLength:e.begin,o=i+s.byteLength,l=Math.floor(i/t),f=o0||c.push(a)}}}if(!this.disableAutoFetch&&0===this._requestsByChunk.size){let e;if(1===n.numChunksLoaded){const t=n.numChunks-1;n.hasChunk(t)||(e=t)}else e=n.nextEmptyChunk(f);Number.isInteger(e)&&this._requestChunks([e])}for(const e of c){const t=this._promisesByRequest.get(e);this._promisesByRequest.delete(e);t.resolve()}this.msgHandler.send("DocProgress",{loaded:MathClamp(n.numChunksLoaded*t,n.progressiveDataLength,a),total:a})}onError(e){this._loadedStreamCapability.reject(e)}getBeginChunk(e){return Math.floor(e/this.chunkSize)}getEndChunk(e){return Math.floor((e-1)/this.chunkSize)+1}abort(e){this.aborted=!0;this.pdfStream?.cancelAllRequests(e);for(const t of this._promisesByRequest.values())t.reject(e)}}function convertToRGBA(e){switch(e.kind){case F:return convertBlackAndWhiteToRGBA(e);case T:return function convertRGBToRGBA({src:e,srcPos:t=0,dest:a,destPos:n=0,width:s,height:r}){let i=0;const o=s*r*3,l=o>>2,f=new Uint32Array(e.buffer,t,l),c=FeatureTest.isLittleEndian?4278190080:255;if(FeatureTest.isLittleEndian){for(;i>>24|t<<8|c;a[n+2]=t>>>16|s<<16|c;a[n+3]=s>>>8|c}for(let s=4*i,r=t+o;s>>8|c;a[n+2]=t<<16|s>>>16|c;a[n+3]=s<<8|c}for(let s=4*i,r=t+o;s>3,h=7&n,u=l^f,m=e.length;a=new Uint32Array(a.buffer);let p=0;for(let n=0;n>7&1)&u;a[p+1]=l^-(n>>6&1)&u;a[p+2]=l^-(n>>5&1)&u;a[p+3]=l^-(n>>4&1)&u;a[p+4]=l^-(n>>3&1)&u;a[p+5]=l^-(n>>2&1)&u;a[p+6]=l^-(n>>1&1)&u;a[p+7]=l^-(1&n)&u}if(0===h)continue;const n=t>7-e&1)&u}return{srcPos:t,destPos:p}}class ImageResizer{static#O=2048;static#R=FeatureTest.isImageDecoderSupported;constructor(e,t){this._imgData=e;this._isMask=t}static get canUseImageDecoder(){return shadow(this,"canUseImageDecoder",this.#R?ImageDecoder.isTypeSupported("image/bmp"):Promise.resolve(!1))}static needsToBeResized(e,t){if(e<=this.#O&&t<=this.#O)return!1;const{MAX_DIM:a}=this;if(e>a||t>a)return!0;const n=e*t;if(this._hasMaxArea)return n>this.MAX_AREA;if(n(this.MAX_AREA=this.#O**2)}static getReducePowerForJPX(e,t,a){const n=e*t,s=2**30/(4*a);if(!this.needsToBeResized(e,t))return n>s?Math.ceil(Math.log2(n/s)):0;const{MAX_DIM:r,MAX_AREA:i}=this,o=Math.max(e/r,t/r,Math.sqrt(n/Math.min(s,i)));return Math.ceil(Math.log2(o))}static get MAX_DIM(){return shadow(this,"MAX_DIM",this._guessMax(2048,32768,0,1))}static get MAX_AREA(){this._hasMaxArea=!0;return shadow(this,"MAX_AREA",this._guessMax(this.#O,this.MAX_DIM,128,0)**2)}static set MAX_AREA(e){if(e>=0){this._hasMaxArea=!0;shadow(this,"MAX_AREA",e)}}static setOptions({canvasMaxAreaInBytes:e=-1,isImageDecoderSupported:t=!1}){this._hasMaxArea||(this.MAX_AREA=e>>2);this.#R=t}static _areGoodDims(e,t){try{const a=new OffscreenCanvas(e,t),n=a.getContext("2d");n.fillRect(0,0,1,1);const s=n.getImageData(0,0,1,1).data[3];a.width=a.height=1;return 0!==s}catch{return!1}}static _guessMax(e,t,a,n){for(;e+a+1ma){const e=this.#H();if(e)return e}const n=this._encodeBMP();let s,r;if(await ImageResizer.canUseImageDecoder){s=new ImageDecoder({data:n,type:"image/bmp",preferAnimation:!1,transfer:[n.buffer]});r=s.decode().catch(e=>{warn(`BMP image decoding failed: ${e}`);return createImageBitmap(new Blob([this._encodeBMP().buffer],{type:"image/bmp"}))}).finally(()=>{s.close()})}else r=createImageBitmap(new Blob([n.buffer],{type:"image/bmp"}));const{MAX_AREA:i,MAX_DIM:o}=ImageResizer,l=Math.max(t/o,a/o,Math.sqrt(t*a/i)),f=Math.max(l,2),c=Math.round(10*(l+1.25))/10/f,h=Math.floor(Math.log2(c)),u=new Array(h+2).fill(2);u[0]=f;u.splice(-1,1,c/(1<>i,l=n>>i;let f,c=n;try{f=new Uint8Array(r)}catch{let e=Math.floor(Math.log2(r+1));for(;;)try{f=new Uint8Array(2**e-1);break}catch{e-=1}c=Math.floor((2**e-1)/(4*a));const t=a*c*4;t>i;e>3,i=a+3&-4;if(a!==i){const e=new Uint8Array(i*t);let n=0;for(let r=0,o=t*a;r{throw t},a=import.meta.url;try{new URL(".",a).href}catch{}0;console.log.bind(console);var n,s,r,i,o,l=console.error.bind(console),f=!1,c=!1;function updateMemoryViews(){var e=u.buffer;i=new Int8Array(e);new Int16Array(e);o=new Uint8Array(e);new Uint16Array(e);new Int32Array(e);new Uint32Array(e);new Float32Array(e);new Float64Array(e);new BigInt64Array(e);new BigUint64Array(e)}class ExitStatus{name="ExitStatus";constructor(e){this.message=`Program terminated with exit(${e})`;this.status=e}}var h,u,callRuntimeCallbacks=e=>{for(;e.length>0;)e.shift()(t)},m=[],addOnPostRun=e=>m.push(e),p=[],addOnPreRun=e=>p.push(e),d=!0,g=0,b={},handleException=e=>{if(e instanceof ExitStatus||"unwind"==e)return n;quit_(0,e)},keepRuntimeAlive=()=>d||g>0,_proc_exit=e=>{n=e;if(!keepRuntimeAlive()){t.onExit?.(e);f=!0}quit_(0,new ExitStatus(e))},_exit=(e,t)=>{n=e;_proc_exit(e)},callUserCallback=e=>{if(!f)try{return e()}catch(e){handleException(e)}finally{(()=>{if(!keepRuntimeAlive())try{_exit(n)}catch(e){handleException(e)}})()}},alignMemory=(e,t)=>Math.ceil(e/t)*t,growMemory=e=>{var t=(e-u.buffer.byteLength+65535)/65536|0;try{u.grow(t);updateMemoryViews();return 1}catch(e){}};t.noExitRuntime&&(d=t.noExitRuntime);t.print&&t.print;t.printErr&&(l=t.printErr);t.wasmBinary&&t.wasmBinary;t.arguments&&t.arguments;t.thisProgram&&t.thisProgram;if(t.preInit){"function"==typeof t.preInit&&(t.preInit=[t.preInit]);for(;t.preInit.length>0;)t.preInit.shift()()}t.writeArrayToMemory=(e,t)=>{i.set(e,t)};var w,j={e:()=>function abort(e){t.onAbort?.(e);l(e="Aborted("+e+")");f=!0;e+=". Build with -sASSERTIONS for more info.";var a=new WebAssembly.RuntimeError(e);r?.(a);throw a}(""),b:()=>{d=!1;g=0},c:(e,t)=>{if(b[e]){clearTimeout(b[e].id);delete b[e]}if(!t)return 0;var a=setTimeout(()=>{delete b[e];callUserCallback(()=>h(e,performance.now()))},t);b[e]={id:a,timeout_ms:t};return 0},g:function _createImageData(e){t.imageData=new Uint8Array(e)},d:e=>{var t=o.length,a=2147483648;if((e>>>=0)>a)return!1;for(var n=1;n<=4;n*=2){var s=t*(1+.2/n);s=Math.min(s,e+100663296);var r=Math.min(a,alignMemory(Math.max(e,s),65536));if(growMemory(r))return!0}return!1},a:_proc_exit,h:function _setImageData(e,a,n,s){if(n===a){t.imageData=new Uint8ClampedArray(o.subarray(e,e+n*s));return}const r=a*s,i=t.imageData=new Uint8ClampedArray(r);for(let t=e,s=0;s{t.instantiateWasm(e,(e,t)=>{a(receiveInstance(e))})})}();!function run(){!function preRun(){if(t.preRun){"function"==typeof t.preRun&&(t.preRun=[t.preRun]);for(;t.preRun.length;)addOnPreRun(t.preRun.shift())}callRuntimeCallbacks(p)}();function doRun(){t.calledRun=!0;if(!f){!function initRuntime(){c=!0;w.j()}();s?.(t);t.onRuntimeInitialized?.();!function postRun(){if(t.postRun){"function"==typeof t.postRun&&(t.postRun=[t.postRun]);for(;t.postRun.length;)addOnPostRun(t.postRun.shift())}callRuntimeCallbacks(m)}()}}if(t.setStatus){t.setStatus("Running...");setTimeout(()=>{setTimeout(()=>t.setStatus(""),1);doRun()},1)}else doRun()}();return c?t:new Promise((e,t)=>{s=e;r=t})};class Jbig2Error extends aa{constructor(e){super(e,"Jbig2Error")}}class JBig2CCITTFaxImage{static#B=null;static#D=null;static#M=null;static#C=!0;static#N=!0;static#I=null;static setOptions({handler:e,useWasm:t,useWorkerFetch:a,wasmUrl:n}){this.#C=t;this.#N=a;this.#I=n;a||(this.#D=e)}static async#P(e){const t=`${this.#I}jbig2_nowasm_fallback.js`;let a=null;try{a=(await import( +/*webpackIgnore: true*/ +/*@vite-ignore*/ +t)).default()}catch(e){warn(`JBig2CCITTFaxImage#getJsModule: ${e}`)}e(a)}static async#E(e,t,a){const n="jbig2.wasm";try{this.#B||(this.#N?this.#B=await fetchBinaryData(`${this.#I}${n}`):this.#B=await this.#D.sendWithPromise("FetchBinaryData",{kind:"wasmUrl",filename:n}));return a((await WebAssembly.instantiate(this.#B,t)).instance)}catch(t){warn(`JBig2CCITTFaxImage#instantiateWasm: ${t}`);this.#P(e);return null}finally{this.#D=null}}static async decode(e,t,a,n,s){if(!this.#M){const{promise:e,resolve:t}=Promise.withResolvers(),a=[e];this.#C?a.push(Ia({warn,instantiateWasm:this.#E.bind(this,t)})):this.#P(t);this.#M=Promise.race(a)}const r=await this.#M;if(!r)throw new Jbig2Error("JBig2 failed to initialize");let i,o;try{const l=e.length;i=r._malloc(l);r.writeArrayToMemory(e,i);if(s)r._ccitt_decode(i,l,t,a,s.K,s.EndOfLine?1:0,s.EncodedByteAlign?1:0,s.BlackIs1?1:0,s.Columns,s.Rows);else{const e=n?n.length:0;if(e>0){o=r._malloc(e);r.writeArrayToMemory(n,o)}r._jbig2_decode(i,l,t,a,o,e)}if(!r.imageData)throw new Jbig2Error("Unknown error");const{imageData:f}=r;r.imageData=null;return f}finally{i&&r._free(i);o&&r._free(o)}}static cleanup(){this.#M=null}}const Fa=new Uint8Array(0);class DecodeStream extends BaseStream{constructor(e){super();this._rawMinBufferLength=e||0;this.pos=0;this.bufferLength=0;this.eof=!1;this.buffer=Fa;this.minBufferLength=512;if(e)for(;this.minBufferLengths&&(n=s)}else{for(;!this.eof;)this.readBlock(t);n=this.bufferLength}this.pos=n;return this.buffer.subarray(a,n)}async getImageData(e,t){if(!this.canAsyncDecodeImageFromBuffer)return this.isAsyncDecoder?this.decodeImage(null,e,t):this.getBytes(e,t);const a=await this.stream.asyncGetBytes();return this.decodeImage(a,e,t)}async asyncGetBytesFromDecompressionStream(e){this.stream.reset();const t=this.stream.isAsync?await this.stream.asyncGetBytes():this.stream.getBytes();try{const{readable:a,writable:n}=new DecompressionStream(e),s=n.getWriter();await s.ready;s.write(t).then(async()=>{await s.ready;await s.close()}).catch(()=>{});const r=[];let i=0;for await(const e of a){r.push(e);i+=e.byteLength}const o=new Uint8Array(i);let l=0;for(const e of r){o.set(e,l);l+=e.byteLength}return{decompressed:o,compressed:t}}catch{return{decompressed:null,compressed:t}}}reset(){this.pos=0}makeSubStream(e,t,a=null){if(void 0===t)for(;!this.eof;)this.readBlock();else{const a=e+t;for(;this.bufferLength<=a&&!this.eof;)this.readBlock()}return new Stream(this.buffer,e,t,a)}getBaseStreams(){return this.stream?this.stream.getBaseStreams():null}clone(){for(;!this.eof;)this.readBlock();return new Stream(this.buffer,this.start,this.end-this.start,this.dict.clone())}}class StreamsSequenceStream extends DecodeStream{constructor(e,t=null){e=e.filter(e=>e instanceof BaseStream&&!e.isImageStream);let a=0;for(const t of e)a+=t instanceof DecodeStream?t._rawMinBufferLength:t.length;super(a);this.streams=e;this._onError=t}readBlock(){const e=this.streams;if(0===e.length){this.eof=!0;return}const t=e.shift();let a;try{a=t.getBytes()}catch(e){if(this._onError){this._onError(e,t.dict?.objId);return}throw e}const n=this.bufferLength,s=n+a.length;this.ensureBuffer(s).set(a,n);this.bufferLength=s}getBaseStreams(){const e=[];for(const t of this.streams){const a=t.getBaseStreams();a&&e.push(...a)}return e.length>0?e:null}}class ColorSpaceUtils{static parse({cs:e,xref:t,resources:a=null,pdfFunctionFactory:n,globalColorSpaceCache:s,localColorSpaceCache:r,asyncIfNotCached:i=!1}){const o={xref:t,resources:a,pdfFunctionFactory:n,globalColorSpaceCache:s,localColorSpaceCache:r};let l,f,c;if(e instanceof Ref){f=e;const a=s.getByRef(f)||r.getByRef(f);if(a)return a;e=t.fetch(e)}if(e instanceof Name){l=e.name;const t=r.getByName(l);if(t)return t}try{c=this.#_(e,o)}catch(e){if(i&&!(e instanceof MissingDataException))return Promise.reject(e);throw e}if(l||f){r.set(l,f,c);f&&s.set(null,f,c)}return i?Promise.resolve(c):c}static#z(e,t){const{globalColorSpaceCache:a}=t;let n;if(e instanceof Ref){n=e;const t=a.getByRef(n);if(t)return t}const s=this.#_(e,t);n&&a.set(null,n,s);return s}static#_(e,t){const{xref:a,resources:n,pdfFunctionFactory:s,globalColorSpaceCache:r}=t;if((e=a.fetchIfRef(e))instanceof Name)switch(e.name){case"G":case"DeviceGray":return this.gray;case"RGB":case"DeviceRGB":return this.rgb;case"DeviceRGBA":return this.rgba;case"CMYK":case"DeviceCMYK":return this.cmyk;case"Pattern":return new PatternCS(null);default:if(n instanceof Dict){const a=n.get("ColorSpace");if(a instanceof Dict){const n=a.get(e.name);if(n){if(n instanceof Name)return this.#_(n,t);e=n;break}}}warn(`Unrecognized ColorSpace: ${e.name}`);return this.gray}if(Array.isArray(e)){const n=a.fetchIfRef(e[0]).name;let i,o,l,f,c,h;switch(n){case"G":case"DeviceGray":return this.gray;case"RGB":case"DeviceRGB":return this.rgb;case"CMYK":case"DeviceCMYK":return this.cmyk;case"CalGray":i=a.fetchIfRef(e[1]);f=i.getArray("WhitePoint");c=i.getArray("BlackPoint");h=i.get("Gamma");return new CalGrayCS(f,c,h);case"CalRGB":i=a.fetchIfRef(e[1]);f=i.getArray("WhitePoint");c=i.getArray("BlackPoint");h=i.getArray("Gamma");const u=i.getArray("Matrix");return new CalRGBCS(f,c,h,u);case"ICCBased":const m=e[1]instanceof Ref;if(m){const t=r.getByRef(e[1]);if(t)return t}const p=a.fetchIfRef(e[1]),d=p.dict;o=d.get("N");if(IccColorSpace.isUsable)try{const t=new IccColorSpace(p.getBytes(),"ICCBased",o);m&&r.set(null,e[1],t);return t}catch(t){if(t instanceof MissingDataException)throw t;warn(`ICCBased color space (${e[1]}): "${t}".`)}const g=d.getRaw("Alternate");if(g){const e=this.#z(g,t);if(e.numComps===o)return e;warn("ICCBased color space: Ignoring incorrect /Alternate entry.")}if(1===o)return this.gray;if(3===o)return this.rgb;if(4===o)return this.cmyk;break;case"Pattern":l=e[1]||null;l&&(l=this.#z(l,t));return new PatternCS(l);case"I":case"Indexed":l=this.#z(e[1],t);const b=MathClamp(a.fetchIfRef(e[2]),0,255),w=a.fetchIfRef(e[3]);return new IndexedCS(l,b,w);case"Separation":case"DeviceN":const j=a.fetchIfRef(e[1]);o=Array.isArray(j)?j.length:1;l=this.#z(e[2],t);const k=s.create(e[3]);return new AlternateCS(o,l,k);case"Lab":i=a.fetchIfRef(e[1]);f=i.getArray("WhitePoint");c=i.getArray("BlackPoint");const y=i.getArray("Range");return new LabCS(f,c,y);default:warn(`Unimplemented ColorSpace object: ${n}`);return this.gray}}warn(`Unrecognized ColorSpace object: ${e}`);return this.gray}static get gray(){return shadow(this,"gray",new DeviceGrayCS)}static get rgb(){return shadow(this,"rgb",new DeviceRgbCS)}static get rgba(){return shadow(this,"rgba",new DeviceRgbaCS)}static get cmyk(){if(CmykICCBasedCS.isUsable)try{return shadow(this,"cmyk",new CmykICCBasedCS)}catch{warn("CMYK fallback: DeviceCMYK")}return shadow(this,"cmyk",new DeviceCmykCS)}}class JpegError extends aa{constructor(e){super(e,"JpegError")}}class DNLMarkerError extends aa{constructor(e,t){super(e,"DNLMarkerError");this.scanLines=t}}class EOIMarkerError extends aa{constructor(e){super(e,"EOIMarkerError")}}const Ta=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),Oa=4017,Ra=799,Ha=3406,Ba=2276,Da=1567,Ma=3784,Na=5793,Pa=2896;function buildHuffmanTable(e,t){let a,n,s=0,r=16;for(;r>0&&!e[r-1];)r--;const i=[{children:[],index:0}];let o,l=i[0];for(a=0;a0;)l=i.pop();l.index++;i.push(l);for(;i.length<=a;){i.push(o={children:[],index:0});l.children[l.index]=o.children;l=o}s++}if(a+10){d--;return p>>d&1}p=e[a++];if(255===p){const s=e[a++];if(s){if(220===s&&c){a+=2;const e=t.getUint16(a);a+=2;if(e>0&&e!==n.scanLines)throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",e)}else if(217===s){if(c){const e=j*(8===n.precision?8:0);if(e>0&&Math.round(n.scanLines/e)>=5)throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, possibly caused by incorrect `scanLines` parameter",e)}throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data")}throw new JpegError(`unexpected marker ${(p<<8|s).toString(16)}`)}}d=7;return p>>>7}function decodeHuffman(e){let t=e;for(;;){t=t[readBit()];switch(typeof t){case"number":return t;case"object":continue}throw new JpegError("invalid huffman sequence")}}function receive(e){let t=0;for(;e>0;){t=t<<1|readBit();e--}return t}function receiveAndExtend(e){if(1===e)return 1===readBit()?1:-1;const t=receive(e);return t>=1<0){g--;return}let a=i;const n=o;for(;a<=n;){const n=decodeHuffman(e.huffmanTableAC),s=15&n,r=n>>4;if(0===s){if(r<15){g=receive(r)+(1<>4;if(0===s)if(l<15){g=receive(l)+(1<>4;if(0===n){if(r<15)break;s+=16;continue}s+=r;const i=Ta[s];e.blockData[t+i]=receiveAndExtend(n);s++}};let F,T=0;const O=1===k?s[0].blocksPerLine*s[0].blocksPerColumn:h*n.mcusPerColumn;let R,H;for(;T<=O;){const n=r?Math.min(O-T,r):O;if(n>0){for(q=0;q0?"unexpected":"excessive"} MCU data, current marker is: ${F.invalid}`);a=F.offset}if(!(F.marker>=65488&&F.marker<=65495))break;a+=2}return a-m}function quantizeAndInverse(e,t,a){const n=e.quantizationTable,s=e.blockData;let r,i,o,l,f,c,h,u,m,p,d,g,b,w,j,k,y;if(!n)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){m=s[t+e];p=s[t+e+1];d=s[t+e+2];g=s[t+e+3];b=s[t+e+4];w=s[t+e+5];j=s[t+e+6];k=s[t+e+7];m*=n[e];if(0!==(p|d|g|b|w|j|k)){p*=n[e+1];d*=n[e+2];g*=n[e+3];b*=n[e+4];w*=n[e+5];j*=n[e+6];k*=n[e+7];r=Na*m+128>>8;i=Na*b+128>>8;o=d;l=j;f=Pa*(p-k)+128>>8;u=Pa*(p+k)+128>>8;c=g<<4;h=w<<4;r=r+i+1>>1;i=r-i;y=o*Ma+l*Da+128>>8;o=o*Da-l*Ma+128>>8;l=y;f=f+h+1>>1;h=f-h;u=u+c+1>>1;c=u-c;r=r+l+1>>1;l=r-l;i=i+o+1>>1;o=i-o;y=f*Ba+u*Ha+2048>>12;f=f*Ha-u*Ba+2048>>12;u=y;y=c*Ra+h*Oa+2048>>12;c=c*Oa-h*Ra+2048>>12;h=y;a[e]=r+u;a[e+7]=r-u;a[e+1]=i+h;a[e+6]=i-h;a[e+2]=o+c;a[e+5]=o-c;a[e+3]=l+f;a[e+4]=l-f}else{y=Na*m+512>>10;a[e]=y;a[e+1]=y;a[e+2]=y;a[e+3]=y;a[e+4]=y;a[e+5]=y;a[e+6]=y;a[e+7]=y}}for(let e=0;e<8;++e){m=a[e];p=a[e+8];d=a[e+16];g=a[e+24];b=a[e+32];w=a[e+40];j=a[e+48];k=a[e+56];if(0!==(p|d|g|b|w|j|k)){r=Na*m+2048>>12;i=Na*b+2048>>12;o=d;l=j;f=Pa*(p-k)+2048>>12;u=Pa*(p+k)+2048>>12;c=g;h=w;r=4112+(r+i+1>>1);i=r-i;y=o*Ma+l*Da+2048>>12;o=o*Da-l*Ma+2048>>12;l=y;f=f+h+1>>1;h=f-h;u=u+c+1>>1;c=u-c;r=r+l+1>>1;l=r-l;i=i+o+1>>1;o=i-o;y=f*Ba+u*Ha+2048>>12;f=f*Ha-u*Ba+2048>>12;u=y;y=c*Ra+h*Oa+2048>>12;c=c*Oa-h*Ra+2048>>12;h=y;m=r+u;k=r-u;p=i+h;j=i-h;d=o+c;w=o-c;g=l+f;b=l-f;m<16?m=0:m>=4080?m=255:m>>=4;p<16?p=0:p>=4080?p=255:p>>=4;d<16?d=0:d>=4080?d=255:d>>=4;g<16?g=0:g>=4080?g=255:g>>=4;b<16?b=0:b>=4080?b=255:b>>=4;w<16?w=0:w>=4080?w=255:w>>=4;j<16?j=0:j>=4080?j=255:j>>=4;k<16?k=0:k>=4080?k=255:k>>=4;s[t+e]=m;s[t+e+8]=p;s[t+e+16]=d;s[t+e+24]=g;s[t+e+32]=b;s[t+e+40]=w;s[t+e+48]=j;s[t+e+56]=k}else{y=Na*m+8192>>14;y=y<-2040?0:y>=2024?255:y+2056>>4;s[t+e]=y;s[t+e+8]=y;s[t+e+16]=y;s[t+e+24]=y;s[t+e+32]=y;s[t+e+40]=y;s[t+e+48]=y;s[t+e+56]=y}}}function buildComponentData(e,t){const a=t.blocksPerLine,n=t.blocksPerColumn,s=new Int16Array(64);for(let e=0;e=s)return null;const i=t.getUint16(a);if(i>=65472&&i<=65534)return{invalid:null,marker:i,offset:a};let o=t.getUint16(r);for(;!(o>=65472&&o<=65534);){if(++r>=s)return null;o=t.getUint16(r)}return{invalid:i.toString(16),marker:o,offset:r}}function prepareComponents(e){const t=Math.ceil(e.samplesPerLine/8/e.maxH),a=Math.ceil(e.scanLines/8/e.maxV);for(const n of e.components){const s=Math.ceil(Math.ceil(e.samplesPerLine/8)*n.h/e.maxH),r=Math.ceil(Math.ceil(e.scanLines/8)*n.v/e.maxV),i=t*n.h,o=64*(a*n.v)*(i+1);n.blockData=new Int16Array(o);n.blocksPerLine=s;n.blocksPerColumn=r}e.mcusPerLine=t;e.mcusPerColumn=a}function readDataBlock(e,t,a){const n=t.getUint16(a);let s=(a+=2)+n-2;const r=findNextFileMarker(e,t,s,a);if(r?.invalid){warn("readDataBlock - incorrect length, current marker is: "+r.invalid);s=r.offset}const i=e.subarray(a,s);return{appData:i,oldOffset:a,newOffset:a+i.length}}function skipData(e,t,a){const n=t.getUint16(a),s=(a+=2)+n-2,r=findNextFileMarker(e,t,s,a);return r?.invalid?r.offset:s}class JpegImage{constructor({decodeTransform:e=null,colorTransform:t=-1}={}){this._decodeTransform=e;this._colorTransform=t}static canUseImageDecoder(e,t=-1){const a=new DataView(e.buffer,e.byteOffset,e.byteLength);let n=null,s=0,r=null,i=a.getUint16(s);s+=2;if(65496!==i)throw new JpegError("SOI not found");i=a.getUint16(s);s+=2;e:for(;65497!==i;){switch(i){case 65505:const{appData:t,oldOffset:o,newOffset:l}=readDataBlock(e,a,s);s=l;if(69===t[0]&&120===t[1]&&105===t[2]&&102===t[3]&&0===t[4]&&0===t[5]){if(n)throw new JpegError("Duplicate EXIF-blocks found.");n={exifStart:o+6,exifEnd:l}}i=a.getUint16(s);s+=2;continue;case 65472:case 65473:case 65474:r=e[s+7];break e;case 65535:255!==e[s]&&s--}s=skipData(e,a,s);i=a.getUint16(s);s+=2}return 4===r||3===r&&0===t?null:n||{}}parse(e,{dnlScanLines:t=null}={}){const a=new DataView(e.buffer,e.byteOffset,e.byteLength),n=e.length-1;let s,r,i=0,o=null,l=null,f=0;const c=[],h=[],u=[];let m=a.getUint16(i);i+=2;if(65496!==m)throw new JpegError("SOI not found");m=a.getUint16(i);i+=2;e:for(;65497!==m;){let p,d,g;switch(m){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:const{appData:b,newOffset:w}=readDataBlock(e,a,i);i=w;65504===m&&74===b[0]&&70===b[1]&&73===b[2]&&70===b[3]&&0===b[4]&&(o={version:{major:b[5],minor:b[6]},densityUnits:b[7],xDensity:b[8]<<8|b[9],yDensity:b[10]<<8|b[11],thumbWidth:b[12],thumbHeight:b[13],thumbData:b.subarray(14,14+3*b[12]*b[13])});65518===m&&65===b[0]&&100===b[1]&&111===b[2]&&98===b[3]&&101===b[4]&&(l={version:b[5]<<8|b[6],flags0:b[7]<<8|b[8],flags1:b[9]<<8|b[10],transformCode:b[11]});break;case 65499:const j=a.getUint16(i);i+=2;const k=j+i-2;let y;for(;i>4){if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(d=0;d<64;d++){y=Ta[d];n[y]=a.getUint16(i);i+=2}}else for(d=0;d<64;d++){y=Ta[d];n[y]=e[i++]}c[15&t]=n}break;case 65472:case 65473:case 65474:if(s)throw new JpegError("Only single frame JPEGs supported");i+=2;s={};s.extended=65473===m;s.progressive=65474===m;s.precision=e[i++];const q=a.getUint16(i);i+=2;s.scanLines=t||q;s.samplesPerLine=a.getUint16(i);i+=2;s.components=[];s.componentIds={};const v=e[i++];let S=0,x=0;for(p=0;p>4,n=15&e[i+1];S>4?h:u)[15&t]=buildHuffmanTable(a,s)}break;case 65501:i+=2;r=a.getUint16(i);i+=2;break;case 65498:const F=1===++f&&!t;i+=2;const T=e[i++],O=[];for(p=0;p>4];n.huffmanTableAC=h[15&r];O.push(n)}const R=e[i++],H=e[i++],D=e[i++];try{i+=decodeScan(e,a,i,s,O,r,R,H,D>>4,15&D,F)}catch(t){if(t instanceof DNLMarkerError){warn(`${t.message} -- attempting to re-parse the JPEG image.`);return this.parse(e,{dnlScanLines:t.scanLines})}if(t instanceof EOIMarkerError){warn(`${t.message} -- ignoring the rest of the image data.`);break e}throw t}break;case 65500:i+=4;break;case 65535:255!==e[i]&&i--;break;default:const M=findNextFileMarker(e,a,i-2,i-3);if(M?.invalid){warn("JpegImage.parse - unexpected data, current marker is: "+M.invalid);i=M.offset;break}if(!M||i>=n){warn("JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).");break e}throw new JpegError("JpegImage.parse - unknown marker: "+m.toString(16))}if(i>8)+v[m+1];return j}get _isColorConversionNeeded(){return this.adobe?!!this.adobe.transformCode:3===this.numComponents?0!==this._colorTransform&&(82!==this.components[0].index||71!==this.components[1].index||66!==this.components[2].index):1===this._colorTransform}_convertYccToRgb(e){let t,a,n;for(let s=0,r=e.length;s4)throw new JpegError("Unsupported color mode");const r=this._getLinearizedBlockData(e,t,s);if(1===this.numComponents&&(a||n)){const e=r.length*(a?4:3),t=new Uint8ClampedArray(e);let n=0;if(a)!function grayToRGBA(e,t){if(FeatureTest.isLittleEndian)for(let a=0,n=e.length;a0&&(e=e.subarray(t));break}return e}decodeImage(e){if(this.eof)return this.buffer;e=this.#L(e||this.bytes);const t=new JpegImage(this.jpegOptions);t.parse(e);const a=t.getData({width:this.drawWidth,height:this.drawHeight,forceRGBA:this.forceRGBA,forceRGB:this.forceRGB,isSourcePDF:!0});this.buffer=a;this.bufferLength=a.length;this.eof=!0;return this.buffer}get canAsyncDecodeImageFromBuffer(){return this.stream.isAsync}async getTransferableImage(){if(!await JpegStream.canUseImageDecoder)return null;const e=this.jpegOptions;if(e.decodeTransform)return null;let t;try{const a=this.canAsyncDecodeImageFromBuffer&&await this.stream.asyncGetBytes()||this.bytes;if(!a)return null;let n=this.#L(a);const s=JpegImage.canUseImageDecoder(n,e.colorTransform);if(!s)return null;if(s.exifStart){n=n.slice();n.fill(0,s.exifStart,s.exifEnd)}t=new ImageDecoder({data:n,type:"image/jpeg",preferAnimation:!1});return(await t.decode()).image}catch(e){warn(`getTransferableImage - failed: "${e}".`);return null}finally{t?.close()}}get isImageStream(){return!0}}const Ea=async function OpenJPEG(e={}){var t=e,a="./this.program",quit_=(e,t)=>{throw t},n=import.meta.url;try{new URL(".",n).href}catch{}0;var s,r,i,o,l,f,c,h=console.log.bind(console),u=console.error.bind(console),m=!1,p=!1;function updateMemoryViews(){var e=g.buffer;l=new Int8Array(e);new Int16Array(e);c=new Uint8Array(e);new Uint16Array(e);o=new Int32Array(e);f=new Uint32Array(e);new Float32Array(e);new Float64Array(e);new BigInt64Array(e);new BigUint64Array(e)}class ExitStatus{name="ExitStatus";constructor(e){this.message=`Program terminated with exit(${e})`;this.status=e}}var d,g,callRuntimeCallbacks=e=>{for(;e.length>0;)e.shift()(t)},b=[],addOnPostRun=e=>b.push(e),w=[],addOnPreRun=e=>w.push(e),j=!0,k=0,y={},handleException=e=>{if(e instanceof ExitStatus||"unwind"==e)return s;quit_(0,e)},keepRuntimeAlive=()=>j||k>0,_proc_exit=e=>{s=e;if(!keepRuntimeAlive()){t.onExit?.(e);m=!0}quit_(0,new ExitStatus(e))},_exit=(e,t)=>{s=e;_proc_exit(e)},callUserCallback=e=>{if(!m)try{return e()}catch(e){handleException(e)}finally{(()=>{if(!keepRuntimeAlive())try{_exit(s)}catch(e){handleException(e)}})()}},alignMemory=(e,t)=>Math.ceil(e/t)*t,growMemory=e=>{var t=(e-g.buffer.byteLength+65535)/65536|0;try{g.grow(t);updateMemoryViews();return 1}catch(e){}},q={},getEnvStrings=()=>{if(!getEnvStrings.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:a||"./this.program"};for(var t in q)void 0===q[t]?delete e[t]:e[t]=q[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);getEnvStrings.strings=n}return getEnvStrings.strings},stringToUTF8=(e,t,a)=>((e,t,a,n)=>{if(!(n>0))return 0;for(var s=a,r=a+n-1,i=0;i=r)break;t[a++]=o}else if(o<=2047){if(a+1>=r)break;t[a++]=192|o>>6;t[a++]=128|63&o}else if(o<=65535){if(a+2>=r)break;t[a++]=224|o>>12;t[a++]=128|o>>6&63;t[a++]=128|63&o}else{if(a+3>=r)break;t[a++]=240|o>>18;t[a++]=128|o>>12&63;t[a++]=128|o>>6&63;t[a++]=128|63&o;i++}}t[a]=0;return a-s})(e,c,t,a),lengthBytesUTF8=e=>{for(var t=0,a=0;a=55296&&n<=57343){t+=4;++a}else t+=3}return t},v=[null,[],[]],S=globalThis.TextDecoder&&new TextDecoder,UTF8ArrayToString=(e,t=0,a,n)=>{var s=((e,t,a,n)=>{var s=t+a;if(n)return s;for(;e[t]&&!(t>=s);)++t;return t})(e,t,a,n);if(s-t>16&&e.buffer&&S)return S.decode(e.subarray(t,s));for(var r="";t>10,56320|1023&f)}}else r+=String.fromCharCode((31&i)<<6|o)}else r+=String.fromCharCode(i)}return r},printChar=(e,t)=>{var a=v[e];if(0===t||10===t){(1===e?h:u)(UTF8ArrayToString(a));a.length=0}else a.push(t)},UTF8ToString=(e,t,a)=>e?UTF8ArrayToString(c,e,t,a):"";t.noExitRuntime&&(j=t.noExitRuntime);t.print&&(h=t.print);t.printErr&&(u=t.printErr);t.wasmBinary&&t.wasmBinary;t.arguments&&t.arguments;t.thisProgram&&(a=t.thisProgram);if(t.preInit){"function"==typeof t.preInit&&(t.preInit=[t.preInit]);for(;t.preInit.length>0;)t.preInit.shift()()}t.writeArrayToMemory=(e,t)=>{l.set(e,t)};var x,C={m:()=>function abort(e){t.onAbort?.(e);u(e=`Aborted(${e})`);m=!0;e+=". Build with -sASSERTIONS for more info.";var a=new WebAssembly.RuntimeError(e);i?.(a);throw a}(""),l:()=>{j=!1;k=0},i:(e,t)=>{if(y[e]){clearTimeout(y[e].id);delete y[e]}if(!t)return 0;var a=setTimeout(()=>{delete y[e];callUserCallback(()=>d(e,performance.now()))},t);y[e]={id:a,timeout_ms:t};return 0},f:function _copy_pixels_1(e,a){e>>=2;const n=t.imageData=new Uint8ClampedArray(a),s=o.subarray(e,e+a);n.set(s)},e:function _copy_pixels_3(e,a,n,s){e>>=2;a>>=2;n>>=2;const r=t.imageData=new Uint8ClampedArray(3*s),i=o.subarray(e,e+s),l=o.subarray(a,a+s),f=o.subarray(n,n+s);for(let e=0;e>=2;a>>=2;n>>=2;s>>=2;const i=t.imageData=new Uint8ClampedArray(4*r),l=o.subarray(e,e+r),f=o.subarray(a,a+r),c=o.subarray(n,n+r),h=o.subarray(s,s+r);for(let e=0;e{var t=c.length,a=2147483648;if((e>>>=0)>a)return!1;for(var n=1;n<=4;n*=2){var s=t*(1+.2/n);s=Math.min(s,e+100663296);var r=Math.min(a,alignMemory(Math.max(e,s),65536));if(growMemory(r))return!0}return!1},o:(e,t)=>{var a=0,n=0;for(var s of getEnvStrings()){var r=t+a;f[e+n>>2]=r;a+=stringToUTF8(s,r,1/0)+1;n+=4}return 0},p:(e,t)=>{var a=getEnvStrings();f[e>>2]=a.length;var n=0;for(var s of a)n+=lengthBytesUTF8(s)+1;f[t>>2]=n;return 0},n:function _fd_seek(e,t,a,n){t=(s=t)<-9007199254740992||s>9007199254740992?NaN:Number(s);var s;return 70},b:(e,t,a,n)=>{for(var s=0,r=0;r>2],o=f[t+4>>2];t+=8;for(var l=0;l>2]=s;return 0},q:function _gray_to_rgba(e,a){e>>=2;const n=t.imageData=new Uint8ClampedArray(4*a),s=o.subarray(e,e+a);for(let e=0;e>=2;a>>=2;const s=t.imageData=new Uint8ClampedArray(4*n),r=o.subarray(e,e+n),i=o.subarray(a,a+n);for(let e=0;e>=2;a>>=2;n>>=2;const r=t.imageData=new Uint8ClampedArray(4*s),i=o.subarray(e,e+s),l=o.subarray(a,a+s),f=o.subarray(n,n+s);for(let e=0;e{t.instantiateWasm(e,(e,t)=>{a(receiveInstance(e))})})}();!function run(){!function preRun(){if(t.preRun){"function"==typeof t.preRun&&(t.preRun=[t.preRun]);for(;t.preRun.length;)addOnPreRun(t.preRun.shift())}callRuntimeCallbacks(w)}();function doRun(){t.calledRun=!0;if(!m){!function initRuntime(){p=!0;x.s()}();r?.(t);t.onRuntimeInitialized?.();!function postRun(){if(t.postRun){"function"==typeof t.postRun&&(t.postRun=[t.postRun]);for(;t.postRun.length;)addOnPostRun(t.postRun.shift())}callRuntimeCallbacks(b)}()}}if(t.setStatus){t.setStatus("Running...");setTimeout(()=>{setTimeout(()=>t.setStatus(""),1);doRun()},1)}else doRun()}();return p?t:new Promise((e,t)=>{r=e;i=t})};class JpxError extends aa{constructor(e){super(e,"JpxError")}}class JpxImage{static#B=null;static#D=null;static#M=null;static#C=!0;static#N=!0;static#I=null;static setOptions({handler:e,useWasm:t,useWorkerFetch:a,wasmUrl:n}){this.#C=t;this.#N=a;this.#I=n;a||(this.#D=e)}static async#P(e){const t=`${this.#I}openjpeg_nowasm_fallback.js`;let a=null;try{a=(await import( +/*webpackIgnore: true*/ +/*@vite-ignore*/ +t)).default()}catch(e){warn(`JpxImage#getJsModule: ${e}`)}e(a)}static async#E(e,t,a){const n="openjpeg.wasm";try{this.#B||(this.#N?this.#B=await fetchBinaryData(`${this.#I}${n}`):this.#B=await this.#D.sendWithPromise("FetchBinaryData",{kind:"wasmUrl",filename:n}));return a((await WebAssembly.instantiate(this.#B,t)).instance)}catch(t){warn(`JpxImage#instantiateWasm: ${t}`);this.#P(e);return null}finally{this.#D=null}}static async decode(e,{numComponents:t=4,isIndexedColormap:a=!1,smaskInData:n=!1,reducePower:s=0}={}){if(!this.#M){const{promise:e,resolve:t}=Promise.withResolvers(),a=[e];this.#C?a.push(Ea({warn,instantiateWasm:this.#E.bind(this,t)})):this.#P(t);this.#M=Promise.race(a)}const r=await this.#M;if(!r)throw new JpxError("OpenJPEG failed to initialize");let i;try{const o=e.length;i=r._malloc(o);r.writeArrayToMemory(e,i);if(r._jp2_decode(i,o,t>0?t:0,!!a,!!n,s)){const{errorMessages:e}=r;if(e){delete r.errorMessages;throw new JpxError(e)}throw new JpxError("Unknown error")}const{imageData:l}=r;r.imageData=null;return l}finally{i&&r._free(i)}}static cleanup(){this.#M=null}static parseImageProperties(e){let t=e.getByte();for(;t>=0;){const a=t;t=e.getByte();if(65361===(a<<8|t)){e.skip(4);const t=e.getInt32()>>>0,a=e.getInt32()>>>0,n=e.getInt32()>>>0,s=e.getInt32()>>>0;e.skip(16);return{width:t-n,height:a-s,bitsPerComponent:8,componentsCount:e.getUint16()}}}throw new JpxError("No size marker found in JPX stream")}}function addState(e,t,a,n,s){let r=e;for(let e=0,a=t.length-1;e1e3){f=Math.max(f,u);m+=h+2;u=0;h=0}c.push({transform:t,x:u,y:m,w:a.width,h:a.height});u+=a.width+2;h=Math.max(h,a.height)}const p=Math.max(f,u)+1,d=m+h+1,g=new Uint8Array(p*d*4),b=p<<2;for(let e=0;e=0;){t[r-4]=t[r];t[r-3]=t[r+1];t[r-2]=t[r+2];t[r-1]=t[r+3];t[r+a]=t[r+a-4];t[r+a+1]=t[r+a-3];t[r+a+2]=t[r+a-2];t[r+a+3]=t[r+a-1];r-=b}}const w={width:p,height:d};if(e.isOffscreenCanvasSupported){const e=new OffscreenCanvas(p,d);e.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(g.buffer),p,d),0,0);w.bitmap=e.transferToImageBitmap();w.data=null}else{w.kind=O;w.data=g}a.splice(r,4*l,_t);n.splice(r,4*l,[w,c]);return r+1});addState(_a,[ke,qe,Mt,ye],null,function iterateImageMaskGroup(e,t){const a=e.fnArray,n=(t-(e.iCurr-3))%4;switch(n){case 0:return a[t]===ke;case 1:return a[t]===qe;case 2:return a[t]===Mt;case 3:return a[t]===ye}throw new Error(`iterateImageMaskGroup - invalid pos: ${n}`)},function foundImageMaskGroup(e,t){const a=e.fnArray,n=e.argsArray,s=e.iCurr,r=s-3,i=s-2,o=s-1;let l=Math.floor((t-r)/4);if(l<10)return t-(t-r)%4;let f,c,h=!1;const u=n[o][0],m=n[i][0],p=n[i][1],d=n[i][2],g=n[i][3];if(p===d){h=!0;f=i+4;let e=o+4;for(let t=1;t=4&&a[r-4]===a[i]&&a[r-3]===a[o]&&a[r-2]===a[l]&&a[r-1]===a[f]&&n[r-4][0]===c&&n[r-4][1]===h){u++;m-=5}let p=m+4;for(let e=1;e{const t=e.argsArray,a=t[e.iCurr-1][0];if(a!==Te&&a!==Oe&&a!==Be&&a!==De&&a!==Me&&a!==Ne)return!0;const n=t[e.iCurr-2];return 1===n[0]&&0===n[1]&&0===n[2]&&1===n[3]},()=>!1,(e,t)=>{const{fnArray:n,argsArray:s}=e,r=e.iCurr,i=r-3,o=r-2,l=s[r-1],f=s[o],[,[c],h]=l;if(h){const e=a.slice();Util.axialAlignedBoundingBox(h,f,e);h.set(e);for(let e=0,t=c.length;e=a)break}n=(n||_a)[e[t]];if(n&&!Array.isArray(n)){r.iCurr=t;t++;if(!n.checkFn||(0,n.checkFn)(r)){s=n;n=null}else n=null}else t++}this.state=n;this.match=s;this.lastProcessed=t}flush(){for(;this.match;){const e=this.queue.fnArray.length;this.lastProcessed=(0,this.match.processFn)(this.context,e);this.match=null;this.state=null;this._optimize()}}reset(){this.state=null;this.match=null;this.lastProcessed=0}}class OperatorList{static CHUNK_SIZE=1e3;static CHUNK_SIZE_ABOUT=this.CHUNK_SIZE-5;static isOffscreenCanvasSupported=!1;constructor(e=0,t){this._streamSink=t;this.fnArray=[];this.argsArray=[];this.optimizer=!t||e&p?new NullOptimizer(this):new QueueOptimizer(this);this.dependencies=new Set;this._totalLength=0;this.weight=0;this._resolved=t?null:Promise.resolve()}static setOptions({isOffscreenCanvasSupported:e}){this.isOffscreenCanvasSupported=e}get length(){return this.argsArray.length}get ready(){return this._resolved||this._streamSink.ready}get totalLength(){return this._totalLength+this.length}addOp(e,t){this.optimizer.push(e,t);this.weight++;this._streamSink&&(this.weight>=OperatorList.CHUNK_SIZE||this.weight>=OperatorList.CHUNK_SIZE_ABOUT&&(e===ye||e===Le))&&this.flush()}addImageOps(e,t,a,n=!1){if(n){this.addOp(ke);this.addOp(je,[[["SMask",!1]]])}void 0!==a&&this.addOp(xt,["OC",a]);this.addOp(e,t);void 0!==a&&this.addOp(Ct,[]);n&&this.addOp(ye)}addDependency(e){if(!this.dependencies.has(e)){this.dependencies.add(e);this.addOp(he,[e])}}addDependencies(e){for(const t of e)this.addDependency(t)}addOpList(e){if(e instanceof OperatorList){for(const t of e.dependencies)this.dependencies.add(t);for(let t=0,a=e.length;t"boolean"==typeof e)})(m,2)&&([h,u]=m);this.extendStart=h;this.extendEnd=u;const p=e.getRaw("Function"),d=n.create(p,!0),g=(f-l)/840,b=this.colorStops=[];if(l>=f||g<=0){info("Bad shading domain.");return}const w=new Float32Array(o.numComps),j=new Float32Array(1);let k=0;j[0]=l;d(j,0,w,0);const y=new Uint8ClampedArray(3);o.getRgb(w,0,y);let[q,v,S]=y;b.push([0,Util.makeHexColor(q,v,S)]);let x=1;j[0]=l+g;d(j,0,w,0);o.getRgb(w,0,y);let[C,F,T]=y,O=C-q+1,R=F-v+1,H=T-S+1,D=C-q-1,M=F-v-1,N=T-S-1;for(let e=2;e<840;e++){j[0]=l+e*g;d(j,0,w,0);o.getRgb(w,0,y);const[t,a,n]=y,s=e-k;O=Math.min(O,(t-q+1)/s);R=Math.min(R,(a-v+1)/s);H=Math.min(H,(n-S+1)/s);D=Math.max(D,(t-q-1)/s);M=Math.max(M,(a-v-1)/s);N=Math.max(N,(n-S-1)/s);if(!(D<=O&&M<=R&&N<=H)){const e=Util.makeHexColor(C,F,T);b.push([x/840,e]);O=t-C+1;R=a-F+1;H=n-T+1;D=t-C-1;M=a-F-1;N=n-T-1;k=x;q=C;v=F;S=T}x=e;C=t;F=a;T=n}b.push([1,Util.makeHexColor(C,F,T)]);let E="transparent";e.has("Background")&&(E=o.getRgbHex(e.get("Background"),0));if(!h){b.unshift([0,E]);b[1][0]+=BaseShading.SMALL_NUMBER}if(!u){b.at(-1)[0]-=BaseShading.SMALL_NUMBER;b.push([1,E])}this.colorStops=b}getIR(){const{coordsArr:e,shadingType:t}=this;let a,n,s,r,i;if(t===La){n=[e[0],e[1]];s=[e[2],e[3]];r=null;i=null;a="axial"}else if(t===Ua){n=[e[0],e[1]];s=[e[3],e[4]];r=e[2];i=e[5];a="radial"}else unreachable(`getPattern type unknown: ${t}`);return["RadialAxial",a,this.bbox,this.colorStops,n,s,r,i]}}function buildMeshVertexData(e,t,a){let n=0;for(const e of a)if(e.type===q)n+=e.coords.length;else if(e.type===v){const t=e.verticesPerRow;n+=(Math.floor(e.coords.length/t)-1)*(t-1)*6}const s=new Float32Array(2*n),r=new Uint8Array(4*n);let i=0,o=0;const addVertex=(a,n)=>{s[i++]=e[2*a];s[i++]=e[2*a+1];r[o++]=t[4*n];r[o++]=t[4*n+1];r[o++]=t[4*n+2];o++};for(const e of a){const t=e.coords,a=e.colors;if(e.type===q)for(let e=0,n=t.length;e0)return!0;const e=this.stream.getByte();if(e<0)return!1;this.buffer=e;this.bufferLength=8;return!0}readBits(e){const{stream:t}=this;let{buffer:a,bufferLength:n}=this;if(32===e){if(0===n)return t.getInt32()>>>0;a=a<<24|t.getByte()<<16|t.getByte()<<8|t.getByte();const e=t.getByte();this.buffer=e&(1<>n)>>>0}if(8===e&&0===n)return t.getByte();for(;n>n}align(){this.buffer=0;this.bufferLength=0}readFlag(){return this.readBits(this.context.bitsPerFlag)}readCoordinate(){const{bitsPerCoordinate:e,decode:t}=this.context,a=this.readBits(e),n=this.readBits(e),s=e<32?1/((1<i?i:t;a=a>o?o:a;n=n>>0}function hexToStr(e,t){return 1===t?String.fromCharCode(e[0],e[1]):3===t?String.fromCharCode(e[0],e[1],e[2],e[3]):String.fromCharCode(...e.subarray(0,t+1))}function addHex(e,t,a){let n=0;for(let s=a;s>=0;s--){n+=e[s]+t[s];e[s]=255&n;n>>=8}}function incHex(e,t){let a=1;for(let n=t;n>=0&&a>0;n--){a+=e[n];e[n]=255&a;a>>=8}}const $a=16;class BinaryCMapStream extends Stream{tmpBuf=new Uint8Array(19);constructor(e){super(e,0,e.length,null)}readNumber(){let e,t=0;do{const a=this.getByte();if(a<0)throw new FormatError("unexpected EOF in bcmap");e=!(128&a);t=t<<7|127&a}while(!e);return t}readSigned(){const e=this.readNumber();return 1&e?~(e>>>1):e>>>1}readHex(e,t){e.set(this.getBytes(t+1))}readHexNumber(e,t){let a;const n=this.tmpBuf;let s=0;do{const e=this.getByte();if(e<0)throw new FormatError("unexpected EOF in bcmap");a=!(128&e);n[s++]=127&e}while(!a);let r=t,i=0,o=0;for(;r>=0;){for(;o<8&&n.length>0;){i|=n[--s]<>=8;o-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const a=1&e[t]?255:0;let n=0;for(let s=0;s<=t;s++){n=(1&n)<<8|e[s];e[s]=n>>1^a}}readString(){const e=this.readNumber(),t=new Array(e);for(let a=0;a=0;){const e=u>>5;if(7===e){switch(31&u){case 0:n.readString();break;case 1:r=n.readString()}continue}const a=!!(16&u),s=15&u;if(s+1>$a)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const m=1,p=n.readNumber();switch(e){case 0:n.readHex(i,s);n.readHexNumber(o,s);addHex(o,i,s);t.addCodespaceRange(s+1,hexToInt(i,s),hexToInt(o,s));for(let e=1;e=0;--s){n[a+s]=255&i;i>>=8}}}}class AsciiHexStream extends DecodeStream{constructor(e,t){t&&(t*=.5);super(t);this.stream=e;this.dict=e.dict;this.firstDigit=-1}readBlock(){const e=this.stream.getBytes(8e3);if(!e.length){this.eof=!0;return}const t=e.length+1>>1,a=this.ensureBuffer(this.bufferLength+t);let n=this.bufferLength,s=this.firstDigit;for(const t of e){let e;if(t>=48&&t<=57)e=15&t;else{if(!(t>=65&&t<=70||t>=97&&t<=102)){if(62===t){this.eof=!0;break}continue}e=9+(15&t)}if(s<0)s=e;else{a[n++]=s<<4|e;s=-1}}if(s>=0&&this.eof){a[n++]=s<<4;s=-1}this.firstDigit=s;this.bufferLength=n}}let Ya=(()=>{const e=Int32Array.from([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]),t=Int32Array.from([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),a=Int32Array.from([0,3,2,1,0,0,0,0,0,0,3,3,3,3,3,3]),n=Int32Array.from([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),s=Int32Array.from([131072,131076,131075,196610,131072,131076,131075,262145,131072,131076,131075,196610,131072,131076,131075,262149]),r=Int32Array.from([1,5,9,13,17,25,33,41,49,65,81,97,113,145,177,209,241,305,369,497,753,1265,2289,4337,8433,16625]),i=Int32Array.from([2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,7,8,9,10,11,12,13,24]),o=Int16Array.from([0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,12,14,24]),l=Int16Array.from([0,0,0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,24]),f=new Int16Array(2816);!function unpackCommandLookupTable(e){const t=new Int32Array(24),a=new Int32Array(24);a[0]=2;for(let e=0;e<23;++e){t[e+1]=t[e]+(1<>6,r=-4;if(s>=2){s-=2;r=0}const i=(170064>>2*s&3)<<3|n>>3&7,f=(156228>>2*s&3)<<3|7&n,c=a[f],h=r+Math.min(c,5)-2,u=4*n;e[u]=o[i]|l[f]<<8;e[u+1]=t[i];e[u+2]=a[f];e[u+3]=h}}(f);function log2floor(e){let t=-1,a=16,n=e;for(;a>0;){let e=n>>a;if(0!==e){t+=a;n=e}a>>=1}return t+n}function calculateDistanceAlphabetSize(e,t,a){return 16+t+2*(a<>a),r=log2floor(s)-1;return((r-1<<1|s>>r&1)-1<=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}if(0!==readFewBits(e,1)){const t=readFewBits(e,3);return 0===t?1:readFewBits(e,t)+(1<>>a.bitOffset;n+=255&s;const r=e[n]>>16,i=65535&e[n];if(r<=8){a.bitOffset+=r;return i}n+=i;n+=(s&(1<>>8;a.bitOffset+=8+(e[n]>>16);return 65535&e[n]}function readBlockLength(e,t,a){if(a.bitOffset>=16){a.accumulator32=a.shortBuffer[a.halfOffset++]<<16|a.accumulator32>>>16;a.bitOffset-=16}const n=readSymbol(e,t,a),s=i[n];if(a.bitOffset>=16){a.accumulator32=a.shortBuffer[a.halfOffset++]<<16|a.accumulator32>>>16;a.bitOffset-=16}return r[n]+(s<=16?readFewBits(a,s):readManyBits(a,s))}function moveToFront(e,t){let a=t;const n=e[a];for(;a>0;){e[a]=e[a-1];a--}e[0]=n}function readSimpleHuffmanCode(e,t,a,n,s){const r=new Int32Array(t),i=new Int32Array(4),o=1+log2floor(e-1),l=readFewBits(s,2)+1;for(let e=0;e=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}const a=readFewBits(s,o);if(a>=t)return makeError(s,-15);i[e]=a}const f=function checkDupes(e,t,a){for(let n=0;n=16){i.accumulator32=i.shortBuffer[i.halfOffset++]<<16|i.accumulator32>>>16;i.bitOffset-=16}const n=i.accumulator32>>>i.bitOffset&15;i.bitOffset+=s[n]>>16;const r=65535&s[n];l[a]=r;if(0!==r){f-=32>>r;c++;if(f<=0)break}}if(0!==f&&1!==c)return makeError(i,-4);const h=function readHuffmanCodeLengths(e,t,a,n){let s=0,r=8,i=0,o=0,l=32768;const f=new Int32Array(33);buildHuffmanTable(f,f.length-1,5,e,18);for(;s0;){if(n.halfOffset>2030){const e=readMoreInput(n);if(e<0)return e}if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}const e=n.accumulator32>>>n.bitOffset&31;n.bitOffset+=f[e]>>16;const c=65535&f[e];if(c<16){i=0;a[s++]=c;if(0!==c){r=c;l-=32768>>c}}else{const e=c-14;let f=0;16===c&&(f=r);if(o!==f){i=0;o=f}const h=i;if(i>0){i-=2;i<<=e}if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}i+=readFewBits(n,e)+3;const u=i-h;if(s+u>t)return makeError(n,-2);for(let e=0;e2030){const e=readMoreInput(s);if(e<0)return e}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}const r=readFewBits(s,2);return 1===r?readSimpleHuffmanCode(e,t,a,n,s):readComplexHuffmanCode(t,r,a,n,s)}function decodeContextMap(t,a,n){let s;if(n.halfOffset>2030){s=readMoreInput(n);if(s<0)return s}const r=decodeVarLenUnsignedByte(n)+1;if(1===r){a.fill(0,0,t);return r}if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}let i=0;0!==readFewBits(n,1)&&(i=readFewBits(n,4)+1);const o=r+i,l=e[o+31>>5],f=new Int32Array(l+1),c=f.length-1;s=readHuffmanCode(o,o,f,c,n);if(s<0)return s;let h=0;for(;h2030){s=readMoreInput(n);if(s<0)return s}if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}const e=readSymbol(f,c,n);if(0===e){a[h]=0;h++}else if(e<=i){if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}let s=(1<=t)return makeError(n,-3);a[h]=0;h++;s--}}else{a[h]=e-i;h++}}if(n.bitOffset>=16){n.accumulator32=n.shortBuffer[n.halfOffset++]<<16|n.accumulator32>>>16;n.bitOffset-=16}1===readFewBits(n,1)&&function inverseMoveToFrontTransform(e,t){const a=new Int32Array(256);for(let e=0;e<256;++e)a[e]=e;for(let n=0;n=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}let r=readSymbol(e.blockTrees,2*t,e);const i=readBlockLength(e.blockTrees,2*t+1,e);1===r?r=n[s+1]+1:0===r?r=n[s]:r-=2;r>=a&&(r-=a);n[s]=n[s+1];n[s+1]=r;return i}function decodeLiteralBlockSwitch(e){e.literalBlockLength=decodeBlockTypeAndLength(e,0,e.numLiteralBlockTypes);const t=e.rings[5];e.contextMapSlice=t<<6;e.literalTreeIdx=255&e.contextMap[e.contextMapSlice];const a=e.contextModes[t];e.contextLookupOffset1=a<<9;e.contextLookupOffset2=e.contextLookupOffset1+256}function decodeCommandBlockSwitch(e){e.commandBlockLength=decodeBlockTypeAndLength(e,1,e.numCommandBlockTypes);e.commandTreeIdx=e.rings[7]}function decodeDistanceBlockSwitch(e){e.distanceBlockLength=decodeBlockTypeAndLength(e,2,e.numDistanceBlockTypes);e.distContextMapSlice=e.rings[9]<<2}function readNextMetablockHeader(e){if(0!==e.inputEnd){e.nextRunningState=10;e.runningState=12;return 0}e.literalTreeGroup=new Int32Array(0);e.commandTreeGroup=new Int32Array(0);e.distanceTreeGroup=new Int32Array(0);let t;if(e.halfOffset>2030){t=readMoreInput(e);if(t<0)return t}t=function decodeMetaBlockLength(e){if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}e.inputEnd=readFewBits(e,1);e.metaBlockLength=0;e.isUncompressed=0;e.isMetadata=0;if(0!==e.inputEnd&&0!==readFewBits(e,1))return 0;const t=readFewBits(e,2)+4;if(7===t){e.isMetadata=1;if(0!==readFewBits(e,1))return makeError(e,-6);const t=readFewBits(e,2);if(0===t)return 0;for(let a=0;a=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const n=readFewBits(e,8);if(0===n&&a+1===t&&t>1)return makeError(e,-8);e.metaBlockLength+=n<<8*a}}else for(let a=0;a=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const n=readFewBits(e,4);if(0===n&&a+1===t&&t>4)return makeError(e,-8);e.metaBlockLength+=n<<4*a}e.metaBlockLength++;0===e.inputEnd&&(e.isUncompressed=readFewBits(e,1));return 0}(e);if(t<0)return t;if(0===e.metaBlockLength&&0===e.isMetadata)return 0;if(0!==e.isUncompressed||0!==e.isMetadata){t=jumpToByteBoundary(e);if(t<0)return t;0===e.isMetadata?e.runningState=6:e.runningState=5}else e.runningState=3;if(0!==e.isMetadata)return 0;e.expectedTotalSize+=e.metaBlockLength;e.expectedTotalSize>1<<30&&(e.expectedTotalSize=1<<30);e.ringBufferSizee.expectedTotalSize){const a=e.expectedTotalSize;for(;t>>1>a;)t>>=1;0===e.inputEnd&&t<16384&&e.maxRingBufferSize>=16384&&(t=16384)}if(t<=e.ringBufferSize)return;const a=new Int8Array(t+37),n=e.ringBuffer;0!==n.length&&a.set(n.subarray(0,e.ringBufferSize),0);e.ringBuffer=a;e.ringBufferSize=t}(e);return 0}function readMetablockPartition(e,t,a){let n=e.blockTrees[2*t];if(a<=1){e.blockTrees[2*t+1]=n;e.blockTrees[2*t+2]=n;return 1<<28}const s=a+2;let r=readHuffmanCode(s,s,e.blockTrees,2*t,e);if(r<0)return r;n+=r;e.blockTrees[2*t+1]=n;r=readHuffmanCode(26,26,e.blockTrees,2*t+1,e);if(r<0)return r;n+=r;e.blockTrees[2*t+2]=n;return readBlockLength(e.blockTrees,2*t+1,e)}function readMetablockHuffmanCodesAndContextMaps(e){e.numLiteralBlockTypes=decodeVarLenUnsignedByte(e)+1;let t=readMetablockPartition(e,0,e.numLiteralBlockTypes);if(t<0)return t;e.literalBlockLength=t;e.numCommandBlockTypes=decodeVarLenUnsignedByte(e)+1;t=readMetablockPartition(e,1,e.numCommandBlockTypes);if(t<0)return t;e.commandBlockLength=t;e.numDistanceBlockTypes=decodeVarLenUnsignedByte(e)+1;t=readMetablockPartition(e,2,e.numDistanceBlockTypes);if(t<0)return t;e.distanceBlockLength=t;if(e.halfOffset>2030){t=readMoreInput(e);if(t<0)return t}if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}e.distancePostfixBits=readFewBits(e,2);e.numDirectDistanceCodes=readFewBits(e,4)<=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}e.contextModes[a]=readFewBits(e,2);a++}if(e.halfOffset>2030){t=readMoreInput(e);if(t<0)return t}}const n=e.numLiteralBlockTypes<<6;e.contextMap=new Int8Array(n);t=decodeContextMap(n,e.contextMap,e);if(t<0)return t;const s=t;e.trivialLiteralContext=1;for(let t=0;t>6){e.trivialLiteralContext=0;break}e.distContextMap=new Int8Array(e.numDistanceBlockTypes<<2);t=decodeContextMap(e.numDistanceBlockTypes<<2,e.distContextMap,e);if(t<0)return t;const r=t;e.literalTreeGroup=new Int32Array(huffmanTreeGroupAllocSize(256,s));t=decodeHuffmanTreeGroup(256,256,s,e,e.literalTreeGroup);if(t<0)return t;e.commandTreeGroup=new Int32Array(huffmanTreeGroupAllocSize(704,e.numCommandBlockTypes));t=decodeHuffmanTreeGroup(704,704,e.numCommandBlockTypes,e,e.commandTreeGroup);if(t<0)return t;let i=calculateDistanceAlphabetSize(e.distancePostfixBits,e.numDirectDistanceCodes,24),o=i;if(1===e.isLargeWindow){i=calculateDistanceAlphabetSize(e.distancePostfixBits,e.numDirectDistanceCodes,62);t=calculateDistanceAlphabetLimit(e,2147483644,e.distancePostfixBits,e.numDirectDistanceCodes);if(t<0)return t;o=t}e.distanceTreeGroup=new Int32Array(huffmanTreeGroupAllocSize(o,r));t=decodeHuffmanTreeGroup(i,o,r,e,e.distanceTreeGroup);if(t<0)return t;!function calculateDistanceLut(e,t){const a=e.distExtraBits,n=e.distOffset,s=e.distancePostfixBits,r=e.numDirectDistanceCodes,i=1<>>e.bitOffset;e.bitOffset+=8;r--}if(0===r)return 0;const i=Math.min(halfAvailable(e),r>>1);if(i>0){const a=e.halfOffset<<1,n=i<<1;t.set(e.byteBuffer.subarray(a,a+n),s);s+=n;r-=n;e.halfOffset+=i}if(0===r)return 0;if(halfAvailable(e)>0){if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}for(;0!==r;){t[s++]=e.accumulator32>>>e.bitOffset;e.bitOffset+=8;r--}return checkHealth(e,0)}for(;r>0;){const a=readInput(e,t,s,r);if(a<-1)return a;if(a<=0)return makeError(e,-16);s+=a;r-=a}return 0}(e,t,e.pos,n);if(a<0)return a;e.metaBlockLength-=n;e.pos+=n;if(e.pos===e.ringBufferSize){e.nextRunningState=6;e.runningState=12;return 0}a=reload(e);if(a<0)return a;e.runningState=2;return 0}function writeRingBuffer(e){const t=Math.min(e.outputLength-e.outputUsed,e.ringBufferBytesReady-e.ringBufferBytesWritten);if(0!==t){e.output.set(e.ringBuffer.subarray(e.ringBufferBytesWritten,e.ringBufferBytesWritten+t),e.outputOffset+e.outputUsed);e.outputUsed+=t;e.ringBufferBytesWritten+=t}return e.outputUsed>5]}function decodeHuffmanTreeGroup(e,t,a,n,s){let r=a;for(let i=0;i2147483644)return makeError(e,-9);const a=e.distance-e.maxDistance-1-e.cdTotalSize;if(a<0){const t=function initializeCompoundDictionaryCopy(e,t,a){-1===e.cdBlockBits&&function initializeCompoundDictionary(e){e.cdBlockMap=new Int8Array(256);let t=8;for(;e.cdTotalSize-1>>t;)t++;t-=8;e.cdBlockBits=t;let a=0,n=0;for(;a>t]=n;a+=1<>e.cdBlockBits];for(;t>=e.cdChunkOffsets[n+1];)n++;if(e.cdTotalSize>t+a)return makeError(e,-9);e.distRbIdx=e.distRbIdx+1&3;e.rings[e.distRbIdx]=e.distance;e.metaBlockLength-=a;e.cdBrIndex=n;e.cdBrOffset=t-e.cdChunkOffsets[n];e.cdBrLength=a;e.cdBrCopied=0;return 0}(e,-a-1,e.copyLength);if(t<0)return t;e.runningState=14}else{const n=u,s=e.copyLength;if(s>31)return makeError(e,-9);const r=p[s];if(0===r)return makeError(e,-9);let i=m[s];const o=a>>r;i+=(a&(1<=l.numTransforms)return makeError(e,-9);const f=function transformDictionaryWord(e,t,a,n,s,r,i){let o=t;const l=r.triplets,f=r.prefixSuffixStorage,c=r.prefixSuffixHeads,h=3*i,u=l[h],m=l[h+1],p=l[h+2];let d=c[u];const g=c[u+1];let b=c[p];const w=c[p+1];let j=m-11,k=m;(j<1||j>9)&&(j=0);(k<1||k>9)&&(k=0);for(;d!==g;)e[o++]=f[d++];let y=s;j>y&&(j=y);let q=n+j;y-=j;y-=k;let v=y;for(;v>0;){e[o++]=a[q++];v--}if(10===m||11===m){let t=o-y;10===m&&(y=1);for(;y>0;){const a=255&e[t];if(a<192){a>=97&&a<=122&&(e[t]=32^e[t]);t+=1;y-=1}else if(a<224){e[t+1]=32^e[t+1];t+=2;y-=2}else{e[t+2]=5^e[t+2];t+=3;y-=3}}}else if(21===m||22===m){let t=o-y;const a=r.params[i];let n=16777216-(32768&a)+(32767&a);for(;y>0;){let a=1;const s=255&e[t];if(s<128){n+=s;e[t]=127&n}else if(s<192);else if(s<224)if(y>=2){const r=e[t+1];n+=63&r|(31&s)<<6;e[t]=192|n>>6&31;e[t+1]=192&r|63&n;a=2}else a=y;else if(s<240)if(y>=3){const r=e[t+1],i=e[t+2];n+=63&i|(63&r)<<6|(15&s)<<12;e[t]=224|n>>12&15;e[t+1]=192&r|n>>6&63;e[t+2]=192&i|63&n;a=3}else a=y;else if(s<248)if(y>=4){const r=e[t+1],i=e[t+2],o=e[t+3];n+=63&o|(63&i)<<6|(63&r)<<12|(7&s)<<18;e[t]=240|n>>18&7;e[t+1]=192&r|n>>12&63;e[t+2]=192&i|n>>6&63;e[t+3]=192&o|63&n;a=4}else a=y;t+=a;y-=a;21===m&&(y=0)}}for(;b!==w;)e[o++]=f[b++];return o-t}(e.ringBuffer,e.pos,n,i,s,l,o);e.pos+=f;e.metaBlockLength-=f;if(e.pos>=t){e.nextRunningState=4;e.runningState=12;return 0}e.runningState=4}return 0}function copyFromCompoundDictionary(e,t){let a=e.pos;const n=a;for(;e.cdBrLength!==e.cdBrCopied;){const n=t-a,s=e.cdChunkOffsets[e.cdBrIndex+1]-e.cdChunkOffsets[e.cdBrIndex]-e.cdBrOffset;let r=e.cdBrLength-e.cdBrCopied;r>s&&(r=s);r>n&&(r=n);e.ringBuffer.set(e.cdChunks[e.cdBrIndex].subarray(e.cdBrOffset,e.cdBrOffset+r),a);a+=r;e.cdBrOffset+=r;e.cdBrCopied+=r;if(r===s){e.cdBrIndex++;e.cdBrOffset=0}if(a>=t)break}return a-n}function decompress(e){let t;if(0===e.runningState)return makeError(e,-25);if(e.runningState<0)return makeError(e,-28);if(11===e.runningState)return makeError(e,-22);if(1===e.runningState){const t=function decodeWindowBits(e){const t=e.isLargeWindow;e.isLargeWindow=0;if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}if(0===readFewBits(e,1))return 16;let a=readFewBits(e,3);if(0!==a)return 17+a;a=readFewBits(e,3);if(0!==a){if(1===a){if(0===t)return-1;e.isLargeWindow=1;if(1===readFewBits(e,1))return-1;a=readFewBits(e,6);return a<10||a>30?-1:a}return 8+a}return 17}(e);if(-1===t)return makeError(e,-11);e.maxRingBufferSize=1<2030){t=readMoreInput(e);if(t<0)return t}0===e.commandBlockLength&&decodeCommandBlockSwitch(e);e.commandBlockLength--;if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const o=readSymbol(e.commandTreeGroup,e.commandTreeIdx,e)<<2,l=f[o],c=f[o+1],u=f[o+2];e.distanceCode=f[o+3];if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const m=255&l;e.insertLength=c+(m<=16?readFewBits(e,m):readManyBits(e,m));if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const p=l>>8;e.copyLength=u+(p<=16?readFewBits(e,p):readManyBits(e,p));e.j=0;e.runningState=7;continue;case 7:if(0!==e.trivialLiteralContext)for(;e.j2030){t=readMoreInput(e);if(t<0)return t}0===e.literalBlockLength&&decodeLiteralBlockSwitch(e);e.literalBlockLength--;if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}i[e.pos]=readSymbol(e.literalTreeGroup,e.literalTreeIdx,e);e.pos++;e.j++;if(e.pos>=s){e.nextRunningState=7;e.runningState=12;break}}else{let a=255&i[e.pos-1&r],n=255&i[e.pos-2&r];for(;e.j2030){t=readMoreInput(e);if(t<0)return t}0===e.literalBlockLength&&decodeLiteralBlockSwitch(e);const r=h[e.contextLookupOffset1+a]|h[e.contextLookupOffset2+n],o=255&e.contextMap[e.contextMapSlice+r];e.literalBlockLength--;n=a;if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}a=readSymbol(e.literalTreeGroup,o,e);i[e.pos]=a;e.pos++;e.j++;if(e.pos>=s){e.nextRunningState=7;e.runningState=12;break}}}if(7!==e.runningState)continue;e.metaBlockLength-=e.insertLength;if(e.metaBlockLength<=0){e.runningState=4;continue}let d=e.distanceCode;if(d<0)e.distance=e.rings[e.distRbIdx];else{if(e.halfOffset>2030){t=readMoreInput(e);if(t<0)return t}0===e.distanceBlockLength&&decodeDistanceBlockSwitch(e);e.distanceBlockLength--;if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}const s=255&e.distContextMap[e.distContextMapSlice+d];d=readSymbol(e.distanceTreeGroup,s,e);if(d<16){const t=e.distRbIdx+a[d]&3;e.distance=e.rings[t]+n[d];if(e.distance<0)return makeError(e,-12)}else{const t=e.distExtraBits[d];let a;if(e.bitOffset+t<=32)a=readFewBits(e,t);else{if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}a=t<=16?readFewBits(e,t):readManyBits(e,t)}e.distance=e.distOffset[d]+(a<e.maxDistance){e.runningState=9;continue}if(d>0){e.distRbIdx=e.distRbIdx+1&3;e.rings[e.distRbIdx]=e.distance}if(e.copyLength>e.metaBlockLength)return makeError(e,-9);e.j=0;e.runningState=8;continue;case 8:let g=e.pos-e.distance&r,b=e.pos;const w=e.copyLength-e.j,j=g+w,k=b+w;if(jb&&k>g){const e=w+3>>2;for(let t=0;t=s){e.nextRunningState=8;e.runningState=12;break}}8===e.runningState&&(e.runningState=4);continue;case 9:t=doUseDictionary(e,s);if(t<0)return t;continue;case 14:e.pos+=copyFromCompoundDictionary(e,s);if(e.pos>=s){e.nextRunningState=14;e.runningState=12;return 2}e.runningState=4;continue;case 5:for(;e.metaBlockLength>0;){if(e.halfOffset>2030){t=readMoreInput(e);if(t<0)return t}if(e.bitOffset>=16){e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16}readFewBits(e,8);e.metaBlockLength--}e.runningState=2;continue;case 6:t=copyUncompressedData(e);if(t<0)return t;continue;case 12:e.ringBufferBytesReady=Math.min(e.pos,e.ringBufferSize);e.runningState=13;continue;case 13:t=writeRingBuffer(e);if(0!==t)return t;e.pos>=e.maxBackwardDistance&&(e.maxDistance=e.maxBackwardDistance);if(e.pos>=e.ringBufferSize){e.pos>e.ringBufferSize&&i.copyWithin(0,e.ringBufferSize,e.pos);e.pos=e.pos&r;e.ringBufferBytesWritten=0}e.runningState=e.nextRunningState;continue;default:return makeError(e,-28)}if(10!==e.runningState)return makeError(e,-29);if(e.metaBlockLength<0)return makeError(e,-10);t=jumpToByteBoundary(e);if(0!==t)return t;t=checkHealth(e,1);return 0!==t?t:1}const c=new function Transforms(e,t,a){this.numTransforms=0;this.triplets=new Int32Array(0);this.prefixSuffixStorage=new Int8Array(0);this.prefixSuffixHeads=new Int32Array(0);this.params=new Int16Array(0);this.numTransforms=e;this.triplets=new Int32Array(3*e);this.params=new Int16Array(e);this.prefixSuffixStorage=new Int8Array(t);this.prefixSuffixHeads=new Int32Array(a+1)}(121,167,50);!function unpackTransforms(e,t,a,n,s){const r=toUtf8Runes(n),i=r.length;let o=1,l=0;for(let a=0;a#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #'," !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K");function getNextKey(e,t){let a=1<>=1;return(e&a-1)+a}function replicateValue(e,t,a,n,s){let r=n;for(;r>0;){r-=a;e[t+r]=s}}function nextTableBitSize(e,t,a){let n=t,s=1<0;){replicateValue(e,r+u,p,c,t<<16|i[m++]);u=getNextKey(u,t);o[t]--}}const d=h-1;let g=-1,b=r;p=1;for(let t=a+1;t<=15;++t){p<<=1;for(;o[t]>0;){if((u&d)!==g){b+=c;f=nextTableBitSize(o,t,a);c=1<>a),p,c,t-a<<16|i[m++]);u=getNextKey(u,t);o[t]--}}return h}function readMoreInput(e){if(0!==e.endOfStreamReached)return halfAvailable(e)>=-2?0:makeError(e,-16);const t=e.halfOffset<<1;let a=4096-t;e.byteBuffer.copyWithin(0,t,4096);e.halfOffset=0;for(;a<4096;){const t=4096-a,n=readInput(e,e.byteBuffer,a,t);if(n<-1)return n;if(n<=0){e.endOfStreamReached=1;e.tailBytes=a;a+=1;break}a+=n}!function bytesToNibbles(e,t){const a=e.byteBuffer,n=t>>1,s=e.shortBuffer;for(let e=0;e>3)-4;return a>e.tailBytes?makeError(e,-13):0!==t&&a!==e.tailBytes?makeError(e,-17):0}function readFewBits(e,t){const a=e.accumulator32>>>e.bitOffset&(1<>>16;e.bitOffset-=16;return a|readFewBits(e,t-16)<<16}function prepare(e){if(e.halfOffset>2030){const t=readMoreInput(e);if(0!==t)return t}let t=checkHealth(e,0);if(0!==t)return t;e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16;e.accumulator32=e.shortBuffer[e.halfOffset++]<<16|e.accumulator32>>>16;e.bitOffset-=16;return 0}function reload(e){return 32===e.bitOffset?prepare(e):0}function jumpToByteBoundary(e){const t=32-e.bitOffset&7;if(0!==t){if(0!==readFewBits(e,t))return makeError(e,-5)}return 0}function halfAvailable(e){let t=2048;0!==e.endOfStreamReached&&(t=e.tailBytes+1>>1);return t-e.halfOffset}const h=new Int32Array(2048);!function unpackLookupTable(e,t,a){for(let t=0;t<256;++t){e[t]=63&t;e[512+t]=t>>2;e[1792+t]=2+(t>>6)}for(let a=0;a<128;++a)e[1024+a]=4*(t.charCodeAt(a)-32);for(let t=0;t<64;++t){e[1152+t]=1&t;e[1216+t]=2+(1&t)}let n=1280;for(let t=0;t<19;++t){const s=3&t,r=a.charCodeAt(t)-32;for(let t=0;t>1;for(let e=0;e!pfwp6s{8-ip<73s{je#+pllmpfbwmlmfwvafyfqlpfmwqffgeb`wjmwldjewkbqn2;s{`bnfkjooalogyllnuljgfbpzqjmdejoosfbhjmjw`lpw0s{8ib`hwbdpajwpqloofgjwhmftmfbq?"..dqltIPLMgvwzMbnfpbofzlv#olwpsbjmibyy`logfzfpejpkttt-qjphwbapsqfu23s{qjpf16s{Aovfgjmd033/abooelqgfbqmtjogal{-ebjqob`hufqpsbjqivmfwf`kje+"sj`hfujo\'+! tbqnolqgglfpsvoo/333jgfbgqbtkvdfpslwevmgavqmkqfe`foohfzpwj`hklvqolppevfo21s{pvjwgfboQPP!bdfgdqfzDFW!fbpfbjnpdjqobjgp;s{8mbuzdqjgwjsp :::tbqpobgz`bqp*8#~sksolpfmvooubpwtjmgQPP#tfbqqfozaffmpbnfgvhfmbpb`bsftjpkdvoeW109kjwppolwdbwfhj`haovqwkfz26s{$$*8*8!=npjftjmpajqgplqwafwbpffhW2;9lqgpwqffnboo53s{ebqnlupalzpX3^-$*8!SLPWafbqhjgp*8~~nbqzwfmg+VH*rvbgyk9\n.pjy....sqls$*8ojewW2:9uj`fbmgzgfaw=QPPsllomf`haoltW259gllqfuboW249ofwpebjolqbosloomlub`lopdfmf#lxplewqlnfwjooqlpp?k0=slvqebgfsjmh?wq=njmj*"+njmfyk9abqpkfbq33*8njoh#..=jqlmeqfggjphtfmwpljosvwp,ip,klozW119JPAMW139bgbnpffp?k1=iplm$/#$`lmwW129#QPPollsbpjbnllm?,s=plvoOJMFelqw`bqwW279?k2=;3s{"..?:s{8W379njhf975Ymj`fjm`kZlqhqj`fyk9\b$**8svqfnbdfsbqbwlmfalmg904Y\\le\\$^*8333/yk9\vwbmhzbqgaltoavpk965YIbub03s{\t~\t&@0&907YifeeF[SJ`bpkujpbdloepmltyk9rvfq-`pppj`hnfbwnjm-ajmggfookjqfsj`pqfmw905YKWWS.132elwltloeFMG#{al{967YALGZgj`h8\t~\tf{jw906Yubqpafbw$~*8gjfw:::8bmmf~~?,Xj^-Obmdhn.^tjqfwlzpbggppfbobof{8\t\n~f`klmjmf-lqd336*wlmziftppbmgofdpqlle333*#133tjmfdfbqgldpallwdbqz`vwpwzofwfnswjlm-{no`l`hdbmd\'+$-63s{Sk-Gnjp`bobmolbmgfphnjofqzbmvmj{gjp`*8~\tgvpw`ojs*-\t\t43s{.133GUGp4^=?wbsfgfnlj((*tbdffvqlskjolswpklofEBRpbpjm.15WobapsfwpVQO#avoh`llh8~\tKFBGX3^*baaqivbm+2:;ofpkwtjm?,j=plmzdvzpev`hsjsf.\t"331*mgltX2^8X^8\tOld#pbow\t\n\nabmdwqjnabwk*x\t33s{\t~*8hl9\0effpbg=p9,,#X^8wloosovd+*x\tx\t#-ip$133sgvboalbw-ISD*8\t~rvlw*8\t\t$*8\t\t~1327132613251324132;132:13131312131113101317131613151314131;131:130313021301130013071306130513041320132113221323133:133;133413351336133713301331133213332:::2::;2::42::52::62::72::02::12::22::32:;:2:;;2:;42:;52:;62:;72:;02:;12:;22:;32:4:2:4;2:442:452:462:472:402:412:422:432:5:2:5;2:542:552:562:572:502:512:522:532:6:2:6;2:642:652:662:672:602:612:622:632333231720:73333::::`lnln/Mpfpwffpwbsfqlwlglkb`f`bgbb/]lajfmg/Abbp/Aujgb`bpllwqlelqlplollwqb`vbogjilpjgldqbmwjslwfnbgfafbodlrv/Efpwlmbgbwqfpsl`l`bpbabilwlgbpjmlbdvbsvfpvmlpbmwfgj`fovjpfoobnbzlylmbbnlqsjpllaqb`oj`foolgjlpklqb`bpj<[<\\!sbqhpnlvpfNlpw#---?,bnlmdaqbjmalgz#mlmf8abpfg`bqqzgqbewqfefqsbdf\\klnf-nfwfqgfobzgqfbnsqlufiljmw?,wq=gqvdp?"..#bsqjojgfboboofmf{b`welqwk`lgfpoldj`Ujft#pffnpaobmhslqwp#+133pbufg\\ojmhdlbopdqbmwdqffhklnfpqjmdpqbwfg03s{8tklpfsbqpf+*8!#Aol`hojmv{ilmfpsj{fo$*8!=*8je+.ofewgbujgklqpfEl`vpqbjpfal{fpWqb`hfnfmw?,fn=abq!=-pq`>wltfqbow>!`baofkfmqz17s{8pfwvsjwbozpkbqsnjmlqwbpwftbmwpwkjp-qfpfwtkffodjqop,`pp,233&8`ovappwveeajaofulwfp#2333hlqfb~*8\tabmgprvfvf>#x~8;3s{8`hjmdx\t\n\nbkfbg`ol`hjqjpkojhf#qbwjlpwbwpElqn!zbkll*X3^8Balvwejmgp?,k2=gfavdwbphpVQO#>`foop~*+*821s{8sqjnfwfoopwvqmp3{533-isd!psbjmafb`kwb{fpnj`qlbmdfo..=?,djewppwfuf.ojmhalgz-~*8\t\nnlvmw#+2::EBR?,qldfqeqbmh@obpp1;s{8effgp?k2=?p`lwwwfpwp11s{8gqjmh*##oftjppkboo 30:8#elq#olufgtbpwf33s{8ib9npjnlm?elmwqfsoznffwpvmwfq`kfbswjdkwAqbmg*#">#gqfpp`ojspqllnplmhfznlajonbjm-Mbnf#sobwfevmmzwqffp`ln,!2-isdtnlgfsbqbnPWBQWofew#jggfm/#132*8\t~\telqn-ujqvp`kbjqwqbmptlqpwSbdfpjwjlmsbw`k?"..\tl.`b`ejqnpwlvqp/333#bpjbmj((*xbglaf$*X3^jg>23alwk8nfmv#-1-nj-smd!hfujm`lb`k@kjogaqv`f1-isdVQO*(-isdpvjwfpoj`fkbqqz213!#ptffwwq=\tmbnf>gjfdlsbdf#ptjpp..=\t\t eee8!=Old-`ln!wqfbwpkffw*#%%#27s{8poffsmwfmwejofgib9ojg>!`Mbnf!tlqpfpklwp.al{.gfowb\t%ow8afbqp97;Y?gbwb.qvqbo?,b=#psfmgabhfqpklsp>#!!8sks!=`wjlm20s{8aqjbmkfoolpjyf>l>&1E#iljmnbzaf?jnd#jnd!=/#eipjnd!#!*X3^NWlsAWzsf!mftozGbmph`yf`kwqbjohmltp?,k6=ebr!=yk.`m23*8\t.2!*8wzsf>aovfpwqvozgbujp-ip$8=\t?"pwffo#zlv#k1=\telqn#ifpvp233&#nfmv-\t\n\ttbofpqjphpvnfmwggjmda.ojhwfb`kdje!#ufdbpgbmphffpwjpkrjspvlnjplaqfgfpgffmwqfwlglpsvfgfb/]lpfpw/Mwjfmfkbpwblwqlpsbqwfglmgfmvfulkb`fqelqnbnjpnlnfilqnvmglbrv/Ag/Abpp/_olbzvgbef`kbwlgbpwbmwlnfmlpgbwlplwqbppjwjlnv`klbklqbovdbqnbzlqfpwlpklqbpwfmfqbmwfpelwlpfpwbpsb/Apmvfubpbovgelqlpnfgjlrvjfmnfpfpslgfq`kjofpfq/Muf`fpgf`jqilp/Efpwbqufmwbdqvslkf`klfoolpwfmdlbnjdl`lpbpmjufodfmwfnjpnbbjqfpivojlwfnbpkb`jbebulqivmjlojaqfsvmwlavfmlbvwlqbaqjoavfmbwf{wlnbqylpbafqojpwbovfdl`/_nlfmfqlivfdlsfq/Vkbafqfpwlzmvm`bnvifqubolqevfqbojaqldvpwbjdvboulwlp`bplpdv/Absvfglplnlpbujplvpwfggfafmml`kfavp`bebowbfvqlppfqjfgj`kl`vqpl`obuf`bpbpof/_msobylobqdllaqbpujpwbbslzlivmwlwqbwbujpwl`qfbq`bnslkfnlp`jm`l`bqdlsjplplqgfmkb`fm/Mqfbgjp`lsfgql`fq`bsvfgbsbsfonfmlq/Vwjo`obqlilqdf`boofslmfqwbqgfmbgjfnbq`bpjdvffoobppjdol`l`kfnlwlpnbgqf`obpfqfpwlmj/]lrvfgbsbpbqabm`lkjilpujbifsbaol/Epwfujfmfqfjmlgfibqelmgl`bmbomlqwfofwqb`bvpbwlnbqnbmlpovmfpbvwlpujoobufmglsfpbqwjslpwfmdbnbq`loofubsbgqfvmjglubnlpylmbpbnalpabmgbnbqjbbavplnv`kbpvajqqjlibujujqdqbgl`kj`bboo/Ailufmgj`kbfpwbmwbofppbojqpvfolsfplpejmfpoobnbavp`l/Epwboofdbmfdqlsobybkvnlqsbdbqivmwbglaofjpobpalopbab/]lkbaobov`kb/mqfbgj`fmivdbqmlwbpuboofboo/M`bqdbglolqbabilfpw/Edvpwlnfmwfnbqjlejqnb`lpwlej`kbsobwbkldbqbqwfpofzfpbrvfonvpflabpfpsl`lpnjwbg`jfol`kj`lnjfgldbmbqpbmwlfwbsbgfafpsobzbqfgfppjfwf`lqwf`lqfbgvgbpgfpflujfilgfpfbbdvbp%rvlw8glnbjm`lnnlmpwbwvpfufmwpnbpwfqpzpwfnb`wjlmabmmfqqfnlufp`qloovsgbwfdolabonfgjvnejowfqmvnafq`kbmdfqfpvowsvaoj`p`qffm`kllpfmlqnbowqbufojppvfpplvq`fwbqdfwpsqjmdnlgvofnlajofptjw`ksklwlpalqgfqqfdjlmjwpfoepl`jbob`wjuf`lovnmqf`lqgelooltwjwof=fjwkfqofmdwkebnjozeqjfmgobzlvwbvwklq`qfbwfqfujftpvnnfqpfqufqsobzfgsobzfqf{sbmgsloj`zelqnbwglvaofsljmwppfqjfpsfqplmojujmdgfpjdmnlmwkpelq`fpvmjrvftfjdkwsflsoffmfqdzmbwvqfpfbq`kejdvqfkbujmd`vpwlnleepfwofwwfqtjmgltpvanjwqfmgfqdqlvspvsolbgkfbowknfwklgujgflpp`klloevwvqfpkbgltgfabwfubovfpLaif`wlwkfqpqjdkwpofbdvf`kqlnfpjnsofmlwj`fpkbqfgfmgjmdpfbplmqfslqwlmojmfprvbqfavwwlmjnbdfpfmbaofnlujmdobwfpwtjmwfqEqbm`fsfqjlgpwqlmdqfsfbwOlmglmgfwbjoelqnfggfnbmgpf`vqfsbppfgwlddofsob`fpgfuj`fpwbwj``jwjfppwqfbnzfooltbwwb`hpwqffweojdkwkjggfmjmel!=lsfmfgvpfevouboofz`bvpfpofbgfqpf`qfwpf`lmggbnbdfpslqwpf{`fswqbwjmdpjdmfgwkjmdpfeef`wejfogppwbwfpleej`fujpvbofgjwlqulovnfQfslqwnvpfvnnlujfpsbqfmwb``fppnlpwoznlwkfq!#jg>!nbqhfwdqlvmg`kbm`fpvqufzafelqfpznalonlnfmwpsff`knlwjlmjmpjgfnbwwfq@fmwfqlaif`wf{jpwpnjggofFvqlsfdqltwkofdb`znbmmfqfmlvdk`bqffqbmptfqlqjdjmslqwbo`ojfmwpfof`wqbmgln`olpfgwlsj`p`lnjmdebwkfqlswjlmpjnsozqbjpfgfp`bsf`klpfm`kvq`kgfejmfqfbplm`lqmfqlvwsvwnfnlqzjeqbnfsloj`fnlgfopMvnafqgvqjmdleefqppwzofphjoofgojpwfg`boofgpjoufqnbqdjmgfofwfafwwfqaqltpfojnjwpDolabopjmdoftjgdfw`fmwfqavgdfwmltqbs`qfgjw`objnpfmdjmfpbefwz`klj`fpsjqjw.pwzofpsqfbgnbhjmdmffgfgqvppjbsofbpff{wfmwP`qjswaqlhfmbooltp`kbqdfgjujgfeb`wlqnfnafq.abpfgwkflqz`lmejdbqlvmgtlqhfgkfosfg@kvq`kjnsb`wpklvogbotbzpoldl!#alwwlnojpw!=*xubq#sqfej{lqbmdfKfbgfq-svpk+`lvsofdbqgfmaqjgdfobvm`kQfujftwbhjmdujpjlmojwwofgbwjmdAvwwlmafbvwzwkfnfpelqdlwPfbq`kbm`klqbonlpwolbgfg@kbmdfqfwvqmpwqjmdqfolbgNlajofjm`lnfpvssozPlvq`flqgfqpujftfg%maps8`lvqpfBalvw#jpobmg?kwno#`llhjfmbnf>!bnbylmnlgfqmbguj`fjm?,b=9#Wkf#gjboldklvpfpAFDJM#Nf{j`lpwbqwp`fmwqfkfjdkwbggjmdJpobmgbppfwpFnsjqfP`kllofeelqwgjqf`wmfbqoznbmvboPfof`w-\t\tLmfiljmfgnfmv!=SkjojsbtbqgpkbmgofjnslqwLeej`fqfdbqgphjoopmbwjlmPslqwpgfdqfftffhoz#+f-d-afkjmggl`wlqolddfgvmjwfg?,a=?,afdjmpsobmwpbppjpwbqwjpwjppvfg033s{`bmbgbbdfm`zp`kfnfqfnbjmAqbyjopbnsofoldl!=afzlmg.p`bofb``fswpfqufgnbqjmfEllwfq`bnfqb?,k2=\t\\elqn!ofbufppwqfpp!#,=\t-dje!#lmolbgolbgfqL{elqgpjpwfqpvqujuojpwfmefnbofGfpjdmpjyf>!bssfbowf{w!=ofufopwkbmhpkjdkfqelq`fgbmjnbobmzlmfBeqj`bbdqffgqf`fmwSflsof?aq#,=tlmgfqsqj`fpwvqmfg#x~8nbjm!=jmojmfpvmgbztqbs!=ebjofg`fmpvpnjmvwfafb`lmrvlwfp263s{fpwbwfqfnlwffnbjo!ojmhfgqjdkw8pjdmboelqnbo2-kwnopjdmvssqjm`feolbw9-smd!#elqvn-B``fppsbsfqpplvmgpf{wfmgKfjdkwpojgfqVWE.;!%bns8#Afelqf-#TjwkpwvgjlltmfqpnbmbdfsqlejwiRvfqzbmmvbosbqbnpalvdkwebnlvpdlldofolmdfqj((*#xjpqbfopbzjmdgf`jgfklnf!=kfbgfqfmpvqfaqbm`ksjf`fpaol`h8pwbwfgwls!=?qb`jmdqfpjyf..%dw8sb`jwzpf{vboavqfbv-isd!#23/333lawbjmwjwofpbnlvmw/#Jm`-`lnfgznfmv!#ozqj`pwlgbz-jmgffg`lvmwz\\oldl-EbnjozollhfgNbqhfwopf#jeSobzfqwvqhfz*8ubq#elqfpwdjujmdfqqlqpGlnbjm~fopfxjmpfqwAold?,ellwfqoldjm-ebpwfqbdfmwp?algz#23s{#3sqbdnbeqjgbzivmjlqgloobqsob`fg`lufqpsovdjm6/333#sbdf!=alpwlm-wfpw+bubwbqwfpwfg\\`lvmwelqvnpp`kfnbjmgf{/ejoofgpkbqfpqfbgfqbofqw+bssfbqPvanjwojmf!=algz!=\t)#WkfWklvdkpffjmdifqpfzMftp?,ufqjezf{sfqwjmivqztjgwk>@llhjfPWBQW#b`qlpp\\jnbdfwkqfbgmbwjufsl`hfwal{!=\tPzpwfn#Gbujg`bm`fqwbaofpsqlufgBsqjo#qfboozgqjufqjwfn!=nlqf!=albqgp`lolqp`bnsvpejqpw##X^8nfgjb-dvjwbqejmjpktjgwk9pkltfgLwkfq#-sks!#bppvnfobzfqptjoplmpwlqfpqfojfeptfgfm@vpwlnfbpjoz#zlvq#Pwqjmd\t\tTkjowbzolq`ofbq9qfplqweqfm`kwklvdk!*#(#!?algz=avzjmdaqbmgpNfnafqmbnf!=lssjmdpf`wlq6s{8!=upsb`fslpwfqnbilq#`leeffnbqwjmnbwvqfkbssfm?,mbu=hbmpbpojmh!=Jnbdfp>ebopftkjof#kpsb`f3%bns8#\t\tJm##sltfqSlophj.`lolqilqgbmAlwwlnPwbqw#.`lvmw1-kwnomftp!=32-isdLmojmf.qjdkwnjoofqpfmjlqJPAM#33/333#dvjgfpubovf*f`wjlmqfsbjq-{no!##qjdkwp-kwno.aol`hqfdF{s9klufqtjwkjmujqdjmsklmfp?,wq=vpjmd#\t\nubq#=$*8\t\n?,wg=\t?,wq=\tabkbpbaqbpjodbofdlnbdzbqslophjpqsphj4]4C5d\bTA\nzk\vBl\bQ\vUmGx\bSM\nmC\bTA\twQ\nd}\bW@\bTl\bTF\ti@\tcT\vBM\v|jBV\tqw\tcC\bWI\npa\tfM\n{Z{X\bTF\bVV\bVK\tmkF\t[]\bPm\bTv\nsI\vpg\t[I\bQpmx\v_W\n^M\npe\vQ}\vGu\nel\npeChBV\bTA\tSo\nzk\vGL\vxD\nd[JzMY\bQpli\nfl\npC{BNt\vwT\ti_\bTgQQ\n|p\vXN\bQS\vxDQC\bWZ\tpD\vVS\bTWNtYh\nzuKjN}\twr\tHa\n_D\tj`\vQ}\vWp\nxZ{c\tji\tBU\nbDa|\tTn\tpV\nZd\nmC\vEV{X\tc}\tTo\bWl\bUd\tIQ\tcg\vxs\nXW\twR\vek\tc}\t]y\tJn\nrp\neg\npV\nz\\{W\npl\nz\\\nzU\tPc\t`{\bV@\nc|\bRw\ti_\bVb\nwX\tHvSu\bTF\v_W\vWs\vsIm\nTT\ndc\tUS\t}f\tiZ\bWz\tc}MD\tBe\tiD\v@@\bTl\bPv\t}tSwM`\vnU\tkW\ved\nqo\vxY\tA|\bTz\vy`BRBM\tiaXU\nyun^\tfL\tiI\nXW\tfD\bWz\bW@\tyj\tm\tav\tBN\vb\\\tpD\bTf\nY[\tJn\bQy\t[^\vWc\vyuDlCJ\vWj\vHR\t`V\vuW\tQy\np@\vGuplJm\bW[\nLP\nxC\n`m\twQuiR\nbI\twQ\tBZ\tWVBR\npg\tcgtiCW\n_y\tRg\bQa\vQB\vWc\nYble\ngESu\nL[\tQ\tea\tdj\v]W\nb~M`\twL\bTV\bVH\nt\npl\t|bs_\bU|\bTaoQlvSkM`\bTv\vK}\nfl\tcCoQBR\tHk\t|d\bQp\tHK\tBZ\vHR\bPv\vLx\vEZ\bT\bTv\tiDoDMU\vwBSuk`St\ntC\tPl\tKg\noi\tjY\vxYh}\nzk\bWZ\tm\ve`\tTB\tfE\nzk\t`zYh\nV|\tHK\tAJ\tAJ\bUL\tp\\\tql\nYcKd\nfyYh\t[I\vDgJm\n]n\nlb\bUd\n{Z\tlu\tfsoQ\bTWJm\vwB\teaYhBC\tsb\tTn\nzU\n_y\vxY\tQ]\ngwmt\tO\\\ntb\bWW\bQy\tmI\tV[\ny\\\naB\vRb\twQ\n]QQJ\bWg\vWa\bQj\ntC\bVH\nYm\vxs\bVK\nel\bWI\vxYCq\ntR\vHV\bTl\bVw\tay\bQa\bVV\t}t\tdj\nr|\tp\\\twR\n{i\nTT\t[I\ti[\tAJ\vxs\v_W\td{\vQ}\tcg\tTz\tA|\tCj\vLmN}m\nbK\tdZ\tp\\\t`V\tsV\np@\tiD\twQ\vQ}\bTfkaJm\v@@\bV`\tzp\n@NSw\tiI\tcg\noiSu\bVwloCy\tc}\vb\\\tsUBA\bWI\bTf\nxS\tVp\nd|\bTV\vbC\tNoJu\nTC\t|`\n{Z\tD]\bU|\tc}lm\bTl\tBv\tPl\tc}\bQp\tm\nLk\tkj\n@NSbKO\tj_\tp\\\nzU\bTl\bTg\bWI\tcfXO\bWW\ndzli\tBN\nd[\bWOMD\vKC\tdj\tI_\bVV\ny\\\vLmxl\txB\tkV\vb\\\vJW\vVS\tVx\vxD\td{MD\bTa\t|`\vPzR}\vWsBM\nsICN\bTaJm\npe\ti_\npV\nrh\tRd\tHv\n~A\nxR\vWh\vWk\nxS\vAz\vwX\nbIoQ\tfw\nqI\nV|\nunz\vpg\td\\\voA{D\ti_xB\bT\t`Vqr\tTTg]CA\vuR\tVJ\tT`\npw\vRb\tI_\nCxRo\vsICjKh\tBv\tWVBBoD{D\nhcKm\v^R\tQE\n{I\np@\nc|Gt\tc}Dl\nzUqN\tsVk}\tHh\v|j\nqou|\tQ]\vekZM`St\npe\tdj\bVG\veE\tm\vWc|I\n[W\tfL\bT\tBZSu\vKaCqNtY[\nqI\bTv\tfM\ti@\t}fB\\\tQy\vBl\bWgXDkc\vx[\bVV\tQ]\ta\tPy\vxD\nfI\t}foD\tdj\tSGls\t~DCN\n{Z\t\\v\n_D\nhc\vx_C[\tAJ\nLM\tVxCI\tbj\tc^\tcF\ntCSx\twrXA\bU\\\t|a\vK\\\bTV\bVj\nd|\tfsCX\ntb\bRw\tVx\tAE\tA|\bTNt\vDg\tVc\bTld@\npo\tM\tcF\npe\tiZ\tBo\bSq\nfHl`\bTx\bWf\tHE\vF{\tcO\tfD\nlm\vfZ\nlm\veU\tdGBH\bTV\tSiMW\nwX\nz\\\t\\cCX\nd}\tl}\bQp\bTV\tF~\bQ\t`i\ng@nO\bUd\bTl\nL[\twQ\tji\ntC\t|J\nLU\naB\vxYKj\tAJuN\ti[\npeSk\vDg\vx]\bVb\bVV\nea\tkV\nqI\bTaSk\nAO\tpD\ntb\nts\nyi\bVg\ti_\v_W\nLkNt\tyj\tfMR\tiI\bTl\vwX\tsV\vMl\nyu\tAJ\bVjKO\tWV\vA}\vW\nrp\tiD\v|olv\vsIBM\td~\tCU\bVbeV\npC\vwT\tj`\tc}\vxs\vps\vvh\tWV\vGg\vAe\vVK\v]W\trg\vWcF`\tBr\vb\\\tdZ\bQp\nqIkF\nLk\vAR\bWI\bTg\tbs\tdw\n{L\n_y\tiZ\bTA\tlg\bVV\bTl\tdk\n`k\ta{\ti_{Awj\twN\v@@\bTe\ti_\n_D\twL\nAH\viK\vek\n[]\tp_\tyj\bTv\tUS\t[r\n{I\npsGt\vVK\nplS}\vWP\t|dMD\vHV\bTR}M`\bTV\bVHlvCh\bW[Ke\tR{\v^R\tab\tBZ\tVA\tB`\nd|\nhsKe\tBeOi\tR{\td\\nB\bWZ\tdZ\tVJOs\tmuQ\vhZQ@QQ\nfI\bW[B\\li\nzU\nMdM`\nxS\bVV\n\\}\vxD\tm\bTpIS\nc|\tkVi~\tV{\vhZ\t|b\bWt\n@R\voA\vnU\bWI\tea\tB`\tiD\tc}\tTzBR\vQBNj\tCP\t[I\bTv\t`WuN\vpg\vpg\vWc\tiT\tbs\twL\tU_\tc\\\t|h\vKa\tNr\tfL\nq|\nzu\nz\\\tNr\bUg\t|bm`\bTv\nyd\nrp\bWf\tUXBV\nzk\nd}\twQ\t}fCe\ved\bTW\bSB\nxU\tcn\bTb\ne\ta\\\tSG\bU|\npV\nN\\Kn\vnU\tAt\tpD\v^R\vIrb[\tR{\tdE\vxD\vWK\vWA\bQL\bW@Su\bUd\nDM\tPcCADloQ\tHswiub\na\bQpOb\nLP\bTlY[\vK}\tAJ\bQn^\vsA\bSM\nqM\bWZ\n^W\vz{S|\tfD\bVK\bTv\bPvBB\tCPdF\tid\vxsmx\vws\tcC\ntC\tycM`\vW\nrh\bQp\vxD\\o\nsI_k\nzukF\tfDXsXO\tjp\bTvBS{B\tBr\nzQ\nbI\tc{BDBVnO\bTF\tcaJd\tfL\tPV\tI_\nlK`o\twX\npa\tgu\bP}{^\bWf\n{I\tBN\npaKl\vpg\tcn\tfL\vvhCq\bTl\vnU\bSqCm\twR\bUJ\npe\nyd\nYgCy\vKW\tfD\neaoQ\tj_\tBvnM\vID\bTa\nzApl\n]n\bTa\tR{\tfr\n_y\bUg{Xkk\vxD|Ixl\nfyCe\vwB\nLk\vd]\noi\n}h\tQ]\npe\bVwHkOQ\nzk\tAJ\npV\bPv\ny\\\tA{Oi\bSBXA\veE\tjp\nq}\tiDqN\v^R\tm\tiZ\tBr\bVg\noi\n\\X\tU_\nc|\vHV\bTf\tTn\\N\\N\nuBlv\nyu\tTd\bTf\bPL\v]W\tdG\nA`\nw^\ngI\npe\tdw\nz\\ia\bWZ\tcFJm\n{Z\bWO_kDfRR\td\\\bVV\vxsBNtilm\tTd\t]y\vHV\tSo\v|jXX\tA|\vZ^\vGu\bTWM`kF\vhZ\vVK\tdG\vBl\tay\nxUqEnO\bVw\nqICX\ne\tPl\bWO\vLm\tdLuHCm\tdTfn\vwBka\vnU\n@M\nyT\tHv\t\\}Kh\td~Yhk}\neR\td\\\bWI\t|b\tHK\tiD\bTWMY\npl\bQ_\twr\vAx\tHE\bTg\bSqvp\vb\\\bWO\nOl\nsI\nfy\vID\t\\c\n{Z\n^~\npe\nAO\tTT\vxvk_\bWO\v|j\vwB\tQy\ti@\tPl\tHa\tdZk}ra\tUT\vJc\ved\np@\tQN\nd|\tkj\tHkM`\noi\twr\td\\\nlq\no_\nlb\nL[\tacBBBHCm\npl\tIQ\bVK\vxs\n`e\viK\npaOi\tUS\bTp\tfD\nPGkkXA\nz\\\neg\vWh\twRqN\nqS\tcnlo\nxS\n^W\tBU\nt\tHE\tp\\\tfF\tfw\bVV\bW@\tak\vVKls\tVJ\bVV\veE\\o\nyX\nYmM`lL\nd|\nzk\tA{sE\twQXT\nt\tPl\t]y\vwT{pMD\vb\\\tQ]Kj\tJn\nAH\vRb\tBU\tHK\t\\c\nfIm\nqM\n@R\tSo\noiBT\tHv\n_yKh\tBZ\t]i\bUJ\tV{Sr\nbI\vGg\ta_\bTR\nfI\nfl\t[K\tIIS|\vuW\tiI\bWI\nqI\v|jBV\bVg\bWZkF\vx]\bTA\tab\tfr\ti@\tJd\tJd\vps\nAO\bTaxu\tiD\nzk\t|d\t|`\bW[\tlP\tdG\bVV\vw}\vqO\ti[\bQ\bTz\vVF\twNts\tdw\bTv\neS\ngi\tNryS\npe\bVV\bSq\n`m\tyj\tBZ\vWX\bSB\tc\\\nUR\t[J\tc_nM\bWQ\vAx\nMd\tBrui\vxY\bSM\vWc\v|j\vxs\t}Q\tBO\bPL\bWW\tfM\nAO\tPc\veUe^\bTg\nqI\tac\bPv\tcFoQ\tQ\vhZka\nz\\\tiK\tBU\n`k\tCPS|M`\n{I\tS{_O\tBZZiSk\tps\tp\\\nYu\n]s\nxC\bWt\nbD\tkV\vGuyS\nqA\t[r\neKM`\tdZlL\bUg\bTl\nbD\tUS\vb\\\tpV\nccS\\\tct\t`z\bPL\vWs\nA`\neg\bSquECR\vDg\t`W\vz{\vWcSkSk\tbW\bUg\tea\nxZ\tiI\tUX\tVJ\nqn\tS{\vRb\bTQ\nplGt\vuWuj\npF\nqI\tfL\t[I\tiaXO\nyu\vDg\ved\tq{VG\bQka\tVj\tkV\txB\nd|\np@\tQN\tPc\tps]j\tkV\toU\bTp\nzUnB\vB]\ta{\bV@\n]nm`\tcz\tR{m`\bQa\vwT\bSMMYqN\tdj~s\vQ}MY\vMB\tBv\twR\bRg\vQ}\tql\vKC\nrmxuCC\vwB\vvh\tBqXq\npV\ti_ObuE\nbd\nqo\v{i\nC~\tBL\veEuH\bVjEyGz\vzR\v{i\tcf\n{Z\n]nXA\vGu\vnU\thS\vGI\nCc\tHE\bTA\tHBBHCj\nCc\bTF\tHE\nXI\tA{\bQ\tc\\\vmO\vWX\nfH\np@MY\bTF\nlK\tBt\nzU\tTTKm\vwT\npV\ndt\vyI\tVx\tQ\tRg\tTd\nzU\bRS\nLM\twAnM\tTn\ndS\t]g\nLc\vwB\t}t\t[I\tCPkX\vFm\vhZm\ti[\np@\vQ}\vW\t|d\nMO\nMd\tf_\tfD\tcJ\tHz\vRb\tio\tPyY[\nxU\tct\v@@\tww\bPvBMFF\ntbv|\vKm\tBq\tBqKh`o\nZdXU\ti]\t|`\tStB\\\bQ\v_W\tTJ\nqI\t|a\tA{\vuPMD\tPl\nxR\tfL\vws\tc{\td\\\bV`\neg\tHKkc\nd|\bVV\ny\\kc\ti]\bVG\t`V\tss\tI_\tAE\tbs\tdu\nel\tpD\vW\nqslv\bSMZi\vVKia\vQB\tQ\n{Z\bPt\vKl\nlK\nhs\ndS\bVKmf\nd^\tkV\tcO\nc|\bVH\t\\]\bTv\bSq\tmI\vDg\tVJ\tcn\ny\\\bVg\bTv\nyX\bTF\t]]\bTp\noi\nhs\veU\nBf\tdjMr\n|p\t\\g\t]r\bVb{D\nd[XN\tfM\tO\\s_\tcf\tiZXN\vWc\tqv\n`m\tU^oD\nd|\vGg\tdE\vwflou}\nd|oQ\t`iOi\vxD\ndZ\nCxYw\nzk\ntb\ngw\tyj\tB`\nyX\vps\ntC\vpP\vqw\bPu\bPX\tDm\npwNj\tss\taG\vxs\bPt\noLGz\tOk\ti@\ti]eC\tIQ\tii\tdj\v@J\t|duh\bWZ\veU\vnU\bTa\tcCg]\nzkYh\bVK\nLU\np@\ntb\ntR\tCj\vNP\ti@\bP{\n\\}\n{c\nwX\tfL\bVG\tc{\t|`\tAJ\t|C\tfDln\t|d\tbs\nqI{B\vAx\np@\nzk\vRbOs\vWSe^\vD_\tBv\vWd\bVb\vxs\veE\bRw\n]n\n|p\vg|\tfwkc\bTIka\n\\TSp\tju\vps\npeu|\vGr\bVe\tCU]MXU\vxD\bTa\tIQ\vWq\tCU\tam\tdj\bSoSw\vnUCh\tQ]s_\bPt\tfS\bTa\t\\}\n@OYc\tUZ\bTx\npe\vnU\nzU\t|}\tiD\nz\\\bSM\vxDBR\nzQ\tQN]MYh\nLP\vFm\vLXvc\vqlka\tHK\bVb\ntC\nCy\bTv\nuVoQ\t`z\t[I\tB`\vRb\tyj\tsb\vWs\bTl\tkV\ved\nelL\vxN\tm\nJn\tjY\vxD\bVb\bSq\vyu\twL\vXL\bTA\tpg\tAt\tnDXX\twR\npl\nhwyS\nps\tcO\bW[\v|jXN\tsV\tp\\\tBe\nb~\nAJ\n]ek`qN\tdw\tWV\tHE\vEVJz\tid\tB`\tzhE]\tfD\bTgqN\bTa\tjaCv\bSM\nhc\bUet_\tieg]\twQ\nPn\bVB\tjw\bVg\vbE\tBZ\vRH\bP{\tjp\n\\}\ta_\tcC\t|a\vD]\tBZ\ti[\tfD\vxW\no_\td\\\n_D\ntb\t\\c\tAJ\nlKoQlo\vLx\vM@\bWZKn\vpg\nTi\nIv\n|r\v@}JzLmWhk}ln\vxD\n]sgc\vps\tBr\bTW\vBMtZ\nBYDW\tjf\vSWC}\nqo\tdE\tmv\tIQ\bPP\bUblvBC\nzQ\t[I\vgl\nig\bUsBT\vbC\bSq\tsU\tiW\nJn\tSY\tHK\trg\npV\vID\v|jKO\t`S\t|a`vbmglfmujbqnbgqjgavp`bqjmj`jlwjfnslslqrvf`vfmwbfpwbglsvfgfmivfdlp`lmwqbfpw/Mmmlnaqfwjfmfmsfqejonbmfqbbnjdlp`jvgbg`fmwqlbvmrvfsvfgfpgfmwqlsqjnfqsqf`jlpfd/Vmavfmlpuloufqsvmwlppfnbmbkba/Abbdlpwlmvfulpvmjglp`bqolpfrvjslmj/]lpnv`klpbodvmb`lqqfljnbdfmsbqwjqbqqjabnbq/Abklnaqffnsoflufqgbg`bnajlnv`kbpevfqlmsbpbglo/Amfbsbqf`fmvfubp`vqplpfpwbabrvjfqlojaqlp`vbmwlb``fplnjdvfoubqjlp`vbwqlwjfmfpdqvslppfq/Mmfvqlsbnfgjlpeqfmwfb`fq`bgfn/Mplefqwb`l`kfpnlgfoljwbojbofwqbpbod/Vm`lnsqb`vbofpf{jpwf`vfqslpjfmglsqfmpboofdbqujbifpgjmfqlnvq`jbslgq/Msvfpwlgjbqjlsvfaolrvjfqfnbmvfosqlsjl`qjpjp`jfqwlpfdvqlnvfqwfevfmwf`fqqbqdqbmgffef`wlsbqwfpnfgjgbsqlsjbleqf`fwjfqqbf.nbjoubqjbpelqnbpevwvqllaifwlpfdvjqqjfpdlmlqnbpnjpnlp/Vmj`l`bnjmlpjwjlpqby/_mgfajglsqvfabwlofglwfm/Abifp/Vpfpsfql`l`jmblqjdfmwjfmgb`jfmwl`/Mgjykbaobqpfq/Abobwjmbevfqybfpwjoldvfqqbfmwqbq/E{jwlo/_sfybdfmgbu/Agflfujwbqsbdjmbnfwqlpibujfqsbgqfpe/M`jo`bafyb/Mqfbppbojgbfmu/Alibs/_mbavplpajfmfpwf{wlpoofubqsvfgbmevfqwf`ln/Vm`obpfpkvnbmlwfmjglajoablvmjgbgfpw/Mpfgjwbq`qfbgl2%bns8Kjpwlqz#>#mft#@fmwqbovsgbwfgPsf`jboMfwtlqhqfrvjqf`lnnfmwtbqmjmd@loofdfwlloabqqfnbjmpaf`bvpffof`wfgGfvwp`kejmbm`ftlqhfqprvj`hozafwtffmf{b`wozpfwwjmdgjpfbpfPl`jfwztfbslmpf{kjajw%ow8"..@lmwqlo`obppfp`lufqfglvwojmfbwwb`hpgfuj`fp+tjmgltsvqslpfwjwof>!Nlajof#hjoojmdpkltjmdJwbojbmgqlssfgkfbujozfeef`wp.2$^*8\t`lmejqn@vqqfmwbgubm`fpkbqjmdlsfmjmdgqbtjmdajoojlmlqgfqfgDfqnbmzqfobwfg?,elqn=jm`ovgftkfwkfqgfejmfgP`jfm`f`bwboldBqwj`ofavwwlmpobqdfpwvmjelqnilvqmfzpjgfabq@kj`bdlklojgbzDfmfqbosbppbdf/%rvlw8bmjnbwfeffojmdbqqjufgsbppjmdmbwvqboqlvdkoz-\t\tWkf#avw#mlwgfmpjwzAqjwbjm@kjmfpfob`h#lewqjavwfJqfobmg!#gbwb.eb`wlqpqf`fjufwkbw#jpOjaqbqzkvpabmgjm#eb`wbeebjqp@kbqofpqbgj`boaqlvdkwejmgjmdobmgjmd9obmd>!qfwvqm#ofbgfqpsobmmfgsqfnjvnsb`hbdfBnfqj`bFgjwjlm^%rvlw8Nfppbdfmffg#wlubovf>!`lnsof{ollhjmdpwbwjlmafojfufpnboofq.nlajofqf`lqgptbmw#wlhjmg#leEjqfel{zlv#bqfpjnjobqpwvgjfgnb{jnvnkfbgjmdqbsjgoz`ojnbwfhjmdglnfnfqdfgbnlvmwpelvmgfgsjlmffqelqnvobgzmbpwzklt#wl#Pvsslqwqfufmvff`lmlnzQfpvowpaqlwkfqplogjfqobqdfoz`boojmd-%rvlw8B``lvmwFgtbqg#pfdnfmwQlafqw#feelqwpSb`jej`ofbqmfgvs#tjwkkfjdkw9tf#kbufBmdfofpmbwjlmp\\pfbq`kbssojfgb`rvjqfnbppjufdqbmwfg9#ebopfwqfbwfgajddfpwafmfejwgqjujmdPwvgjfpnjmjnvnsfqkbspnlqmjmdpfoojmdjp#vpfgqfufqpfubqjbmw#qlof>!njppjmdb`kjfufsqlnlwfpwvgfmwplnflmff{wqfnfqfpwlqfalwwln9fuloufgboo#wkfpjwfnbsfmdojpktbz#wl##Bvdvpwpznalop@lnsbmznbwwfqpnvpj`bobdbjmpwpfqujmd~*+*8\tsbznfmwwqlvaof`lm`fsw`lnsbqfsbqfmwpsobzfqpqfdjlmpnlmjwlq#$$Wkf#tjmmjmdf{solqfbgbswfgDboofqzsqlgv`fbajojwzfmkbm`f`bqffqp*-#Wkf#`loof`wPfbq`k#bm`jfmwf{jpwfgellwfq#kbmgofqsqjmwfg`lmplofFbpwfqmf{slqwptjmgltp@kbmmfojoofdbomfvwqbopvddfpw\\kfbgfqpjdmjmd-kwno!=pfwwofgtfpwfqm`bvpjmd.tfahjw`objnfgIvpwj`f`kbswfquj`wjnpWklnbp#nlyjoobsqlnjpfsbqwjfpfgjwjlmlvwpjgf9ebopf/kvmgqfgLoznsj`\\avwwlmbvwklqpqfb`kfg`kqlmj`gfnbmgppf`lmgpsqlwf`wbglswfgsqfsbqfmfjwkfqdqfbwozdqfbwfqlufqboojnsqluf`lnnbmgpsf`jbopfbq`k-tlqpkjsevmgjmdwklvdkwkjdkfpwjmpwfbgvwjojwzrvbqwfq@vowvqfwfpwjmd`ofbqozf{slpfgAqltpfqojafqbo~#`bw`kSqlif`wf{bnsofkjgf+*8EolqjgbbmptfqpbooltfgFnsfqlqgfefmpfpfqjlvpeqffglnPfufqbo.avwwlmEvqwkfqlvw#le#">#mvoowqbjmfgGfmnbqhuljg+3*,boo-ipsqfufmwQfrvfpwPwfskfm\t\tTkfm#lapfquf?,k1=\tNlgfqm#sqlujgf!#bow>!alqgfqp-\t\tElq#\t\tNbmz#bqwjpwpsltfqfgsfqelqnej`wjlmwzsf#lenfgj`bowj`hfwplsslpfg@lvm`jotjwmfppivpwj`fDflqdf#Afodjvn---?,b=wtjwwfqmlwbaoztbjwjmdtbqebqf#Lwkfq#qbmhjmdskqbpfpnfmwjlmpvqujufp`klobq?,s=\t#@lvmwqzjdmlqfgolpp#leivpw#bpDflqdjbpwqbmdf?kfbg=?pwlssfg2$^*8\tjpobmgpmlwbaofalqgfq9ojpw#le`bqqjfg233/333?,k0=\t#pfufqboaf`lnfppfof`w#tfggjmd33-kwnonlmbq`klee#wkfwfb`kfqkjdkoz#ajloldzojef#lelq#fufmqjpf#le%qbrvl8sovplmfkvmwjmd+wklvdkGlvdobpiljmjmd`jq`ofpElq#wkfBm`jfmwUjfwmbnufkj`ofpv`k#bp`qzpwboubovf#>Tjmgltpfmilzfgb#pnboobppvnfg?b#jg>!elqfjdm#Boo#qjklt#wkfGjpsobzqfwjqfgkltfufqkjggfm8abwwofppffhjmd`bajmfwtbp#mlwollh#bw`lmgv`wdfw#wkfIbmvbqzkbssfmpwvqmjmdb9klufqLmojmf#Eqfm`k#ob`hjmdwzsj`bof{wqb`wfmfnjfpfufm#jedfmfqbwgf`jgfgbqf#mlw,pfbq`kafojfep.jnbdf9ol`bwfgpwbwj`-oldjm!=`lmufqwujlofmwfmwfqfgejqpw!=`jq`vjwEjmobmg`kfnjpwpkf#tbp23s{8!=bp#pv`kgjujgfg?,psbm=tjoo#afojmf#leb#dqfbwnzpwfqz,jmgf{-eboojmdgvf#wl#qbjotbz`loofdfnlmpwfqgfp`fmwjw#tjwkmv`ofbqIftjpk#sqlwfpwAqjwjpkeoltfqpsqfgj`wqfelqnpavwwlm#tkl#tbpof`wvqfjmpwbmwpvj`jgfdfmfqj`sfqjlgpnbqhfwpPl`jbo#ejpkjmd`lnajmfdqbskj`tjmmfqp?aq#,=?az#wkf#MbwvqboSqjub`z`llhjfplvw`lnfqfploufPtfgjpkaqjfeozSfqpjbmpl#nv`k@fmwvqzgfsj`wp`lovnmpklvpjmdp`qjswpmf{w#wlafbqjmdnbssjmdqfujpfgiRvfqz+.tjgwk9wjwof!=wllowjsPf`wjlmgfpjdmpWvqhjpkzlvmdfq-nbw`k+~*+*8\t\tavqmjmdlsfqbwfgfdqffpplvq`f>Qj`kbqg`olpfozsobpwj`fmwqjfp?,wq=\t`lolq9 vo#jg>!slppfppqloojmdskzpj`pebjojmdf{f`vwf`lmwfpwojmh#wlGfebvow?aq#,=\t9#wqvf/`kbqwfqwlvqjpn`obppj`sql`ffgf{sobjm?,k2=\tlmojmf-<{no#ufkfosjmdgjbnlmgvpf#wkfbjqojmffmg#..=*-bwwq+qfbgfqpklpwjmd eeeeeeqfbojyfUjm`fmwpjdmbop#pq`>!,Sqlgv`wgfpsjwfgjufqpfwfoojmdSvaoj`#kfog#jmIlpfsk#wkfbwqfbeef`wp?pwzof=b#obqdfglfpm$wobwfq/#Fofnfmwebuj`lm`qfbwlqKvmdbqzBjqslqwpff#wkfpl#wkbwNj`kbfoPzpwfnpSqldqbnp/#bmg##tjgwk>f%rvlw8wqbgjmdofew!=\tsfqplmpDlogfm#Beebjqpdqbnnbqelqnjmdgfpwqlzjgfb#le`bpf#lelogfpw#wkjp#jp-pq`#>#`bqwllmqfdjpwq@lnnlmpNvpojnpTkbw#jpjm#nbmznbqhjmdqfufbopJmgffg/frvbooz,pklt\\blvwgllqfp`bsf+Bvpwqjbdfmfwj`pzpwfn/Jm#wkf#pjwwjmdKf#boplJpobmgpB`bgfnz\t\n\n?"..Gbmjfo#ajmgjmdaol`h!=jnslpfgvwjojyfBaqbkbn+f{`fswxtjgwk9svwwjmd*-kwno+#X^8\tGBWBX#)hjw`kfmnlvmwfgb`wvbo#gjbof`wnbjmoz#\\aobmh$jmpwboof{sfqwpje+wzsfJw#bopl%`lsz8#!=Wfqnpalqm#jmLswjlmpfbpwfqmwbohjmd`lm`fqmdbjmfg#lmdljmdivpwjez`qjwj`peb`wlqzjwp#ltmbppbvowjmujwfgobpwjmdkjp#ltmkqfe>!,!#qfo>!gfufols`lm`fqwgjbdqbngloobqp`ovpwfqsksbo`lklo*8~*+*8vpjmd#b=?psbm=ufppfopqfujuboBggqfppbnbwfvqbmgqljgboofdfgjoomfpptbohjmd`fmwfqprvbojeznbw`kfpvmjejfgf{wjm`wGfefmpfgjfg#jm\t\n?"..#`vpwlnpojmhjmdOjwwof#Allh#lefufmjmdnjm-iptfbqjmdBoo#Qjd8\t~*+*8qbjpjmd#Bopl/#`qv`jbobalvw!=gf`obqf..=\t?p`ejqfel{bp#nv`kbssojfpjmgf{/#p/#avw#wzsf#>#\t\t?"..wltbqgpQf`lqgpSqjubwfElqfjdmSqfnjfq`klj`fpUjqwvboqfwvqmp@lnnfmwSltfqfgjmojmf8slufqwz`kbnafqOjujmd#ulovnfpBmwklmzoldjm!#QfobwfgF`lmlnzqfb`kfp`vwwjmddqbujwzojef#jm@kbswfq.pkbgltMlwbaof?,wg=\t#qfwvqmpwbgjvntjgdfwpubqzjmdwqbufopkfog#aztkl#bqftlqh#jmeb`vowzbmdvobqtkl#kbgbjqslqwwltm#le\t\tPlnf#$`oj`h$`kbqdfphfztlqgjw#tjoo`jwz#le+wkjp*8Bmgqft#vmjrvf#`kf`hfglq#nlqf033s{8#qfwvqm8qpjlm>!sovdjmptjwkjm#kfqpfoePwbwjlmEfgfqboufmwvqfsvaojpkpfmw#wlwfmpjlmb`wqfpp`lnf#wlejmdfqpGvhf#lesflsof/f{soljwtkbw#jpkbqnlmzb#nbilq!9!kwwsjm#kjp#nfmv!=\tnlmwkozleej`fq`lvm`jodbjmjmdfufm#jmPvnnbqzgbwf#leolzbowzejwmfppbmg#tbpfnsfqlqpvsqfnfPf`lmg#kfbqjmdQvppjbmolmdfpwBoafqwbobwfqbopfw#le#pnboo!=-bssfmggl#tjwkefgfqboabmh#leafmfbwkGfpsjwf@bsjwbodqlvmgp*/#bmg#sfq`fmwjw#eqln`olpjmd`lmwbjmJmpwfbgejewffmbp#tfoo-zbkll-qfpslmgejdkwfqlap`vqfqfeof`wlqdbmj`>#Nbwk-fgjwjmdlmojmf#sbggjmdb#tkloflmfqqlqzfbq#lefmg#le#abqqjfqtkfm#jwkfbgfq#klnf#leqfpvnfgqfmbnfgpwqlmd=kfbwjmdqfwbjmp`olvgeqtbz#le#Nbq`k#2hmltjmdjm#sbqwAfwtffmofpplmp`olpfpwujqwvboojmhp!=`qlppfgFMG#..=ebnlvp#btbqgfgOj`fmpfKfbowk#ebjqoz#tfbowkznjmjnboBeqj`bm`lnsfwfobafo!=pjmdjmdebqnfqpAqbpjo*gjp`vppqfsob`fDqfdlqzelmw#`lsvqpvfgbssfbqpnbhf#vsqlvmgfgalwk#leaol`hfgpbt#wkfleej`fp`lolvqpje+gl`vtkfm#kffmelq`fsvpk+evBvdvpw#VWE.;!=Ebmwbpzjm#nlpwjmivqfgVpvboozebqnjmd`olpvqflaif`w#gfefm`fvpf#le#Nfgj`bo?algz=\tfujgfmwaf#vpfghfz@lgfpj{wffmJpobnj` 333333fmwjqf#tjgfoz#b`wjuf#+wzsflelmf#`bm`lolq#>psfbhfqf{wfmgpSkzpj`pwfqqbjm?walgz=evmfqboujftjmdnjggof#`qj`hfwsqlskfwpkjewfggl`wlqpQvppfoo#wbqdfw`lnsb`wbodfaqbpl`jbo.avoh#lenbm#bmg?,wg=\t#kf#ofew*-ubo+*ebopf*8oldj`boabmhjmdklnf#wlmbnjmd#Bqjylmb`qfgjwp*8\t~*8\telvmgfqjm#wvqm@loojmpafelqf#Avw#wkf`kbqdfgWjwof!=@bswbjmpsfoofgdlggfppWbd#..=Bggjmd9avw#tbpQf`fmw#sbwjfmwab`h#jm>ebopf%Ojm`lomtf#hmlt@lvmwfqIvgbjpnp`qjsw#bowfqfg$^*8\t##kbp#wkfvm`ofbqFufmw$/alwk#jmmlw#boo\t\t?"..#sob`jmdkbqg#wl#`fmwfqplqw#le`ojfmwppwqffwpAfqmbqgbppfqwpwfmg#wlebmwbpzgltm#jmkbqalvqEqffglniftfoqz,balvw--pfbq`kofdfmgpjp#nbgfnlgfqm#lmoz#lmlmoz#wljnbdf!#ojmfbq#sbjmwfqbmg#mlwqbqfoz#b`qlmzngfojufqpklqwfq33%bns8bp#nbmztjgwk>!,)#?"X@wjwof#>le#wkf#oltfpw#sj`hfg#fp`bsfgvpfp#lesflsofp#Svaoj`Nbwwkftwb`wj`pgbnbdfgtbz#elqobtp#lefbpz#wl#tjmgltpwqlmd##pjnsof~`bw`k+pfufmwkjmelal{tfmw#wlsbjmwfg`jwjyfmJ#glm$wqfwqfbw-#Plnf#tt-!*8\talnajmdnbjowl9nbgf#jm-#Nbmz#`bqqjfpx~8tjtlqh#lepzmlmzngfefbwpebulqfglswj`bosbdfWqbvmofpp#pfmgjmdofew!=?`lnP`lqBoo#wkfiRvfqz-wlvqjpw@obppj`ebopf!#Tjokfonpvavqapdfmvjmfajpklsp-psojw+dolabo#elooltpalgz#lemlnjmbo@lmwb`wpf`vobqofew#wl`kjfeoz.kjggfm.abmmfq?,oj=\t\t-#Tkfm#jm#alwkgjpnjppF{solqfbotbzp#ujb#wkfpsb/]lotfoebqfqvojmd#bqqbmdf`bswbjmkjp#plmqvof#lekf#wllhjwpfoe/>3%bns8+`boofgpbnsofpwl#nbhf`ln,sbdNbqwjm#Hfmmfgzb``fswpevoo#lekbmgofgAfpjgfp,,..=?,baof#wlwbqdfwpfppfm`fkjn#wl#jwp#az#`lnnlm-njmfqbowl#wbhftbzp#wlp-lqd,obgujpfgsfmbowzpjnsof9je#wkfzOfwwfqpb#pklqwKfqafqwpwqjhfp#dqlvsp-ofmdwkeojdkwplufqobspoltoz#ofppfq#pl`jbo#?,s=\t\n\njw#jmwlqbmhfg#qbwf#levo=\t##bwwfnswsbjq#lenbhf#jwHlmwbhwBmwlmjlkbujmd#qbwjmdp#b`wjufpwqfbnpwqbssfg!*-`pp+klpwjofofbg#wlojwwof#dqlvsp/Sj`wvqf..=\t\t#qltp>!#laif`wjmufqpf?ellwfq@vpwlnU=?_,p`qploujmd@kbnafqpobufqztlvmgfgtkfqfbp">#$vmgelq#boosbqwoz#.qjdkw9Bqbajbmab`hfg#`fmwvqzvmjw#lenlajof.Fvqlsf/jp#klnfqjph#legfpjqfg@ojmwlm`lpw#lebdf#le#af`lnf#mlmf#les%rvlw8Njggof#fbg$*X3@qjwj`ppwvgjlp=%`lsz8dqlvs!=bppfnaonbhjmd#sqfppfgtjgdfw-sp9!#<#qfavjowaz#plnfElqnfq#fgjwlqpgfobzfg@bmlmj`kbg#wkfsvpkjmd`obpp>!avw#bqfsbqwjboAbazolmalwwln#`bqqjfq@lnnbmgjwp#vpfBp#tjwk`lvqpfpb#wkjqggfmlwfpbopl#jmKlvpwlm13s{8!=b``vpfgglvaof#dlbo#leEbnlvp#*-ajmg+sqjfpwp#Lmojmfjm#Ivozpw#(#!d`lmpvowgf`jnbokfosevoqfujufgjp#ufqzq$($jswolpjmd#efnbofpjp#boplpwqjmdpgbzp#lebqqjuboevwvqf#?laif`welq`jmdPwqjmd+!#,=\t\n\nkfqf#jpfm`lgfg-##Wkf#aboollmglmf#az,`lnnlmad`lolqobt#le#Jmgjbmbbuljgfgavw#wkf1s{#0s{irvfqz-bewfq#bsloj`z-nfm#bmgellwfq.>#wqvf8elq#vpfp`qffm-Jmgjbm#jnbdf#>ebnjoz/kwws9,,#%maps8gqjufqpfwfqmbopbnf#bpmlwj`fgujftfqp~*+*8\t#jp#nlqfpfbplmpelqnfq#wkf#mftjp#ivpw`lmpfmw#Pfbq`ktbp#wkftkz#wkfpkjssfgaq=?aq=tjgwk9#kfjdkw>nbgf#le`vjpjmfjp#wkbwb#ufqz#Bgnjqbo#ej{fg8mlqnbo#NjppjlmSqfpp/#lmwbqjl`kbqpfwwqz#wl#jmubgfg>!wqvf!psb`jmdjp#nlpwb#nlqf#wlwboozeboo#le~*8\t##jnnfmpfwjnf#jmpfw#lvwpbwjpezwl#ejmggltm#wlolw#le#Sobzfqpjm#Ivmfrvbmwvnmlw#wkfwjnf#wlgjpwbmwEjmmjpkpq`#>#+pjmdof#kfos#leDfqnbm#obt#bmgobafofgelqfpwp`llhjmdpsb`f!=kfbgfq.tfoo#bpPwbmofzaqjgdfp,dolabo@qlbwjb#Balvw#X3^8\t##jw/#bmgdqlvsfgafjmd#b*xwkqltkf#nbgfojdkwfqfwkj`boEEEEEE!alwwln!ojhf#b#fnsolzpojuf#jmbp#pffmsqjmwfqnlpw#leva.ojmhqfif`wpbmg#vpfjnbdf!=pv``ffgeffgjmdMv`ofbqjmelqnbwl#kfosTlnfm$pMfjwkfqNf{j`bmsqlwfjm?wbaof#az#nbmzkfbowkzobtpvjwgfujpfg-svpk+xpfoofqppjnsoz#Wkqlvdk-`llhjf#Jnbdf+logfq!=vp-ip!=#Pjm`f#vmjufqpobqdfq#lsfm#wl"..#fmgojfp#jm$^*8\t##nbqhfwtkl#jp#+!GLN@lnbmbdfglmf#elqwzsfle#Hjmdglnsqlejwpsqlslpfwl#pklt`fmwfq8nbgf#jwgqfppfgtfqf#jmnj{wvqfsqf`jpfbqjpjmdpq`#>#$nbhf#b#pf`vqfgAbswjpwulwjmd#\t\n\nubq#Nbq`k#1dqft#vs@ojnbwf-qfnlufphjoofgtbz#wkf?,kfbg=eb`f#leb`wjmd#qjdkw!=wl#tlqhqfgv`fpkbp#kbgfqf`wfgpklt+*8b`wjlm>allh#lebm#bqfb>>#!kww?kfbgfq\t?kwno=`lmelqneb`jmd#`llhjf-qfoz#lmklpwfg#-`vpwlnkf#tfmwavw#elqpsqfbg#Ebnjoz#b#nfbmplvw#wkfelqvnp-ellwbdf!=Nlajo@ofnfmwp!#jg>!bp#kjdkjmwfmpf..=?"..efnbof#jp#pffmjnsojfgpfw#wkfb#pwbwfbmg#kjpebpwfpwafpjgfpavwwlm\\alvmgfg!=?jnd#Jmelal{fufmwp/b#zlvmdbmg#bqfMbwjuf#`kfbsfqWjnflvwbmg#kbpfmdjmfptlm#wkf+nlpwozqjdkw9#ejmg#b#.alwwlnSqjm`f#bqfb#lenlqf#lepfbq`k\\mbwvqf/ofdboozsfqjlg/obmg#lelq#tjwkjmgv`fgsqlujmdnjppjofol`boozBdbjmpwwkf#tbzh%rvlw8s{8!=\tsvpkfg#babmglmmvnfqbo@fqwbjmJm#wkjpnlqf#jmlq#plnfmbnf#jpbmg/#jm`qltmfgJPAM#3.`qfbwfpL`wlafqnbz#mlw`fmwfq#obwf#jmGfefm`ffmb`wfgtjpk#wlaqlbgoz`llojmdlmolbg>jw-#Wkfqf`lufqNfnafqpkfjdkw#bppvnfp?kwno=\tsflsof-jm#lmf#>tjmgltellwfq\\b#dllg#qfhobnblwkfqp/wl#wkjp\\`llhjfsbmfo!=Olmglm/gfejmfp`qvpkfgabswjpn`lbpwbopwbwvp#wjwof!#nluf#wlolpw#jmafwwfq#jnsojfpqjuboqzpfqufqp#PzpwfnSfqkbspfp#bmg#`lmwfmgeoltjmdobpwfg#qjpf#jmDfmfpjpujft#leqjpjmd#pffn#wlavw#jm#ab`hjmdkf#tjoodjufm#bdjujmd#`jwjfp-eolt#le#Obwfq#boo#avwKjdktbzlmoz#azpjdm#lekf#glfpgjeefqpabwwfqz%bns8obpjmdofpwkqfbwpjmwfdfqwbhf#lmqfevpfg`boofg#>VP%bnsPff#wkfmbwjufpaz#wkjppzpwfn-kfbg#le9klufq/ofpajbmpvqmbnfbmg#boo`lnnlm,kfbgfq\\\\sbqbnpKbqubqg,sj{fo-qfnlubopl#olmdqlof#leiljmwozphzp`qbVmj`lgfaq#,=\tBwobmwbmv`ofvp@lvmwz/svqfoz#`lvmw!=fbpjoz#avjog#blm`oj`hb#djufmsljmwfqk%rvlw8fufmwp#fopf#x\tgjwjlmpmlt#wkf/#tjwk#nbm#tkllqd,Tfalmf#bmg`buboqzKf#gjfgpfbwwof33/333#xtjmgltkbuf#wlje+tjmgbmg#jwpplofoz#n%rvlw8qfmftfgGfwqljwbnlmdpwfjwkfq#wkfn#jmPfmbwlqVp?,b=?Hjmd#leEqbm`jp.sqlgv`kf#vpfgbqw#bmgkjn#bmgvpfg#azp`lqjmdbw#klnfwl#kbufqfobwfpjajojwzeb`wjlmAveebolojmh!=?tkbw#kfeqff#wl@jwz#le`lnf#jmpf`wlqp`lvmwfglmf#gbzmfqulvpprvbqf#~8je+dljm#tkbwjnd!#bojp#lmozpfbq`k,wvfpgbzollpfozPlolnlmpf{vbo#.#?b#kqnfgjvn!GL#MLW#Eqbm`f/tjwk#b#tbq#bmgpf`lmg#wbhf#b#=\t\t\tnbqhfw-kjdktbzglmf#jm`wjujwz!obpw!=laojdfgqjpf#wl!vmgfejnbgf#wl#Fbqoz#sqbjpfgjm#jwp#elq#kjpbwkofwfIvsjwfqZbkll"#wfqnfg#pl#nbmzqfbooz#p-#Wkf#b#tlnbmgjqf`w#qjdkw!#aj`z`ofb`jmd>!gbz#bmgpwbwjmdQbwkfq/kjdkfq#Leej`f#bqf#mltwjnfp/#tkfm#b#sbz#elqlm#wkjp.ojmh!=8alqgfqbqlvmg#bmmvbo#wkf#Mftsvw#wkf-`ln!#wbhjm#wlb#aqjfe+jm#wkfdqlvsp-8#tjgwkfmyznfppjnsof#jm#obwfxqfwvqmwkfqbszb#sljmwabmmjmdjmhp!=\t+*8!#qfb#sob`f_v330@bbalvw#bwq=\t\n\n``lvmw#djufp#b?P@QJSWQbjotbzwkfnfp,wlloal{AzJg+!{kvnbmp/tbw`kfpjm#plnf#je#+tj`lnjmd#elqnbwp#Vmgfq#avw#kbpkbmgfg#nbgf#azwkbm#jmefbq#legfmlwfg,jeqbnfofew#jmulowbdfjm#fb`kb%rvlw8abpf#leJm#nbmzvmgfqdlqfdjnfpb`wjlm#?,s=\t?vpwlnUb8%dw8?,jnslqwplq#wkbwnlpwoz#%bns8qf#pjyf>!?,b=?,kb#`obppsbppjufKlpw#>#TkfwkfqefqwjofUbqjlvp>X^8+ev`bnfqbp,=?,wg=b`wp#bpJm#plnf=\t\t?"lqdbmjp#?aq#,=Afjijmd`bwbo/Lgfvwp`kfvqlsfvfvphbqbdbfjodfpufmphbfpsb/]bnfmpbifvpvbqjlwqbabiln/E{j`ls/Mdjmbpjfnsqfpjpwfnbl`wvaqfgvqbmwfb/]bgjqfnsqfpbnlnfmwlmvfpwqlsqjnfqbwqbu/Epdqb`jbpmvfpwqbsql`fplfpwbglp`bojgbgsfqplmbm/Vnfqlb`vfqgln/Vpj`bnjfnaqllefqwbpbodvmlpsb/Apfpfifnsolgfqf`klbgfn/Mpsqjubglbdqfdbqfmob`fpslpjaofklwfofppfujoobsqjnfql/Vowjnlfufmwlpbq`kjul`vowvqbnvifqfpfmwqbgbbmvm`jlfnabqdlnfq`bgldqbmgfpfpwvgjlnfilqfpefaqfqlgjpf/]lwvqjpnl`/_gjdlslqwbgbfpsb`jlebnjojbbmwlmjlsfqnjwfdvbqgbqbodvmbpsqf`jlpbodvjfmpfmwjglujpjwbpw/Awvol`lml`fqpfdvmgl`lmpfileqbm`jbnjmvwlppfdvmgbwfmfnlpfef`wlpn/Mobdbpfpj/_mqfujpwbdqbmbgb`lnsqbqjmdqfpldbq`/Abb``j/_mf`vbglqrvjfmfpjm`ovplgfafq/Mnbwfqjbklnaqfpnvfpwqbslgq/Abnb/]bmb/Vowjnbfpwbnlplej`jbowbnajfmmjmd/Vmpbovglpslgfnlpnfilqbqslpjwjlmavpjmfppklnfsbdfpf`vqjwzobmdvbdfpwbmgbqg`bnsbjdmefbwvqfp`bwfdlqzf{wfqmbo`kjogqfmqfpfqufgqfpfbq`kf{`kbmdfebulqjwfwfnsobwfnjojwbqzjmgvpwqzpfquj`fpnbwfqjbosqlgv`wpy.jmgf{9`lnnfmwpplewtbqf`lnsofwf`bofmgbqsobwelqnbqwj`ofpqfrvjqfgnlufnfmwrvfpwjlmavjogjmdslojwj`pslppjaofqfojdjlmskzpj`boeffgab`hqfdjpwfqsj`wvqfpgjpbaofgsqlwl`lobvgjfm`fpfwwjmdpb`wjujwzfofnfmwpofbqmjmdbmzwkjmdbapwqb`wsqldqfpplufqujftnbdbyjmff`lmlnj`wqbjmjmdsqfppvqfubqjlvp#?pwqlmd=sqlsfqwzpklssjmdwldfwkfqbgubm`fgafkbujlqgltmolbgefbwvqfgellwaboopfof`wfgObmdvbdfgjpwbm`fqfnfnafqwqb`hjmdsbpptlqgnlgjejfgpwvgfmwpgjqf`wozejdkwjmdmlqwkfqmgbwbabpfefpwjuboaqfbhjmdol`bwjlmjmwfqmfwgqlsgltmsqb`wj`ffujgfm`fevm`wjlmnbqqjbdfqfpslmpfsqlaofnpmfdbwjufsqldqbnpbmbozpjpqfofbpfgabmmfq!=svq`kbpfsloj`jfpqfdjlmbo`qfbwjufbqdvnfmwallhnbqhqfefqqfq`kfnj`bogjujpjlm`booab`hpfsbqbwfsqlif`wp`lmeoj`wkbqgtbqfjmwfqfpwgfojufqznlvmwbjmlawbjmfg>#ebopf8elq+ubq#b``fswfg`bsb`jwz`lnsvwfqjgfmwjwzbjq`qbewfnsolzfgsqlslpfgglnfpwj`jm`ovgfpsqlujgfgklpsjwboufqwj`bo`loobspfbssqlb`ksbqwmfqpoldl!=?bgbvdkwfqbvwklq!#`vowvqboebnjojfp,jnbdfp,bppfnaozsltfqevowfb`kjmdejmjpkfggjpwqj`w`qjwj`bo`dj.ajm,svqslpfpqfrvjqfpfof`wjlmaf`lnjmdsqlujgfpb`bgfnj`f{fq`jpfb`wvbooznfgj`jmf`lmpwbmwb``jgfmwNbdbyjmfgl`vnfmwpwbqwjmdalwwln!=lapfqufg9#%rvlw8f{wfmgfgsqfujlvpPlewtbqf`vpwlnfqgf`jpjlmpwqfmdwkgfwbjofgpojdkwozsobmmjmdwf{wbqfb`vqqfm`zfufqzlmfpwqbjdkwwqbmpefqslpjwjufsqlgv`fgkfqjwbdfpkjssjmdbaplovwfqf`fjufgqfofubmwavwwlm!#ujlofm`fbmztkfqfafmfejwpobvm`kfgqf`fmwozboojbm`felooltfgnvowjsofavoofwjmjm`ovgfgl``vqqfgjmwfqmbo\'+wkjp*-qfsvaoj`=?wq=?wg`lmdqfppqf`lqgfgvowjnbwfplovwjlm?vo#jg>!gjp`lufqKlnf?,b=tfapjwfpmfwtlqhpbowklvdkfmwjqfoznfnlqjbonfppbdfp`lmwjmvfb`wjuf!=plnftkbwuj`wlqjbTfpwfqm##wjwof>!Ol`bwjlm`lmwqb`wujpjwlqpGltmolbgtjwklvw#qjdkw!=\tnfbpvqfptjgwk#>#ubqjbaofjmuloufgujqdjmjbmlqnboozkbssfmfgb``lvmwppwbmgjmdmbwjlmboQfdjpwfqsqfsbqfg`lmwqlopb``vqbwfajqwkgbzpwqbwfdzleej`jbodqbskj`p`qjnjmboslppjaoz`lmpvnfqSfqplmbopsfbhjmdubojgbwfb`kjfufg-isd!#,=nb`kjmfp?,k1=\t##hfztlqgpeqjfmgozaqlwkfqp`lnajmfglqjdjmbo`lnslpfgf{sf`wfgbgfrvbwfsbhjpwbmeloolt!#ubovbaof?,obafo=qfobwjufaqjmdjmdjm`qfbpfdlufqmlqsovdjmp,Ojpw#le#Kfbgfq!=!#mbnf>!#+%rvlw8dqbgvbwf?,kfbg=\t`lnnfq`fnbobzpjbgjqf`wlqnbjmwbjm8kfjdkw9p`kfgvof`kbmdjmdab`h#wl#`bwkloj`sbwwfqmp`lolq9# dqfbwfpwpvssojfpqfojbaof?,vo=\t\n\n?pfof`w#`jwjyfmp`olwkjmdtbw`kjmd?oj#jg>!psf`jej``bqqzjmdpfmwfm`f?`fmwfq=`lmwqbpwwkjmhjmd`bw`k+f*plvwkfqmNj`kbfo#nfq`kbmw`bqlvpfosbggjmd9jmwfqjlq-psojw+!ojybwjlmL`wlafq#*xqfwvqmjnsqlufg..%dw8\t\t`lufqbdf`kbjqnbm-smd!#,=pvaif`wpQj`kbqg#tkbwfufqsqlabaozqf`lufqzabpfabooivgdnfmw`lmmf`w--`pp!#,=#tfapjwfqfslqwfggfebvow!,=?,b=\tfof`wqj`p`lwobmg`qfbwjlmrvbmwjwz-#JPAM#3gjg#mlw#jmpwbm`f.pfbq`k.!#obmd>!psfbhfqp@lnsvwfq`lmwbjmpbq`kjufpnjmjpwfqqfb`wjlmgjp`lvmwJwbojbml`qjwfqjbpwqlmdoz9#$kwws9$p`qjsw$`lufqjmdleefqjmdbssfbqfgAqjwjpk#jgfmwjezEb`fallhmvnfqlvpufkj`ofp`lm`fqmpBnfqj`bmkbmgojmdgju#jg>!Tjoojbn#sqlujgfq\\`lmwfmwb``vqb`zpf`wjlm#bmgfqplmeof{jaof@bwfdlqzobtqfm`f?p`qjsw=obzlvw>!bssqlufg#nb{jnvnkfbgfq!=?,wbaof=Pfquj`fpkbnjowlm`vqqfmw#`bmbgjbm`kbmmfop,wkfnfp,,bqwj`oflswjlmboslqwvdboubovf>!!jmwfqubotjqfofppfmwjwofgbdfm`jfpPfbq`k!#nfbpvqfgwklvpbmgpsfmgjmd%kfoojs8mft#Gbwf!#pjyf>!sbdfMbnfnjggof!#!#,=?,b=kjggfm!=pfrvfm`fsfqplmbolufqeoltlsjmjlmpjoojmljpojmhp!=\t\n?wjwof=ufqpjlmppbwvqgbzwfqnjmbojwfnsqlsfmdjmffqpf`wjlmpgfpjdmfqsqlslpbo>!ebopf!Fpsb/]loqfofbpfppvanjw!#fq%rvlw8bggjwjlmpznswlnplqjfmwfgqfplvq`fqjdkw!=?sofbpvqfpwbwjlmpkjpwlqz-ofbujmd##alqgfq>`lmwfmwp`fmwfq!=-\t\tPlnf#gjqf`wfgpvjwbaofavodbqjb-pklt+*8gfpjdmfgDfmfqbo#`lm`fswpF{bnsofptjoojbnpLqjdjmbo!=?psbm=pfbq`k!=lsfqbwlqqfrvfpwpb#%rvlw8booltjmdGl`vnfmwqfujpjlm-#\t\tWkf#zlvqpfoe@lmwb`w#nj`kjdbmFmdojpk#`lovnajbsqjlqjwzsqjmwjmdgqjmhjmdeb`jojwzqfwvqmfg@lmwfmw#leej`fqpQvppjbm#dfmfqbwf.;;6:.2!jmgj`bwfebnjojbq#rvbojwznbqdjm93#`lmwfmwujftslqw`lmwb`wp.wjwof!=slqwbaof-ofmdwk#fojdjaofjmuloufpbwobmwj`lmolbg>!gfebvow-pvssojfgsbznfmwpdolppbqz\t\tBewfq#dvjgbm`f?,wg=?wgfm`lgjmdnjggof!=`bnf#wl#gjpsobzpp`lwwjpkilmbwkbmnbilqjwztjgdfwp-`ojmj`bowkbjobmgwfb`kfqp?kfbg=\t\nbeef`wfgpvsslqwpsljmwfq8wlPwqjmd?,pnboo=lhobklnbtjoo#af#jmufpwlq3!#bow>!klojgbzpQfplvq`foj`fmpfg#+tkj`k#-#Bewfq#`lmpjgfqujpjwjmdf{solqfqsqjnbqz#pfbq`k!#bmgqljg!rvj`hoz#nffwjmdpfpwjnbwf8qfwvqm#8`lolq9 #kfjdkw>bssqlubo/#%rvlw8#`kf`hfg-njm-ip!nbdmfwj`=?,b=?,kelqf`bpw-#Tkjof#wkvqpgbzgufqwjpf%fb`vwf8kbp@obppfubovbwflqgfqjmdf{jpwjmdsbwjfmwp#Lmojmf#`lolqbglLswjlmp!`bnsafoo?"..#fmg?,psbm=??aq#,=\t\\slsvspp`jfm`fp/%rvlw8#rvbojwz#Tjmgltp#bppjdmfgkfjdkw9#?a#`obppof%rvlw8#ubovf>!#@lnsbmzf{bnsofp?jeqbnf#afojfufpsqfpfmwpnbqpkboosbqw#le#sqlsfqoz*-\t\tWkf#wb{lmlnznv`k#le#?,psbm=\t!#gbwb.pqwvdv/Fpp`qlooWl#sqlif`w?kfbg=\tbwwlqmfzfnskbpjppslmplqpebm`zal{tlqog$p#tjogojef`kf`hfg>pfppjlmpsqldqbnns{8elmw.#Sqlif`wilvqmbopafojfufgub`bwjlmwklnsplmojdkwjmdbmg#wkf#psf`jbo#alqgfq>3`kf`hjmd?,walgz=?avwwlm#@lnsofwf`ofbqej{\t?kfbg=\tbqwj`of#?pf`wjlmejmgjmdpqlof#jm#slsvobq##L`wlafqtfapjwf#f{slpvqfvpfg#wl##`kbmdfplsfqbwfg`oj`hjmdfmwfqjmd`lnnbmgpjmelqnfg#mvnafqp##?,gju=`qfbwjmdlmPvanjwnbqzobmg`loofdfpbmbozwj`ojpwjmdp`lmwb`w-olddfgJmbgujplqzpjaojmdp`lmwfmw!p%rvlw8*p-#Wkjp#sb`hbdfp`kf`hal{pvddfpwpsqfdmbmwwlnlqqltpsb`jmd>j`lm-smdibsbmfpf`lgfabpfavwwlm!=dbnaojmdpv`k#bp#/#tkjof#?,psbm=#njpplvqjpslqwjmdwls92s{#-?,psbm=wfmpjlmptjgwk>!1obyzolbgmlufnafqvpfg#jm#kfjdkw>!`qjsw!=\t%maps8?,?wq=?wg#kfjdkw91,sqlgv`w`lvmwqz#jm`ovgf#ellwfq!#%ow8"..#wjwof!=?,irvfqz-?,elqn=\t+\vBl\bQ*+\vUmGx*kqubwphjjwbojbmlqln/Nm(ow/Pqh/Kf4K4]4C5dwbnaj/Emmlwj`jbpnfmpbifpsfqplmbpgfqf`klpmb`jlmbopfquj`jl`lmwb`wlvpvbqjlpsqldqbnbdlajfqmlfnsqfpbpbmvm`jlpubofm`jb`lolnajbgfpsv/Epgfslqwfpsqlzf`wlsqlgv`wls/Vaoj`lmlplwqlpkjpwlqjbsqfpfmwfnjoolmfpnfgjbmwfsqfdvmwbbmwfqjlqqf`vqplpsqlaofnbpbmwjbdlmvfpwqlplsjmj/_mjnsqjnjqnjfmwqbpbn/Eqj`bufmgfglqpl`jfgbgqfpsf`wlqfbojybqqfdjpwqlsbobaqbpjmwfq/Epfmwlm`fpfpsf`jbonjfnaqlpqfbojgbg`/_qglabybqbdlybs/Mdjmbppl`jbofpaolrvfbqdfpwj/_mborvjofqpjpwfnbp`jfm`jbp`lnsofwlufqpj/_m`lnsofwbfpwvgjlps/Vaoj`blaifwjulboj`bmwfavp`bglq`bmwjgbgfmwqbgbpb``jlmfpbq`kjulppvsfqjlqnbzlq/Abbofnbmjbevm`j/_m/Vowjnlpkb`jfmglbrvfoolpfgj`j/_mefqmbmglbnajfmwfeb`fallhmvfpwqbp`ojfmwfpsql`fplpabpwbmwfsqfpfmwbqfslqwbq`lmdqfplsvaoj`bq`lnfq`jl`lmwqbwli/_ufmfpgjpwqjwlw/E`mj`b`lmivmwlfmfqd/Abwqbabibqbpwvqjbpqf`jfmwfvwjojybqalofw/Ampboubglq`lqqf`wbwqbabilpsqjnfqlpmfdl`jlpojafqwbggfwboofpsbmwboobsq/_{jnlbonfq/Abbmjnbofprvj/Emfp`lqby/_mpf``j/_mavp`bmglls`jlmfpf{wfqjlq`lm`fswlwlgbu/Abdbofq/Abfp`qjajqnfgj`jmboj`fm`jb`lmpvowbbpsf`wlp`q/Awj`bg/_obqfpivpwj`jbgfafq/Mmsfq/Alglmf`fpjwbnbmwfmfqsfrvf/]lqf`jajgbwqjavmbowfmfqjef`bm`j/_m`bmbqjbpgfp`bqdbgjufqplpnboolq`bqfrvjfqfw/E`mj`lgfafq/Abujujfmgbejmbmybpbgfobmwfevm`jlmb`lmpfilpgje/A`jo`jvgbgfpbmwjdvbpbubmybgbw/Eqnjmlvmjgbgfpp/Mm`kfy`bnsb/]bplewlmj`qfujpwbp`lmwjfmfpf`wlqfpnlnfmwlpeb`vowbg`q/Egjwlgjufqpbppvsvfpwleb`wlqfppfdvmglpsfrvf/]b<_!?,pfof`w=Bvpwqbojb!#`obpp>!pjwvbwjlmbvwklqjwzelooltjmdsqjnbqjozlsfqbwjlm`kboofmdfgfufolsfgbmlmznlvpevm`wjlm#evm`wjlmp`lnsbmjfppwqv`wvqfbdqffnfmw!#wjwof>!slwfmwjbofgv`bwjlmbqdvnfmwppf`lmgbqz`lszqjdkwobmdvbdfpf{`ovpjuf`lmgjwjlm?,elqn=\tpwbwfnfmwbwwfmwjlmAjldqbskz~#fopf#x\tplovwjlmptkfm#wkf#Bmbozwj`pwfnsobwfpgbmdfqlvppbwfoojwfgl`vnfmwpsvaojpkfqjnslqwbmwsqlwlwzsfjmeovfm`f%qbrvl8?,feef`wjufdfmfqboozwqbmpelqnafbvwjevowqbmpslqwlqdbmjyfgsvaojpkfgsqlnjmfmwvmwjo#wkfwkvnambjoMbwjlmbo#-el`vp+*8lufq#wkf#njdqbwjlmbmmlvm`fgellwfq!=\tf{`fswjlmofpp#wkbmf{sfmpjufelqnbwjlmeqbnftlqhwfqqjwlqzmgj`bwjlm`vqqfmwoz`obppMbnf`qjwj`jpnwqbgjwjlmfopftkfqfBof{bmgfqbssljmwfgnbwfqjbopaqlbg`bpwnfmwjlmfgbeejojbwf?,lswjlm=wqfbwnfmwgjeefqfmw,gfebvow-Sqfpjgfmwlm`oj`h>!ajldqbskzlwkfqtjpfsfqnbmfmwEqbm/KbjpKlooztllgf{sbmpjlmpwbmgbqgp?,pwzof=\tqfgv`wjlmGf`fnafq#sqfefqqfg@bnaqjgdflsslmfmwpAvpjmfpp#`lmevpjlm=\t?wjwof=sqfpfmwfgf{sobjmfgglfp#mlw#tlqogtjgfjmwfqeb`fslpjwjlmpmftpsbsfq?,wbaof=\tnlvmwbjmpojhf#wkf#fppfmwjboejmbm`jbopfof`wjlmb`wjlm>!,babmglmfgFgv`bwjlmsbqpfJmw+pwbajojwzvmbaof#wl?,wjwof=\tqfobwjlmpMlwf#wkbwfeej`jfmwsfqelqnfgwtl#zfbqpPjm`f#wkfwkfqfelqftqbssfq!=bowfqmbwfjm`qfbpfgAbwwof#lesfq`fjufgwqzjmd#wlmf`fppbqzslqwqbzfgfof`wjlmpFojybafwk?,jeqbnf=gjp`lufqzjmpvqbm`fp-ofmdwk8ofdfmgbqzDfldqbskz`bmgjgbwf`lqslqbwfplnfwjnfppfquj`fp-jmkfqjwfg?,pwqlmd=@lnnvmjwzqfojdjlvpol`bwjlmp@lnnjwwffavjogjmdpwkf#tlqogml#olmdfqafdjmmjmdqfefqfm`f`bmmlw#afeqfrvfm`zwzsj`boozjmwl#wkf#qfobwjuf8qf`lqgjmdsqfpjgfmwjmjwjboozwf`kmjrvfwkf#lwkfqjw#`bm#aff{jpwfm`fvmgfqojmfwkjp#wjnfwfofsklmfjwfnp`lsfsqb`wj`fpbgubmwbdf*8qfwvqm#Elq#lwkfqsqlujgjmdgfnl`qb`zalwk#wkf#f{wfmpjufpveefqjmdpvsslqwfg`lnsvwfqp#evm`wjlmsqb`wj`bopbjg#wkbwjw#nbz#afFmdojpk?,eqln#wkf#p`kfgvofggltmolbgp?,obafo=\tpvpsf`wfgnbqdjm9#3psjqjwvbo?,kfbg=\t\tnj`qlplewdqbgvboozgjp`vppfgkf#af`bnff{f`vwjufirvfqz-ipklvpfklog`lmejqnfgsvq`kbpfgojwfqboozgfpwqlzfgvs#wl#wkfubqjbwjlmqfnbjmjmdjw#jp#mlw`fmwvqjfpIbsbmfpf#bnlmd#wkf`lnsofwfgbodlqjwknjmwfqfpwpqfafoojlmvmgfejmfgfm`lvqbdfqfpjybaofjmuloujmdpfmpjwjufvmjufqpbosqlujpjlm+bowklvdkefbwvqjmd`lmgv`wfg*/#tkj`k#`lmwjmvfg.kfbgfq!=Efaqvbqz#mvnfqlvp#lufqeolt9`lnslmfmweqbdnfmwpf{`foofmw`lopsbm>!wf`kmj`bomfbq#wkf#Bgubm`fg#plvq`f#lef{sqfppfgKlmd#Hlmd#Eb`fallhnvowjsof#nf`kbmjpnfofubwjlmleefmpjuf?,elqn=\t\npslmplqfggl`vnfmw-lq#%rvlw8wkfqf#bqfwklpf#tklnlufnfmwpsql`fppfpgjeej`vowpvanjwwfgqf`lnnfmg`lmujm`fgsqlnlwjmd!#tjgwk>!-qfsob`f+`obppj`bo`lbojwjlmkjp#ejqpwgf`jpjlmpbppjpwbmwjmgj`bwfgfulovwjlm.tqbssfq!fmlvdk#wlbolmd#wkfgfojufqfg..=\t?"..Bnfqj`bm#sqlwf`wfgMlufnafq#?,pwzof=?evqmjwvqfJmwfqmfw##lmaovq>!pvpsfmgfgqf`jsjfmwabpfg#lm#Nlqflufq/balojpkfg`loof`wfgtfqf#nbgffnlwjlmbofnfqdfm`zmbqqbwjufbgul`bwfps{8alqgfq`lnnjwwfggjq>!owq!fnsolzffpqfpfbq`k-#pfof`wfgpv``fpplq`vpwlnfqpgjpsobzfgPfswfnafqbgg@obpp+Eb`fallh#pvddfpwfgbmg#obwfqlsfqbwjmdfobalqbwfPlnfwjnfpJmpwjwvwf`fqwbjmozjmpwboofgelooltfqpIfqvpbofnwkfz#kbuf`lnsvwjmddfmfqbwfgsqlujm`fpdvbqbmwffbqajwqbqzqf`ldmjyftbmwfg#wls{8tjgwk9wkflqz#leafkbujlvqTkjof#wkffpwjnbwfgafdbm#wl#jw#af`bnfnbdmjwvgfnvpw#kbufnlqf#wkbmGjqf`wlqzf{wfmpjlmpf`qfwbqzmbwvqboozl``vqqjmdubqjbaofpdjufm#wkfsobwelqn-?,obafo=?ebjofg#wl`lnslvmgphjmgp#le#pl`jfwjfpbolmdpjgf#..%dw8\t\tplvwktfpwwkf#qjdkwqbgjbwjlmnbz#kbuf#vmfp`bsf+pslhfm#jm!#kqfe>!,sqldqbnnflmoz#wkf#`lnf#eqlngjqf`wlqzavqjfg#jmb#pjnjobqwkfz#tfqf?,elmw=?,Mlqtfdjbmpsf`jejfgsqlgv`jmdsbppfmdfq+mft#Gbwfwfnslqbqzej`wjlmboBewfq#wkffrvbwjlmpgltmolbg-qfdvobqozgfufolsfqbaluf#wkfojmhfg#wlskfmlnfmbsfqjlg#lewllowjs!=pvapwbm`fbvwlnbwj`bpsf`w#leBnlmd#wkf`lmmf`wfgfpwjnbwfpBjq#Elq`fpzpwfn#lelaif`wjufjnnfgjbwfnbhjmd#jwsbjmwjmdp`lmrvfqfgbqf#pwjoosql`fgvqfdqltwk#lekfbgfg#azFvqlsfbm#gjujpjlmpnlof`vofpeqbm`kjpfjmwfmwjlmbwwqb`wfg`kjogkllgbopl#vpfggfgj`bwfgpjmdbslqfgfdqff#leebwkfq#le`lmeoj`wp?,b=?,s=\t`bnf#eqlntfqf#vpfgmlwf#wkbwqf`fjujmdF{f`vwjuffufm#nlqfb``fpp#wl`lnnbmgfqSlojwj`bonvpj`jbmpgfoj`jlvpsqjplmfqpbgufmw#leVWE.;!#,=?"X@GBWBX!=@lmwb`wPlvwkfqm#ad`lolq>!pfqjfp#le-#Jw#tbp#jm#Fvqlsfsfqnjwwfgubojgbwf-bssfbqjmdleej`jboppfqjlvpoz.obmdvbdfjmjwjbwfgf{wfmgjmdolmd.wfqnjmeobwjlmpv`k#wkbwdfw@llhjfnbqhfg#az?,avwwlm=jnsofnfmwavw#jw#jpjm`qfbpfpgltm#wkf#qfrvjqjmdgfsfmgfmw..=\t?"..#jmwfqujftTjwk#wkf#`lsjfp#le`lmpfmpvptbp#avjowUfmfyvfob+elqnfqozwkf#pwbwfsfqplmmfopwqbwfdj`ebulvq#lejmufmwjlmTjhjsfgjb`lmwjmfmwujqwvbooztkj`k#tbpsqjm`jsof@lnsofwf#jgfmwj`bopklt#wkbwsqjnjwjufbtbz#eqlnnlof`vobqsqf`jpfozgjpploufgVmgfq#wkfufqpjlm>!=%maps8?,Jw#jp#wkf#Wkjp#jp#tjoo#kbuflqdbmjpnpplnf#wjnfEqjfgqj`ktbp#ejqpwwkf#lmoz#eb`w#wkbwelqn#jg>!sqf`fgjmdWf`kmj`boskzpj`jpwl``vqp#jmmbujdbwlqpf`wjlm!=psbm#jg>!plvdkw#wlafolt#wkfpvqujujmd~?,pwzof=kjp#gfbwkbp#jm#wkf`bvpfg#azsbqwjboozf{jpwjmd#vpjmd#wkftbp#djufmb#ojpw#leofufop#lemlwjlm#leLeej`jbo#gjpnjppfgp`jfmwjpwqfpfnaofpgvsoj`bwff{solpjufqf`lufqfgboo#lwkfqdboofqjfpxsbggjmd9sflsof#leqfdjlm#lebggqfppfpbppl`jbwfjnd#bow>!jm#nlgfqmpklvog#afnfwklg#leqfslqwjmdwjnfpwbnsmffgfg#wlwkf#Dqfbwqfdbqgjmdpffnfg#wlujftfg#bpjnsb`w#lmjgfb#wkbwwkf#Tlqogkfjdkw#lef{sbmgjmdWkfpf#bqf`vqqfmw!=`bqfevooznbjmwbjmp`kbqdf#le@obppj`bobggqfppfgsqfgj`wfgltmfqpkjs?gju#jg>!qjdkw!=\tqfpjgfm`fofbuf#wkf`lmwfmw!=bqf#lewfm##~*+*8\tsqlabaoz#Sqlefpplq.avwwlm!#qfpslmgfgpbzp#wkbwkbg#wl#afsob`fg#jmKvmdbqjbmpwbwvp#lepfqufp#bpVmjufqpbof{f`vwjlmbddqfdbwfelq#tkj`kjmef`wjlmbdqffg#wlkltfufq/#slsvobq!=sob`fg#lm`lmpwqv`wfof`wlqbopznalo#lejm`ovgjmdqfwvqm#wlbq`kjwf`w@kqjpwjbmsqfujlvp#ojujmd#jmfbpjfq#wlsqlefpplq\t%ow8"..#feef`w#lebmbozwj`ptbp#wbhfmtkfqf#wkfwllh#lufqafojfe#jmBeqjhbbmpbp#ebq#bpsqfufmwfgtlqh#tjwkb#psf`jbo?ejfogpfw@kqjpwnbpQfwqjfufg\t\tJm#wkf#ab`h#jmwlmlqwkfbpwnbdbyjmfp=?pwqlmd=`lnnjwwffdlufqmjmddqlvsp#lepwlqfg#jmfpwbaojpkb#dfmfqbojwp#ejqpwwkfjq#ltmslsvobwfgbm#laif`w@bqjaafbmboolt#wkfgjpwqj`wptjp`lmpjmol`bwjlm-8#tjgwk9#jmkbajwfgPl`jbojpwIbmvbqz#2?,ellwfq=pjnjobqoz`klj`f#lewkf#pbnf#psf`jej`#avpjmfpp#Wkf#ejqpw-ofmdwk8#gfpjqf#wlgfbo#tjwkpjm`f#wkfvpfqBdfmw`lm`fjufgjmgf{-sksbp#%rvlw8fmdbdf#jmqf`fmwoz/eft#zfbqptfqf#bopl\t?kfbg=\t?fgjwfg#azbqf#hmltm`jwjfp#jmb``fpphfz`lmgfnmfgbopl#kbufpfquj`fp/ebnjoz#leP`kllo#le`lmufqwfgmbwvqf#le#obmdvbdfnjmjpwfqp?,laif`w=wkfqf#jp#b#slsvobqpfrvfm`fpbgul`bwfgWkfz#tfqfbmz#lwkfqol`bwjlm>fmwfq#wkfnv`k#nlqfqfeof`wfgtbp#mbnfglqjdjmbo#b#wzsj`botkfm#wkfzfmdjmffqp`lvog#mlwqfpjgfmwptfgmfpgbzwkf#wkjqg#sqlgv`wpIbmvbqz#1tkbw#wkfzb#`fqwbjmqfb`wjlmpsql`fpplqbewfq#kjpwkf#obpw#`lmwbjmfg!=?,gju=\t?,b=?,wg=gfsfmg#lmpfbq`k!=\tsjf`fp#le`lnsfwjmdQfefqfm`fwfmmfppfftkj`k#kbp#ufqpjlm>?,psbm=#??,kfbgfq=djufp#wkfkjpwlqjbmubovf>!!=sbggjmd93ujft#wkbwwldfwkfq/wkf#nlpw#tbp#elvmgpvapfw#lebwwb`h#lm`kjogqfm/sljmwp#lesfqplmbo#slpjwjlm9boofdfgoz@ofufobmgtbp#obwfqbmg#bewfqbqf#djufmtbp#pwjoop`qloojmdgfpjdm#lenbhfp#wkfnv`k#ofppBnfqj`bmp-\t\tBewfq#/#avw#wkfNvpfvn#leolvjpjbmb+eqln#wkfnjmmfplwbsbqwj`ofpb#sql`fppGlnjmj`bmulovnf#leqfwvqmjmdgfefmpjuf33s{qjdknbgf#eqlnnlvpflufq!#pwzof>!pwbwfp#le+tkj`k#jp`lmwjmvfpEqbm`jp`lavjogjmd#tjwklvw#btjwk#plnftkl#tlvogb#elqn#leb#sbqw#leafelqf#jwhmltm#bp##Pfquj`fpol`bwjlm#bmg#lewfmnfbpvqjmdbmg#jw#jpsbsfqab`hubovfp#le\t?wjwof=>#tjmglt-gfwfqnjmffq%rvlw8#sobzfg#azbmg#fbqoz?,`fmwfq=eqln#wkjpwkf#wkqffsltfq#bmgle#%rvlw8jmmfqKWNO?b#kqfe>!z9jmojmf8@kvq`k#lewkf#fufmwufqz#kjdkleej`jbo#.kfjdkw9#`lmwfmw>!,`dj.ajm,wl#`qfbwfbeqjhbbmpfpsfqbmwleqbm/Kbjpobwujf)Mvojfwvuj)_(`f)Mwjmb(af)Mwjmb\fUh\fT{\fTN\n{I\np@Fr\vBl\bQ\tA{\vUmGx\tA{ypYA\0zX\bTV\bWl\bUdBM\vB{\npV\v@xB\\\np@DbGz\tal\npa\tfM\tuD\bV~mx\vQ}\ndS\tp\\\bVK\bS]\bU|oD\tkV\ved\vHR\nb~M`\nJpoD|Q\nLPSw\bTl\nAI\nxC\bWt\tBqF`Cm\vLm\tKx\t}t\bPv\ny\\\naB\tV\nZdXUli\tfr\ti@\tBHBDBV\t`V\n[]\tp_\tTn\n~A\nxR\tuD\t`{\bV@\tTn\tHK\tAJ\vxsZf\nqIZf\vBM\v|j\t}t\bSM\nmC\vQ}pfquj`jlpbqw/A`volbqdfmwjmbabq`folmb`vborvjfqsvaoj`bglsqlgv`wlpslo/Awj`bqfpsvfpwbtjhjsfgjbpjdvjfmwfa/Vprvfgb`lnvmjgbgpfdvqjgbgsqjm`jsbosqfdvmwbp`lmwfmjglqfpslmgfqufmfyvfobsqlaofnbpgj`jfnaqfqfob`j/_mmlujfnaqfpjnjobqfpsqlzf`wlpsqldqbnbpjmpwjwvwlb`wjujgbgfm`vfmwqbf`lmln/Abjn/Mdfmfp`lmwb`wbqgfp`bqdbqmf`fpbqjlbwfm`j/_mwfo/Eelml`lnjpj/_m`bm`jlmfp`bsb`jgbgfm`lmwqbqbm/Mojpjpebulqjwlpw/Eqnjmlpsqlujm`jbfwjrvfwbpfofnfmwlpevm`jlmfpqfpvowbgl`bq/M`wfqsqlsjfgbgsqjm`jsjlmf`fpjgbgnvmj`jsbo`qfb`j/_mgfp`bqdbpsqfpfm`jb`lnfq`jbolsjmjlmfpfifq`j`jlfgjwlqjbopbobnbm`bdlmy/Mofygl`vnfmwlsfo/A`vobqf`jfmwfpdfmfqbofpwbqqbdlmbsq/M`wj`bmlufgbgfpsqlsvfpwbsb`jfmwfpw/E`mj`bplaifwjulp`lmwb`wlp\fHB\fIk\fHn\fH^\fHS\fHc\fHU\fId\fHn\fH{\fHC\fHR\fHT\fHR\fHI\fHc\fHY\fHn\fH\\\fHU\fIk\fHy\fIg\fHd\fHy\fIm\fHw\fH\\\fHU\fHR\fH@\fHR\fHJ\fHy\fHU\fHR\fHT\fHA\fIl\fHU\fIm\fHc\fH\\\fHU\fIl\fHB\fId\fHn\fHJ\fHS\fHD\fH@\fHR\fHHgjsolgl`p\fHT\fHB\fHC\fH\\\fIn\fHF\fHD\fHR\fHB\fHF\fHH\fHR\fHG\fHS\fH\\\fHx\fHT\fHH\fHH\fH\\\fHU\fH^\fIg\fH{\fHU\fIm\fHj\fH@\fHR\fH\\\fHJ\fIk\fHZ\fHU\fIm\fHd\fHz\fIk\fH^\fHC\fHJ\fHS\fHy\fHR\fHB\fHY\fIk\fH@\fHH\fIl\fHD\fH@\fIl\fHv\fHB\fI`\fHH\fHT\fHR\fH^\fH^\fIk\fHz\fHp\fIe\fH@\fHB\fHJ\fHJ\fHH\fHI\fHR\fHD\fHU\fIl\fHZ\fHU\fH\\\fHi\fH^\fH{\fHy\fHA\fIl\fHD\fH{\fH\\\fHF\fHR\fHT\fH\\\fHR\fHH\fHy\fHS\fHc\fHe\fHT\fIk\fH{\fHC\fIl\fHU\fIn\fHm\fHj\fH{\fIk\fHs\fIl\fHB\fHz\fIg\fHp\fHy\fHR\fH\\\fHi\fHA\fIl\fH{\fHC\fIk\fHH\fIm\fHB\fHY\fIg\fHs\fHJ\fIk\fHn\fHi\fH{\fH\\\fH|\fHT\fIk\fHB\fIk\fH^\fH^\fH{\fHR\fHU\fHR\fH^\fHf\fHF\fH\\\fHv\fHR\fH\\\fH|\fHT\fHR\fHJ\fIk\fH\\\fHp\fHS\fHT\fHJ\fHS\fH^\fH@\fHn\fHJ\fH@\fHD\fHR\fHU\fIn\fHn\fH^\fHR\fHz\fHp\fIl\fHH\fH@\fHs\fHD\fHB\fHS\fH^\fHk\fHT\fIk\fHj\fHD\fIk\fHD\fHC\fHR\fHy\fIm\fH^\fH^\fIe\fH{\fHA\fHR\fH{\fH\\\fIk\fH^\fHp\fH{\fHU\fH\\\fHR\fHB\fH^\fH{\fIk\fHF\fIk\fHp\fHU\fHR\fHI\fHk\fHT\fIl\fHT\fHU\fIl\fHy\fH^\fHR\fHL\fIl\fHy\fHU\fHR\fHm\fHJ\fIn\fH\\\fHH\fHU\fHH\fHT\fHR\fHH\fHC\fHR\fHJ\fHj\fHC\fHR\fHF\fHR\fHy\fHy\fI`\fHD\fHZ\fHR\fHB\fHJ\fIk\fHz\fHC\fHU\fIl\fH\\\fHR\fHC\fHz\fIm\fHJ\fH^\fH{\fIl`bwfdlqjfpf{sfqjfm`f?,wjwof=\t@lszqjdkw#ibubp`qjsw`lmgjwjlmpfufqzwkjmd?s#`obpp>!wf`kmloldzab`hdqlvmg?b#`obpp>!nbmbdfnfmw%`lsz8#132ibubP`qjsw`kbqb`wfqpaqfbg`qvnawkfnpfoufpklqjylmwbodlufqmnfmw@bojelqmjbb`wjujwjfpgjp`lufqfgMbujdbwjlmwqbmpjwjlm`lmmf`wjlmmbujdbwjlmbssfbqbm`f?,wjwof=?n`kf`hal{!#wf`kmjrvfpsqlwf`wjlmbssbqfmwozbp#tfoo#bpvmw$/#$VB.qfplovwjlmlsfqbwjlmpwfofujpjlmwqbmpobwfgTbpkjmdwlmmbujdbwlq-#>#tjmglt-jnsqfppjlm%ow8aq%dw8ojwfqbwvqfslsvobwjlmad`lolq>! fpsf`jbooz#`lmwfmw>!sqlgv`wjlmmftpofwwfqsqlsfqwjfpgfejmjwjlmofbgfqpkjsWf`kmloldzSbqojbnfmw`lnsbqjplmvo#`obpp>!-jmgf{Le+!`lm`ovpjlmgjp`vppjlm`lnslmfmwpajloldj`boQfulovwjlm\\`lmwbjmfqvmgfqpwllgmlp`qjsw=?sfqnjppjlmfb`k#lwkfqbwnlpskfqf#lmel`vp>!?elqn#jg>!sql`fppjmdwkjp-ubovfdfmfqbwjlm@lmefqfm`fpvapfrvfmwtfoo.hmltmubqjbwjlmpqfsvwbwjlmskfmlnfmlmgjp`jsojmfoldl-smd!#+gl`vnfmw/alvmgbqjfpf{sqfppjlmpfwwofnfmwAb`hdqlvmglvw#le#wkffmwfqsqjpf+!kwwsp9!#vmfp`bsf+!sbpptlqg!#gfnl`qbwj`?b#kqfe>!,tqbssfq!=\tnfnafqpkjsojmdvjpwj`s{8sbggjmdskjolplskzbppjpwbm`fvmjufqpjwzeb`jojwjfpqf`ldmjyfgsqfefqfm`fje#+wzsflenbjmwbjmfgul`bavobqzkzslwkfpjp-pvanjw+*8%bns8maps8bmmlwbwjlmafkjmg#wkfElvmgbwjlmsvaojpkfq!bppvnswjlmjmwqlgv`fg`lqqvswjlmp`jfmwjpwpf{soj`jwozjmpwfbg#legjnfmpjlmp#lm@oj`h>!`lmpjgfqfggfsbqwnfmwl``vsbwjlmpllm#bewfqjmufpwnfmwsqlmlvm`fgjgfmwjejfgf{sfqjnfmwNbmbdfnfmwdfldqbskj`!#kfjdkw>!ojmh#qfo>!-qfsob`f+,gfsqfppjlm`lmefqfm`fsvmjpknfmwfojnjmbwfgqfpjpwbm`fbgbswbwjlmlsslpjwjlmtfoo#hmltmpvssofnfmwgfwfqnjmfgk2#`obpp>!3s{8nbqdjmnf`kbmj`bopwbwjpwj`p`fofaqbwfgDlufqmnfmw\t\tGvqjmd#wgfufolsfqpbqwjej`jbofrvjubofmwlqjdjmbwfg@lnnjppjlmbwwb`knfmw?psbm#jg>!wkfqf#tfqfMfgfqobmgpafzlmg#wkfqfdjpwfqfgilvqmbojpweqfrvfmwozboo#le#wkfobmd>!fm!#?,pwzof=\tbaplovwf8#pvsslqwjmdf{wqfnfoz#nbjmpwqfbn?,pwqlmd=#slsvobqjwzfnsolznfmw?,wbaof=\t#`lopsbm>!?,elqn=\t##`lmufqpjlmbalvw#wkf#?,s=?,gju=jmwfdqbwfg!#obmd>!fmSlqwvdvfpfpvapwjwvwfjmgjujgvbojnslppjaofnvowjnfgjbbonlpw#boos{#plojg# bsbqw#eqlnpvaif`w#wljm#Fmdojpk`qjwj`jyfgf{`fsw#elqdvjgfojmfplqjdjmboozqfnbqhbaofwkf#pf`lmgk1#`obpp>!?b#wjwof>!+jm`ovgjmdsbqbnfwfqpsqlkjajwfg>#!kwws9,,gj`wjlmbqzsfq`fswjlmqfulovwjlmelvmgbwjlms{8kfjdkw9pv``fppevopvsslqwfqpnjoofmmjvnkjp#ebwkfqwkf#%rvlw8ml.qfsfbw8`lnnfq`jbojmgvpwqjbofm`lvqbdfgbnlvmw#le#vmleej`jbofeej`jfm`zQfefqfm`fp`llqgjmbwfgjp`objnfqf{sfgjwjlmgfufolsjmd`bo`vobwfgpjnsojejfgofdjwjnbwfpvapwqjmd+3!#`obpp>!`lnsofwfozjoovpwqbwfejuf#zfbqpjmpwqvnfmwSvaojpkjmd2!#`obpp>!spz`kloldz`lmejgfm`fmvnafq#le#bapfm`f#leel`vpfg#lmiljmfg#wkfpwqv`wvqfpsqfujlvpoz=?,jeqbnf=lm`f#bdbjmavw#qbwkfqjnnjdqbmwple#`lvqpf/b#dqlvs#leOjwfqbwvqfVmojhf#wkf?,b=%maps8\tevm`wjlm#jw#tbp#wkf@lmufmwjlmbvwlnlajofSqlwfpwbmwbddqfppjufbewfq#wkf#Pjnjobqoz/!#,=?,gju=`loof`wjlm\tevm`wjlmujpjajojwzwkf#vpf#leulovmwffqpbwwqb`wjlmvmgfq#wkf#wkqfbwfmfg)?"X@GBWBXjnslqwbm`fjm#dfmfqbowkf#obwwfq?,elqn=\t?,-jmgf{Le+$j#>#38#j#?gjeefqfm`fgfulwfg#wlwqbgjwjlmppfbq`k#elqvowjnbwfozwlvqmbnfmwbwwqjavwfppl.`boofg#~\t?,pwzof=fubovbwjlmfnskbpjyfgb``fppjaof?,pf`wjlm=pv``fppjlmbolmd#tjwkNfbmtkjof/jmgvpwqjfp?,b=?aq#,=kbp#af`lnfbpsf`wp#leWfofujpjlmpveej`jfmwabphfwabooalwk#pjgfp`lmwjmvjmdbm#bqwj`of?jnd#bow>!bgufmwvqfpkjp#nlwkfqnbm`kfpwfqsqjm`jsofpsbqwj`vobq`lnnfmwbqzfeef`wp#legf`jgfg#wl!=?pwqlmd=svaojpkfqpIlvqmbo#legjeej`vowzeb`jojwbwfb``fswbaofpwzof-`pp!\nevm`wjlm#jmmlubwjlm=@lszqjdkwpjwvbwjlmptlvog#kbufavpjmfppfpGj`wjlmbqzpwbwfnfmwplewfm#vpfgsfqpjpwfmwjm#Ibmvbqz`lnsqjpjmd?,wjwof=\t\ngjsolnbwj``lmwbjmjmdsfqelqnjmdf{wfmpjlmpnbz#mlw#af`lm`fsw#le#lm`oj`h>!Jw#jp#boplejmbm`jbo#nbhjmd#wkfOv{fnalvqdbggjwjlmbobqf#`boofgfmdbdfg#jm!p`qjsw!*8avw#jw#tbpfof`wqlmj`lmpvanjw>!\t?"..#Fmg#fof`wqj`boleej`jboozpvddfpwjlmwls#le#wkfvmojhf#wkfBvpwqbojbmLqjdjmboozqfefqfm`fp\t?,kfbg=\tqf`ldmjpfgjmjwjbojyfojnjwfg#wlBof{bmgqjbqfwjqfnfmwBgufmwvqfpelvq#zfbqp\t\t%ow8"..#jm`qfbpjmdgf`lqbwjlmk0#`obpp>!lqjdjmp#lelaojdbwjlmqfdvobwjlm`obppjejfg+evm`wjlm+bgubmwbdfpafjmd#wkf#kjpwlqjbmp?abpf#kqfeqfsfbwfgoztjoojmd#wl`lnsbqbaofgfpjdmbwfgmlnjmbwjlmevm`wjlmbojmpjgf#wkfqfufobwjlmfmg#le#wkfp#elq#wkf#bvwklqjyfgqfevpfg#wlwbhf#sob`fbvwlmlnlvp`lnsqlnjpfslojwj`bo#qfpwbvqbmwwtl#le#wkfEfaqvbqz#1rvbojwz#leptelaif`w-vmgfqpwbmgmfbqoz#bootqjwwfm#azjmwfqujftp!#tjgwk>!2tjwkgqbtboeolbw9ofewjp#vpvbooz`bmgjgbwfpmftpsbsfqpnzpwfqjlvpGfsbqwnfmwafpw#hmltmsbqojbnfmwpvssqfppfg`lmufmjfmwqfnfnafqfggjeefqfmw#pzpwfnbwj`kbp#ofg#wlsqlsbdbmgb`lmwqloofgjmeovfm`fp`fqfnlmjbosql`objnfgSqlwf`wjlmoj#`obpp>!P`jfmwjej``obpp>!ml.wqbgfnbqhpnlqf#wkbm#tjgfpsqfbgOjafqbwjlmwllh#sob`fgbz#le#wkfbp#olmd#bpjnsqjplmfgBggjwjlmbo\t?kfbg=\t?nObalqbwlqzMlufnafq#1f{`fswjlmpJmgvpwqjboubqjfwz#leeolbw9#ofeGvqjmd#wkfbppfppnfmwkbuf#affm#gfbop#tjwkPwbwjpwj`pl``vqqfm`f,vo=?,gju=`ofbqej{!=wkf#svaoj`nbmz#zfbqptkj`k#tfqflufq#wjnf/pzmlmznlvp`lmwfmw!=\tsqfpvnbaozkjp#ebnjozvpfqBdfmw-vmf{sf`wfgjm`ovgjmd#`kboofmdfgb#njmlqjwzvmgfejmfg!afolmdp#wlwbhfm#eqlnjm#L`wlafqslpjwjlm9#pbjg#wl#afqfojdjlvp#Efgfqbwjlm#qltpsbm>!lmoz#b#eftnfbmw#wkbwofg#wl#wkf..=\t?gju#?ejfogpfw=Bq`kajpkls#`obpp>!mlafjmd#vpfgbssqlb`kfpsqjujofdfpmlp`qjsw=\tqfpvowp#jmnbz#af#wkfFbpwfq#fddnf`kbmjpnpqfbplmbaofSlsvobwjlm@loof`wjlmpfof`wfg!=mlp`qjsw=,jmgf{-sksbqqjubo#le.ippgh$**8nbmbdfg#wljm`lnsofwf`bpvbowjfp`lnsofwjlm@kqjpwjbmpPfswfnafq#bqjwknfwj`sql`fgvqfpnjdkw#kbufSqlgv`wjlmjw#bssfbqpSkjolplskzeqjfmgpkjsofbgjmd#wldjujmd#wkfwltbqg#wkfdvbqbmwffggl`vnfmwfg`lolq9 333ujgfl#dbnf`lnnjppjlmqfeof`wjmd`kbmdf#wkfbppl`jbwfgpbmp.pfqjelmhfzsqfpp8#sbggjmd9Kf#tbp#wkfvmgfqozjmdwzsj`booz#/#bmg#wkf#pq`Fofnfmwpv``fppjufpjm`f#wkf#pklvog#af#mfwtlqhjmdb``lvmwjmdvpf#le#wkfoltfq#wkbmpkltp#wkbw?,psbm=\t\n\n`lnsobjmwp`lmwjmvlvprvbmwjwjfpbpwqlmlnfqkf#gjg#mlwgvf#wl#jwpbssojfg#wlbm#bufqbdffeelqwp#wlwkf#evwvqfbwwfnsw#wlWkfqfelqf/`bsbajojwzQfsvaoj`bmtbp#elqnfgFof`wqlmj`hjolnfwfqp`kboofmdfpsvaojpkjmdwkf#elqnfqjmgjdfmlvpgjqf`wjlmppvapjgjbqz`lmpsjqb`zgfwbjop#lebmg#jm#wkfbeelqgbaofpvapwbm`fpqfbplm#elq`lmufmwjlmjwfnwzsf>!baplovwfozpvsslpfgozqfnbjmfg#bbwwqb`wjufwqbufoojmdpfsbqbwfozel`vpfp#lmfofnfmwbqzbssoj`baofelvmg#wkbwpwzofpkffwnbmvp`qjswpwbmgp#elq#ml.qfsfbw+plnfwjnfp@lnnfq`jbojm#Bnfqj`bvmgfqwbhfmrvbqwfq#lebm#f{bnsofsfqplmboozjmgf{-sks!owqOjfvwfmbmw\t?gju#jg>!wkfz#tlvogbajojwz#lenbgf#vs#lemlwfg#wkbw`ofbq#wkbwbqdvf#wkbwwl#bmlwkfq`kjogqfm$psvqslpf#leelqnvobwfgabpfg#vslmwkf#qfdjlmpvaif`w#lesbppfmdfqpslppfppjlm-\t\tJm#wkf#Afelqf#wkfbewfqtbqgp`vqqfmwoz#b`qlpp#wkfp`jfmwjej``lnnvmjwz-`bsjwbojpnjm#Dfqnbmzqjdkw.tjmdwkf#pzpwfnPl`jfwz#leslojwj`jbmgjqf`wjlm9tfmw#lm#wlqfnlubo#le#Mft#Zlqh#bsbqwnfmwpjmgj`bwjlmgvqjmd#wkfvmofpp#wkfkjpwlqj`bokbg#affm#bgfejmjwjufjmdqfgjfmwbwwfmgbm`f@fmwfq#elqsqlnjmfm`fqfbgzPwbwfpwqbwfdjfpavw#jm#wkfbp#sbqw#le`lmpwjwvwf`objn#wkbwobalqbwlqz`lnsbwjaofebjovqf#le/#pv`k#bp#afdbm#tjwkvpjmd#wkf#wl#sqlujgfefbwvqf#leeqln#tkj`k,!#`obpp>!dfloldj`bopfufqbo#legfojafqbwfjnslqwbmw#klogp#wkbwjmd%rvlw8#ubojdm>wlswkf#Dfqnbmlvwpjgf#lemfdlwjbwfgkjp#`bqffqpfsbqbwjlmjg>!pfbq`ktbp#`boofgwkf#elvqwkqf`qfbwjlmlwkfq#wkbmsqfufmwjlmtkjof#wkf#fgv`bwjlm/`lmmf`wjmdb``vqbwfoztfqf#avjowtbp#hjoofgbdqffnfmwpnv`k#nlqf#Gvf#wl#wkftjgwk9#233plnf#lwkfqHjmdgln#lewkf#fmwjqfebnlvp#elqwl#`lmmf`wlaif`wjufpwkf#Eqfm`ksflsof#bmgefbwvqfg!=jp#pbjg#wlpwqv`wvqboqfefqfmgvnnlpw#lewfmb#pfsbqbwf.=\t?gju#jg#Leej`jbo#tlqogtjgf-bqjb.obafowkf#sobmfwbmg#jw#tbpg!#ubovf>!ollhjmd#bwafmfej`jbobqf#jm#wkfnlmjwlqjmdqfslqwfgozwkf#nlgfqmtlqhjmd#lmbooltfg#wltkfqf#wkf#jmmlubwjuf?,b=?,gju=plvmgwqb`hpfbq`kElqnwfmg#wl#afjmsvw#jg>!lsfmjmd#leqfpwqj`wfgbglswfg#azbggqfppjmdwkfloldjbmnfwklgp#leubqjbmw#le@kqjpwjbm#ufqz#obqdfbvwlnlwjufaz#ebq#wkfqbmdf#eqlnsvqpvjw#leeloolt#wkfaqlvdkw#wljm#Fmdobmgbdqff#wkbwb``vpfg#le`lnfp#eqlnsqfufmwjmdgju#pwzof>kjp#lq#kfqwqfnfmglvpeqffgln#le`lm`fqmjmd3#2fn#2fn8Abphfwaboo,pwzof-`ppbm#fbqojfqfufm#bewfq,!#wjwof>!-`ln,jmgf{wbhjmd#wkfsjwwpavqdk`lmwfmw!=?p`qjsw=+ewvqmfg#lvwkbujmd#wkf?,psbm=\t#l``bpjlmboaf`bvpf#jwpwbqwfg#wlskzpj`booz=?,gju=\t##`qfbwfg#az@vqqfmwoz/#ad`lolq>!wbajmgf{>!gjpbpwqlvpBmbozwj`p#bopl#kbp#b=?gju#jg>!?,pwzof=\t?`boofg#elqpjmdfq#bmg-pq`#>#!,,ujlobwjlmpwkjp#sljmw`lmpwbmwozjp#ol`bwfgqf`lqgjmdpg#eqln#wkfmfgfqobmgpslqwvdv/Fp;N;};D;u;F5m4K4]4_7`gfpbqqlool`lnfmwbqjlfgv`b`j/_mpfswjfnaqfqfdjpwqbglgjqf``j/_mvaj`b`j/_msvaoj`jgbgqfpsvfpwbpqfpvowbglpjnslqwbmwfqfpfqubglpbqw/A`volpgjefqfmwfppjdvjfmwfpqfs/Vaoj`bpjwvb`j/_mnjmjpwfqjlsqjub`jgbggjqf`wlqjlelqnb`j/_mslaob`j/_msqfpjgfmwf`lmw','fmjglpb``fplqjlpwf`kmlqbwjsfqplmbofp`bwfdlq/Abfpsf`jbofpgjpslmjaofb`wvbojgbgqfefqfm`jbuboobglojgajaojlwf`bqfob`jlmfp`bofmgbqjlslo/Awj`bpbmwfqjlqfpgl`vnfmwlpmbwvqbofybnbwfqjbofpgjefqfm`jbf`lm/_nj`bwqbmpslqwfqlgq/Advfysbqwj`jsbqfm`vfmwqbmgjp`vpj/_mfpwqv`wvqbevmgb`j/_meqf`vfmwfpsfqnbmfmwfwlwbonfmwf!2s{#plojg# -dje!#bow>!wqbmpsbqfmwjmelqnbwjlmbssoj`bwjlm!#lm`oj`h>!fpwbaojpkfgbgufqwjpjmd-smd!#bow>!fmujqlmnfmwsfqelqnbm`fbssqlsqjbwf%bns8ngbpk8jnnfgjbwfoz?,pwqlmd=?,qbwkfq#wkbmwfnsfqbwvqfgfufolsnfmw`lnsfwjwjlmsob`fklogfqujpjajojwz9`lszqjdkw!=3!#kfjdkw>!fufm#wklvdkqfsob`fnfmwgfpwjmbwjlm@lqslqbwjlm?vo#`obpp>!Bppl`jbwjlmjmgjujgvbopsfqpsf`wjufpfwWjnflvw+vqo+kwws9,,nbwkfnbwj`pnbqdjm.wls9fufmwvbooz#gfp`qjswjlm*#ml.qfsfbw`loof`wjlmp-ISDwkvnasbqwj`jsbwf,kfbg=?algzeolbw9ofew8?oj#`obpp>!kvmgqfgp#le\t\tKltfufq/#`lnslpjwjlm`ofbq9alwk8`llsfqbwjlmtjwkjm#wkf#obafo#elq>!alqgfq.wls9Mft#Yfbobmgqf`lnnfmgfgsklwldqbskzjmwfqfpwjmd%ow8pvs%dw8`lmwqlufqpzMfwkfqobmgpbowfqmbwjufnb{ofmdwk>!ptjwyfqobmgGfufolsnfmwfppfmwjbooz\t\tBowklvdk#?,wf{wbqfb=wkvmgfqajqgqfsqfpfmwfg%bns8mgbpk8psf`vobwjlm`lnnvmjwjfpofdjpobwjlmfof`wqlmj`p\t\n?gju#jg>!joovpwqbwfgfmdjmffqjmdwfqqjwlqjfpbvwklqjwjfpgjpwqjavwfg5!#kfjdkw>!pbmp.pfqje8`bsbaof#le#gjpbssfbqfgjmwfqb`wjufollhjmd#elqjw#tlvog#afBedkbmjpwbmtbp#`qfbwfgNbwk-eollq+pvqqlvmgjmd`bm#bopl#aflapfqubwjlmnbjmwfmbm`ffm`lvmwfqfg?k1#`obpp>!nlqf#qf`fmwjw#kbp#affmjmubpjlm#le*-dfwWjnf+*evmgbnfmwboGfpsjwf#wkf!=?gju#jg>!jmpsjqbwjlmf{bnjmbwjlmsqfsbqbwjlmf{sobmbwjlm?jmsvw#jg>!?,b=?,psbm=ufqpjlmp#lejmpwqvnfmwpafelqf#wkf##>#$kwws9,,Gfp`qjswjlmqfobwjufoz#-pvapwqjmd+fb`k#le#wkff{sfqjnfmwpjmeovfmwjbojmwfdqbwjlmnbmz#sflsofgvf#wl#wkf#`lnajmbwjlmgl#mlw#kbufNjggof#Fbpw?mlp`qjsw=?`lszqjdkw!#sfqkbsp#wkfjmpwjwvwjlmjm#Gf`fnafqbqqbmdfnfmwnlpw#ebnlvpsfqplmbojwz`qfbwjlm#leojnjwbwjlmpf{`ovpjufozplufqfjdmwz.`lmwfmw!=\t?wg#`obpp>!vmgfqdqlvmgsbqboofo#wlgl`wqjmf#lel``vsjfg#azwfqnjmloldzQfmbjppbm`fb#mvnafq#lepvsslqw#elqf{solqbwjlmqf`ldmjwjlmsqfgf`fpplq?jnd#pq`>!,?k2#`obpp>!svaoj`bwjlmnbz#bopl#afpsf`jbojyfg?,ejfogpfw=sqldqfppjufnjoojlmp#lepwbwfp#wkbwfmelq`fnfmwbqlvmg#wkf#lmf#bmlwkfq-sbqfmwMlgfbdqj`vowvqfBowfqmbwjufqfpfbq`kfqpwltbqgp#wkfNlpw#le#wkfnbmz#lwkfq#+fpsf`jbooz?wg#tjgwk>!8tjgwk9233&jmgfsfmgfmw?k0#`obpp>!#lm`kbmdf>!*-bgg@obpp+jmwfqb`wjlmLmf#le#wkf#gbvdkwfq#leb``fpplqjfpaqbm`kfp#le\t?gju#jg>!wkf#obqdfpwgf`obqbwjlmqfdvobwjlmpJmelqnbwjlmwqbmpobwjlmgl`vnfmwbqzjm#lqgfq#wl!=\t?kfbg=\t?!#kfjdkw>!2b`qlpp#wkf#lqjfmwbwjlm*8?,p`qjsw=jnsofnfmwfg`bm#af#pffmwkfqf#tbp#bgfnlmpwqbwf`lmwbjmfq!=`lmmf`wjlmpwkf#Aqjwjpktbp#tqjwwfm"jnslqwbmw8s{8#nbqdjm.elooltfg#azbajojwz#wl#`lnsoj`bwfggvqjmd#wkf#jnnjdqbwjlmbopl#`boofg?k7#`obpp>!gjpwjm`wjlmqfsob`fg#azdlufqmnfmwpol`bwjlm#lejm#Mlufnafqtkfwkfq#wkf?,s=\t?,gju=b`rvjpjwjlm`boofg#wkf#sfqpf`vwjlmgfpjdmbwjlmxelmw.pjyf9bssfbqfg#jmjmufpwjdbwff{sfqjfm`fgnlpw#ojhfoztjgfoz#vpfggjp`vppjlmpsqfpfm`f#le#+gl`vnfmw-f{wfmpjufozJw#kbp#affmjw#glfp#mlw`lmwqbqz#wljmkbajwbmwpjnsqlufnfmwp`klobqpkjs`lmpvnswjlmjmpwqv`wjlmelq#f{bnsoflmf#lq#nlqfs{8#sbggjmdwkf#`vqqfmwb#pfqjfp#lebqf#vpvboozqlof#jm#wkfsqfujlvpoz#gfqjubwjufpfujgfm`f#lef{sfqjfm`fp`lolqp`kfnfpwbwfg#wkbw`fqwjej`bwf?,b=?,gju=\t#pfof`wfg>!kjdk#p`klloqfpslmpf#wl`lnelqwbaofbglswjlm#lewkqff#zfbqpwkf#`lvmwqzjm#Efaqvbqzpl#wkbw#wkfsflsof#tkl#sqlujgfg#az?sbqbn#mbnfbeef`wfg#azjm#wfqnp#lebssljmwnfmwJPL.;;6:.2!tbp#alqm#jmkjpwlqj`bo#qfdbqgfg#bpnfbpvqfnfmwjp#abpfg#lm#bmg#lwkfq#9#evm`wjlm+pjdmjej`bmw`fofaqbwjlmwqbmpnjwwfg,ip,irvfqz-jp#hmltm#bpwkflqfwj`bo#wbajmgf{>!jw#`lvog#af?mlp`qjsw=\tkbujmd#affm\t?kfbg=\t?#%rvlw8Wkf#`lnsjobwjlmkf#kbg#affmsqlgv`fg#azskjolplskfq`lmpwqv`wfgjmwfmgfg#wlbnlmd#lwkfq`lnsbqfg#wlwl#pbz#wkbwFmdjmffqjmdb#gjeefqfmwqfefqqfg#wlgjeefqfm`fpafojfe#wkbwsklwldqbskpjgfmwjezjmdKjpwlqz#le#Qfsvaoj`#lemf`fppbqjozsqlabajojwzwf`kmj`boozofbujmd#wkfpsf`wb`vobqeqb`wjlm#lefof`wqj`jwzkfbg#le#wkfqfpwbvqbmwpsbqwmfqpkjsfnskbpjp#lmnlpw#qf`fmwpkbqf#tjwk#pbzjmd#wkbwejoofg#tjwkgfpjdmfg#wljw#jp#lewfm!=?,jeqbnf=bp#elooltp9nfqdfg#tjwkwkqlvdk#wkf`lnnfq`jbo#sljmwfg#lvwlsslqwvmjwzujft#le#wkfqfrvjqfnfmwgjujpjlm#lesqldqbnnjmdkf#qf`fjufgpfwJmwfqubo!=?,psbm=?,jm#Mft#Zlqhbggjwjlmbo#`lnsqfppjlm\t\t?gju#jg>!jm`lqslqbwf8?,p`qjsw=?bwwb`kFufmwaf`bnf#wkf#!#wbqdfw>!\\`bqqjfg#lvwPlnf#le#wkfp`jfm`f#bmgwkf#wjnf#le@lmwbjmfq!=nbjmwbjmjmd@kqjpwlskfqNv`k#le#wkftqjwjmdp#le!#kfjdkw>!1pjyf#le#wkfufqpjlm#le#nj{wvqf#le#afwtffm#wkfF{bnsofp#lefgv`bwjlmbo`lnsfwjwjuf#lmpvanjw>!gjqf`wlq#legjpwjm`wjuf,GWG#[KWNO#qfobwjmd#wlwfmgfm`z#wlsqlujm`f#letkj`k#tlvoggfpsjwf#wkfp`jfmwjej`#ofdjpobwvqf-jmmfqKWNO#boofdbwjlmpBdqj`vowvqftbp#vpfg#jmbssqlb`k#wljmwfoojdfmwzfbqp#obwfq/pbmp.pfqjegfwfqnjmjmdSfqelqnbm`fbssfbqbm`fp/#tkj`k#jp#elvmgbwjlmpbaaqfujbwfgkjdkfq#wkbmp#eqln#wkf#jmgjujgvbo#`lnslpfg#lepvsslpfg#wl`objnp#wkbwbwwqjavwjlmelmw.pjyf92fofnfmwp#leKjpwlqj`bo#kjp#aqlwkfqbw#wkf#wjnfbmmjufqpbqzdlufqmfg#azqfobwfg#wl#vowjnbwfoz#jmmlubwjlmpjw#jp#pwjoo`bm#lmoz#afgfejmjwjlmpwlDNWPwqjmdB#mvnafq#lejnd#`obpp>!Fufmwvbooz/tbp#`kbmdfgl``vqqfg#jmmfjdkalqjmdgjpwjmdvjpktkfm#kf#tbpjmwqlgv`jmdwfqqfpwqjboNbmz#le#wkfbqdvfp#wkbwbm#Bnfqj`bm`lmrvfpw#letjgfpsqfbg#tfqf#hjoofgp`qffm#bmg#Jm#lqgfq#wlf{sf`wfg#wlgfp`fmgbmwpbqf#ol`bwfgofdjpobwjufdfmfqbwjlmp#ab`hdqlvmgnlpw#sflsofzfbqp#bewfqwkfqf#jp#mlwkf#kjdkfpweqfrvfmwoz#wkfz#gl#mlwbqdvfg#wkbwpkltfg#wkbwsqfglnjmbmwwkfloldj`boaz#wkf#wjnf`lmpjgfqjmdpklqw.ojufg?,psbm=?,b=`bm#af#vpfgufqz#ojwwoflmf#le#wkf#kbg#boqfbgzjmwfqsqfwfg`lnnvmj`bwfefbwvqfp#ledlufqmnfmw/?,mlp`qjsw=fmwfqfg#wkf!#kfjdkw>!0Jmgfsfmgfmwslsvobwjlmpobqdf.p`bof-#Bowklvdk#vpfg#jm#wkfgfpwqv`wjlmslppjajojwzpwbqwjmd#jmwtl#lq#nlqff{sqfppjlmppvalqgjmbwfobqdfq#wkbmkjpwlqz#bmg?,lswjlm=\t@lmwjmfmwbofojnjmbwjmdtjoo#mlw#afsqb`wj`f#lejm#eqlmw#lepjwf#le#wkffmpvqf#wkbwwl#`qfbwf#bnjppjppjssjslwfmwjboozlvwpwbmgjmdafwwfq#wkbmtkbw#jp#mltpjwvbwfg#jmnfwb#mbnf>!WqbgjwjlmbopvddfpwjlmpWqbmpobwjlmwkf#elqn#lebwnlpskfqj`jgfloldj`bofmwfqsqjpfp`bo`vobwjmdfbpw#le#wkfqfnmbmwp#lesovdjmpsbdf,jmgf{-sks!Wkjp#jp#wkf#?b#kqfe>!,slsvobqjyfgjmuloufg#jmbqf#vpfg#wlbmg#pfufqbonbgf#az#wkfpffnp#wl#afojhfoz#wkbwSbofpwjmjbmmbnfg#bewfqjw#kbg#affmnlpw#`lnnlmwl#qfefq#wlavw#wkjp#jp`lmpf`vwjufwfnslqbqjozJm#dfmfqbo/`lmufmwjlmpwbhfp#sob`fpvagjujpjlmwfqqjwlqjbolsfqbwjlmbosfqnbmfmwoztbp#obqdfozlvwaqfbh#lejm#wkf#sbpwelooltjmd#b#{nomp9ld>!=?b#`obpp>!`obpp>!wf{w@lmufqpjlm#nbz#af#vpfgnbmveb`wvqfbewfq#afjmd`ofbqej{!=\trvfpwjlm#letbp#fof`wfgwl#af`lnf#baf`bvpf#le#plnf#sflsofjmpsjqfg#azpv``fppevo#b#wjnf#tkfmnlqf#`lnnlmbnlmdpw#wkfbm#leej`jbotjgwk9233&8wf`kmloldz/tbp#bglswfgwl#hffs#wkfpfwwofnfmwpojuf#ajqwkpjmgf{-kwno!@lmmf`wj`vwbppjdmfg#wl%bns8wjnfp8b``lvmw#elqbojdm>qjdkwwkf#`lnsbmzbotbzp#affmqfwvqmfg#wljmuloufnfmwAf`bvpf#wkfwkjp#sfqjlg!#mbnf>!r!#`lmejmfg#wlb#qfpvow#leubovf>!!#,=jp#b`wvboozFmujqlmnfmw\t?,kfbg=\t@lmufqpfoz/=\t?gju#jg>!3!#tjgwk>!2jp#sqlabaozkbuf#af`lnf`lmwqloojmdwkf#sqlaofn`jwjyfmp#leslojwj`jbmpqfb`kfg#wkfbp#fbqoz#bp9mlmf8#lufq?wbaof#`fooubojgjwz#legjqf`woz#wllmnlvpfgltmtkfqf#jw#jptkfm#jw#tbpnfnafqp#le#qfobwjlm#wlb``lnnlgbwfbolmd#tjwk#Jm#wkf#obwfwkf#Fmdojpkgfoj`jlvp!=wkjp#jp#mlwwkf#sqfpfmwje#wkfz#bqfbmg#ejmboozb#nbwwfq#le\t\n?,gju=\t\t?,p`qjsw=ebpwfq#wkbmnbilqjwz#lebewfq#tkj`k`lnsbqbwjufwl#nbjmwbjmjnsqluf#wkfbtbqgfg#wkffq!#`obpp>!eqbnfalqgfqqfpwlqbwjlmjm#wkf#pbnfbmbozpjp#lewkfjq#ejqpwGvqjmd#wkf#`lmwjmfmwbopfrvfm`f#leevm`wjlm+*xelmw.pjyf9#tlqh#lm#wkf?,p`qjsw=\t?afdjmp#tjwkibubp`qjsw9`lmpwjwvfmwtbp#elvmgfgfrvjojaqjvnbppvnf#wkbwjp#djufm#azmffgp#wl#af`llqgjmbwfpwkf#ubqjlvpbqf#sbqw#lelmoz#jm#wkfpf`wjlmp#lejp#b#`lnnlmwkflqjfp#legjp`lufqjfpbppl`jbwjlmfgdf#le#wkfpwqfmdwk#leslpjwjlm#jmsqfpfmw.gbzvmjufqpboozwl#elqn#wkfavw#jmpwfbg`lqslqbwjlmbwwb`kfg#wljp#`lnnlmozqfbplmp#elq#%rvlw8wkf#`bm#af#nbgftbp#baof#wltkj`k#nfbmpavw#gjg#mlwlmNlvpfLufqbp#slppjaoflsfqbwfg#az`lnjmd#eqlnwkf#sqjnbqzbggjwjlm#leelq#pfufqbowqbmpefqqfgb#sfqjlg#lebqf#baof#wlkltfufq/#jwpklvog#kbufnv`k#obqdfq\t\n?,p`qjsw=bglswfg#wkfsqlsfqwz#legjqf`wfg#azfeef`wjufoztbp#aqlvdkw`kjogqfm#leSqldqbnnjmdolmdfq#wkbmnbmvp`qjswptbq#bdbjmpwaz#nfbmp#lebmg#nlpw#lepjnjobq#wl#sqlsqjfwbqzlqjdjmbwjmdsqfpwjdjlvpdqbnnbwj`bof{sfqjfm`f-wl#nbhf#wkfJw#tbp#bopljp#elvmg#jm`lnsfwjwlqpjm#wkf#V-P-qfsob`f#wkfaqlvdkw#wkf`bo`vobwjlmeboo#le#wkfwkf#dfmfqbosqb`wj`boozjm#klmlq#leqfofbpfg#jmqfpjgfmwjbobmg#plnf#lehjmd#le#wkfqfb`wjlm#wl2pw#Fbqo#le`vowvqf#bmgsqjm`jsbooz?,wjwof=\t##wkfz#`bm#afab`h#wl#wkfplnf#le#kjpf{slpvqf#wlbqf#pjnjobqelqn#le#wkfbggEbulqjwf`jwjyfmpkjssbqw#jm#wkfsflsof#tjwkjm#sqb`wj`fwl#`lmwjmvf%bns8njmvp8bssqlufg#az#wkf#ejqpw#booltfg#wkfbmg#elq#wkfevm`wjlmjmdsobzjmd#wkfplovwjlm#wlkfjdkw>!3!#jm#kjp#allhnlqf#wkbm#belooltp#wkf`qfbwfg#wkfsqfpfm`f#jm%maps8?,wg=mbwjlmbojpwwkf#jgfb#leb#`kbqb`wfqtfqf#elq`fg#`obpp>!awmgbzp#le#wkfefbwvqfg#jmpkltjmd#wkfjmwfqfpw#jmjm#sob`f#lewvqm#le#wkfwkf#kfbg#leOlqg#le#wkfslojwj`boozkbp#jwp#ltmFgv`bwjlmbobssqlubo#leplnf#le#wkffb`k#lwkfq/afkbujlq#lebmg#af`bvpfbmg#bmlwkfqbssfbqfg#lmqf`lqgfg#jmaob`h%rvlw8nbz#jm`ovgfwkf#tlqog$p`bm#ofbg#wlqfefqp#wl#balqgfq>!3!#dlufqmnfmw#tjmmjmd#wkfqfpvowfg#jm#tkjof#wkf#Tbpkjmdwlm/wkf#pvaif`w`jwz#jm#wkf=?,gju=\t\n\nqfeof`w#wkfwl#`lnsofwfaf`bnf#nlqfqbgjlb`wjufqfif`wfg#aztjwklvw#bmzkjp#ebwkfq/tkj`k#`lvog`lsz#le#wkfwl#jmgj`bwfb#slojwj`bob``lvmwp#le`lmpwjwvwfptlqhfg#tjwkfq?,b=?,oj=le#kjp#ojefb``lnsbmjfg`ojfmwTjgwksqfufmw#wkfOfdjpobwjufgjeefqfmwozwldfwkfq#jmkbp#pfufqboelq#bmlwkfqwf{w#le#wkfelvmgfg#wkff#tjwk#wkf#jp#vpfg#elq`kbmdfg#wkfvpvbooz#wkfsob`f#tkfqftkfqfbp#wkf=#?b#kqfe>!!=?b#kqfe>!wkfnpfoufp/bowklvdk#kfwkbw#`bm#afwqbgjwjlmboqlof#le#wkfbp#b#qfpvowqfnluf@kjoggfpjdmfg#aztfpw#le#wkfPlnf#sflsofsqlgv`wjlm/pjgf#le#wkfmftpofwwfqpvpfg#az#wkfgltm#wl#wkfb``fswfg#azojuf#jm#wkfbwwfnswp#wllvwpjgf#wkfeqfrvfm`jfpKltfufq/#jmsqldqbnnfqpbw#ofbpw#jmbssql{jnbwfbowklvdk#jwtbp#sbqw#lebmg#ubqjlvpDlufqmlq#lewkf#bqwj`ofwvqmfg#jmwl=?b#kqfe>!,wkf#f`lmlnzjp#wkf#nlpwnlpw#tjgfoztlvog#obwfqbmg#sfqkbspqjpf#wl#wkfl``vqp#tkfmvmgfq#tkj`k`lmgjwjlmp-wkf#tfpwfqmwkflqz#wkbwjp#sqlgv`fgwkf#`jwz#lejm#tkj`k#kfpffm#jm#wkfwkf#`fmwqboavjogjmd#lenbmz#le#kjpbqfb#le#wkfjp#wkf#lmoznlpw#le#wkfnbmz#le#wkfwkf#TfpwfqmWkfqf#jp#mlf{wfmgfg#wlPwbwjpwj`bo`lopsbm>1#pklqw#pwlqzslppjaof#wlwlsloldj`bo`qjwj`bo#leqfslqwfg#wlb#@kqjpwjbmgf`jpjlm#wljp#frvbo#wlsqlaofnp#leWkjp#`bm#afnfq`kbmgjpfelq#nlpw#leml#fujgfm`ffgjwjlmp#lefofnfmwp#jm%rvlw8-#Wkf`ln,jnbdfp,tkj`k#nbhfpwkf#sql`fppqfnbjmp#wkfojwfqbwvqf/jp#b#nfnafqwkf#slsvobqwkf#bm`jfmwsqlaofnp#jmwjnf#le#wkfgfefbwfg#azalgz#le#wkfb#eft#zfbqpnv`k#le#wkfwkf#tlqh#le@bojelqmjb/pfqufg#bp#bdlufqmnfmw-`lm`fswp#lenlufnfmw#jm\n\n?gju#jg>!jw!#ubovf>!obmdvbdf#lebp#wkfz#bqfsqlgv`fg#jmjp#wkbw#wkff{sobjm#wkfgju=?,gju=\tKltfufq#wkfofbg#wl#wkf\n?b#kqfe>!,tbp#dqbmwfgsflsof#kbuf`lmwjmvbooztbp#pffm#bpbmg#qfobwfgwkf#qlof#lesqlslpfg#azle#wkf#afpwfb`k#lwkfq-@lmpwbmwjmfsflsof#eqlngjbof`wp#lewl#qfujpjlmtbp#qfmbnfgb#plvq`f#lewkf#jmjwjboobvm`kfg#jmsqlujgf#wkfwl#wkf#tfpwtkfqf#wkfqfbmg#pjnjobqafwtffm#wtljp#bopl#wkfFmdojpk#bmg`lmgjwjlmp/wkbw#jw#tbpfmwjwofg#wlwkfnpfoufp-rvbmwjwz#leqbmpsbqfm`zwkf#pbnf#bpwl#iljm#wkf`lvmwqz#bmgwkjp#jp#wkfWkjp#ofg#wlb#pwbwfnfmw`lmwqbpw#wlobpwJmgf{Lewkqlvdk#kjpjp#gfpjdmfgwkf#wfqn#jpjp#sqlujgfgsqlwf`w#wkfmd?,b=?,oj=Wkf#`vqqfmwwkf#pjwf#lepvapwbmwjbof{sfqjfm`f/jm#wkf#Tfpwwkfz#pklvogpolufm(ajmb`lnfmwbqjlpvmjufqpjgbg`lmgj`jlmfpb`wjujgbgfpf{sfqjfm`jbwf`mlold/Absqlgv``j/_msvmwvb`j/_mbsoj`b`j/_m`lmwqbpf/]b`bwfdlq/Abpqfdjpwqbqpfsqlefpjlmbowqbwbnjfmwlqfd/Apwqbwfpf`qfwbq/Absqjm`jsbofpsqlwf``j/_mjnslqwbmwfpjnslqwbm`jbslpjajojgbgjmwfqfpbmwf`qf`jnjfmwlmf`fpjgbgfppvp`qjajqpfbpl`jb`j/_mgjpslmjaofpfubovb`j/_mfpwvgjbmwfpqfpslmpbaofqfplov`j/_mdvbgbobibqbqfdjpwqbglplslqwvmjgbg`lnfq`jbofpelwldqbe/Abbvwlqjgbgfpjmdfmjfq/Abwfofujpj/_m`lnsfwfm`jblsfqb`jlmfpfpwbaof`jglpjnsofnfmwfb`wvbonfmwfmbufdb`j/_m`lmelqnjgbgojmf.kfjdkw9elmw.ebnjoz9!#9#!kwws9,,bssoj`bwjlmpojmh!#kqfe>!psf`jej`booz,,?"X@GBWBX\tLqdbmjybwjlmgjpwqjavwjlm3s{8#kfjdkw9qfobwjlmpkjsgfuj`f.tjgwk?gju#`obpp>!?obafo#elq>!qfdjpwqbwjlm?,mlp`qjsw=\t,jmgf{-kwno!tjmglt-lsfm+#"jnslqwbmw8bssoj`bwjlm,jmgfsfmgfm`f,,ttt-dlldoflqdbmjybwjlmbvwl`lnsofwfqfrvjqfnfmwp`lmpfqubwjuf?elqn#mbnf>!jmwfoof`wvbonbqdjm.ofew92;wk#`fmwvqzbm#jnslqwbmwjmpwjwvwjlmpbaaqfujbwjlm?jnd#`obpp>!lqdbmjpbwjlm`jujojybwjlm2:wk#`fmwvqzbq`kjwf`wvqfjm`lqslqbwfg13wk#`fmwvqz.`lmwbjmfq!=nlpw#mlwbaoz,=?,b=?,gju=mlwjej`bwjlm$vmgfejmfg$*Evqwkfqnlqf/afojfuf#wkbwjmmfqKWNO#>#sqjlq#wl#wkfgqbnbwj`boozqfefqqjmd#wlmfdlwjbwjlmpkfbgrvbqwfqpPlvwk#Beqj`bvmpv``fppevoSfmmpzoubmjbBp#b#qfpvow/?kwno#obmd>!%ow8,pvs%dw8gfbojmd#tjwkskjobgfoskjbkjpwlqj`booz*8?,p`qjsw=\tsbggjmd.wls9f{sfqjnfmwbodfwBwwqjavwfjmpwqv`wjlmpwf`kmloldjfpsbqw#le#wkf#>evm`wjlm+*xpvap`qjswjlmo-gwg!=\t?kwdfldqbskj`bo@lmpwjwvwjlm$/#evm`wjlm+pvsslqwfg#azbdqj`vowvqbo`lmpwqv`wjlmsvaoj`bwjlmpelmw.pjyf9#2b#ubqjfwz#le?gju#pwzof>!Fm`z`olsfgjbjeqbnf#pq`>!gfnlmpwqbwfgb``lnsojpkfgvmjufqpjwjfpGfnldqbskj`p*8?,p`qjsw=?gfgj`bwfg#wlhmltofgdf#lepbwjpeb`wjlmsbqwj`vobqoz?,gju=?,gju=Fmdojpk#+VP*bssfmg@kjog+wqbmpnjppjlmp-#Kltfufq/#jmwfoojdfm`f!#wbajmgf{>!eolbw9qjdkw8@lnnlmtfbowkqbmdjmd#eqlnjm#tkj`k#wkfbw#ofbpw#lmfqfsqlgv`wjlmfm`z`olsfgjb8elmw.pjyf92ivqjpgj`wjlmbw#wkbw#wjnf!=?b#`obpp>!Jm#bggjwjlm/gfp`qjswjlm(`lmufqpbwjlm`lmwb`w#tjwkjp#dfmfqboozq!#`lmwfmw>!qfsqfpfmwjmd%ow8nbwk%dw8sqfpfmwbwjlml``bpjlmbooz?jnd#tjgwk>!mbujdbwjlm!=`lnsfmpbwjlm`kbnsjlmpkjsnfgjb>!boo!#ujlobwjlm#leqfefqfm`f#wlqfwvqm#wqvf8Pwqj`w,,FM!#wqbmpb`wjlmpjmwfqufmwjlmufqjej`bwjlmJmelqnbwjlm#gjeej`vowjfp@kbnsjlmpkjs`bsbajojwjfp?"Xfmgje^..=~\t?,p`qjsw=\t@kqjpwjbmjwzelq#f{bnsof/Sqlefppjlmboqfpwqj`wjlmppvddfpw#wkbwtbp#qfofbpfg+pv`k#bp#wkfqfnluf@obpp+vmfnsolznfmwwkf#Bnfqj`bmpwqv`wvqf#le,jmgf{-kwno#svaojpkfg#jmpsbm#`obpp>!!=?b#kqfe>!,jmwqlgv`wjlmafolmdjmd#wl`objnfg#wkbw`lmpfrvfm`fp?nfwb#mbnf>!Dvjgf#wl#wkflufqtkfonjmdbdbjmpw#wkf#`lm`fmwqbwfg/\t-mlmwlv`k#lapfqubwjlmp?,b=\t?,gju=\te#+gl`vnfmw-alqgfq9#2s{#xelmw.pjyf92wqfbwnfmw#le3!#kfjdkw>!2nlgjej`bwjlmJmgfsfmgfm`fgjujgfg#jmwldqfbwfq#wkbmb`kjfufnfmwpfpwbaojpkjmdIbubP`qjsw!#mfufqwkfofpppjdmjej`bm`fAqlbg`bpwjmd=%maps8?,wg=`lmwbjmfq!=\tpv`k#bp#wkf#jmeovfm`f#leb#sbqwj`vobqpq`>$kwws9,,mbujdbwjlm!#kboe#le#wkf#pvapwbmwjbo#%maps8?,gju=bgubmwbdf#legjp`lufqz#leevmgbnfmwbo#nfwqlslojwbmwkf#lsslpjwf!#{no9obmd>!gfojafqbwfozbojdm>`fmwfqfulovwjlm#lesqfpfqubwjlmjnsqlufnfmwpafdjmmjmd#jmIfpvp#@kqjpwSvaoj`bwjlmpgjpbdqffnfmwwf{w.bojdm9q/#evm`wjlm+*pjnjobqjwjfpalgz=?,kwno=jp#`vqqfmwozboskbafwj`bojp#plnfwjnfpwzsf>!jnbdf,nbmz#le#wkf#eolt9kjggfm8bubjobaof#jmgfp`qjaf#wkff{jpwfm`f#leboo#lufq#wkfwkf#Jmwfqmfw\n?vo#`obpp>!jmpwboobwjlmmfjdkalqkllgbqnfg#elq`fpqfgv`jmd#wkf`lmwjmvfp#wlMlmfwkfofpp/wfnsfqbwvqfp\t\n\n?b#kqfe>!`olpf#wl#wkff{bnsofp#le#jp#balvw#wkf+pff#afolt*-!#jg>!pfbq`ksqlefppjlmbojp#bubjobaofwkf#leej`jbo\n\n?,p`qjsw=\t\t\n\n?gju#jg>!b``fofqbwjlmwkqlvdk#wkf#Kboo#le#Ebnfgfp`qjswjlmpwqbmpobwjlmpjmwfqefqfm`f#wzsf>$wf{w,qf`fmw#zfbqpjm#wkf#tlqogufqz#slsvobqxab`hdqlvmg9wqbgjwjlmbo#plnf#le#wkf#`lmmf`wfg#wlf{soljwbwjlmfnfqdfm`f#le`lmpwjwvwjlmB#Kjpwlqz#lepjdmjej`bmw#nbmveb`wvqfgf{sf`wbwjlmp=?mlp`qjsw=?`bm#af#elvmgaf`bvpf#wkf#kbp#mlw#affmmfjdkalvqjmdtjwklvw#wkf#bggfg#wl#wkf\n?oj#`obpp>!jmpwqvnfmwboPlujfw#Vmjlmb`hmltofgdfgtkj`k#`bm#afmbnf#elq#wkfbwwfmwjlm#wlbwwfnswp#wl#gfufolsnfmwpJm#eb`w/#wkf?oj#`obpp>!bjnsoj`bwjlmppvjwbaof#elqnv`k#le#wkf#`lolmjybwjlmsqfpjgfmwjbo`bm`foAvaaof#Jmelqnbwjlmnlpw#le#wkf#jp#gfp`qjafgqfpw#le#wkf#nlqf#lq#ofppjm#PfswfnafqJmwfoojdfm`fpq`>!kwws9,,s{8#kfjdkw9#bubjobaof#wlnbmveb`wvqfqkvnbm#qjdkwpojmh#kqfe>!,bubjobajojwzsqlslqwjlmbolvwpjgf#wkf#bpwqlmlnj`bokvnbm#afjmdpmbnf#le#wkf#bqf#elvmg#jmbqf#abpfg#lmpnboofq#wkbmb#sfqplm#tklf{sbmpjlm#lebqdvjmd#wkbwmlt#hmltm#bpJm#wkf#fbqozjmwfqnfgjbwfgfqjufg#eqlnP`bmgjmbujbm?,b=?,gju=\t`lmpjgfq#wkfbm#fpwjnbwfgwkf#Mbwjlmbo?gju#jg>!sbdqfpvowjmd#jm`lnnjppjlmfgbmboldlvp#wlbqf#qfrvjqfg,vo=\t?,gju=\ttbp#abpfg#lmbmg#af`bnf#b%maps8%maps8w!#ubovf>!!#tbp#`bswvqfgml#nlqf#wkbmqfpsf`wjufoz`lmwjmvf#wl#=\t?kfbg=\t?tfqf#`qfbwfgnlqf#dfmfqbojmelqnbwjlm#vpfg#elq#wkfjmgfsfmgfmw#wkf#Jnsfqjbo`lnslmfmw#lewl#wkf#mlqwkjm`ovgf#wkf#@lmpwqv`wjlmpjgf#le#wkf#tlvog#mlw#afelq#jmpwbm`fjmufmwjlm#lenlqf#`lnsof{`loof`wjufozab`hdqlvmg9#wf{w.bojdm9#jwp#lqjdjmbojmwl#b``lvmwwkjp#sql`fppbm#f{wfmpjufkltfufq/#wkfwkfz#bqf#mlwqfif`wfg#wkf`qjwj`jpn#legvqjmd#tkj`ksqlabaoz#wkfwkjp#bqwj`of+evm`wjlm+*xJw#pklvog#afbm#bdqffnfmwb``jgfmwboozgjeefqp#eqlnBq`kjwf`wvqfafwwfq#hmltmbqqbmdfnfmwpjmeovfm`f#lmbwwfmgfg#wkfjgfmwj`bo#wlplvwk#le#wkfsbpp#wkqlvdk{no!#wjwof>!tfjdkw9alog8`qfbwjmd#wkfgjpsobz9mlmfqfsob`fg#wkf?jnd#pq`>!,jkwwsp9,,ttt-Tlqog#Tbq#JJwfpwjnlmjbopelvmg#jm#wkfqfrvjqfg#wl#bmg#wkbw#wkfafwtffm#wkf#tbp#gfpjdmfg`lmpjpwp#le#`lmpjgfqbaozsvaojpkfg#azwkf#obmdvbdf@lmpfqubwjlm`lmpjpwfg#leqfefq#wl#wkfab`h#wl#wkf#`pp!#nfgjb>!Sflsof#eqln#bubjobaof#lmsqlufg#wl#afpvddfpwjlmp!tbp#hmltm#bpubqjfwjfp#leojhfoz#wl#af`lnsqjpfg#lepvsslqw#wkf#kbmgp#le#wkf`lvsofg#tjwk`lmmf`w#bmg#alqgfq9mlmf8sfqelqnbm`fpafelqf#afjmdobwfq#af`bnf`bo`vobwjlmplewfm#`boofgqfpjgfmwp#lenfbmjmd#wkbw=?oj#`obpp>!fujgfm`f#elqf{sobmbwjlmpfmujqlmnfmwp!=?,b=?,gju=tkj`k#booltpJmwqlgv`wjlmgfufolsfg#azb#tjgf#qbmdflm#afkboe#leubojdm>!wls!sqjm`jsof#lebw#wkf#wjnf/?,mlp`qjsw=pbjg#wl#kbufjm#wkf#ejqpwtkjof#lwkfqpkzslwkfwj`boskjolplskfqpsltfq#le#wkf`lmwbjmfg#jmsfqelqnfg#azjmbajojwz#wltfqf#tqjwwfmpsbm#pwzof>!jmsvw#mbnf>!wkf#rvfpwjlmjmwfmgfg#elqqfif`wjlm#lejnsojfp#wkbwjmufmwfg#wkfwkf#pwbmgbqgtbp#sqlabaozojmh#afwtffmsqlefpplq#lejmwfqb`wjlmp`kbmdjmd#wkfJmgjbm#L`fbm#`obpp>!obpwtlqhjmd#tjwk$kwws9,,ttt-zfbqp#afelqfWkjp#tbp#wkfqf`qfbwjlmbofmwfqjmd#wkfnfbpvqfnfmwpbm#f{wqfnfozubovf#le#wkfpwbqw#le#wkf\t?,p`qjsw=\t\tbm#feelqw#wljm`qfbpf#wkfwl#wkf#plvwkpsb`jmd>!3!=pveej`jfmwozwkf#Fvqlsfbm`lmufqwfg#wl`ofbqWjnflvwgjg#mlw#kbuf`lmpfrvfmwozelq#wkf#mf{wf{wfmpjlm#lef`lmlnj`#bmgbowklvdk#wkfbqf#sqlgv`fgbmg#tjwk#wkfjmpveej`jfmwdjufm#az#wkfpwbwjmd#wkbwf{sfmgjwvqfp?,psbm=?,b=\twklvdkw#wkbwlm#wkf#abpjp`foosbggjmd>jnbdf#le#wkfqfwvqmjmd#wljmelqnbwjlm/pfsbqbwfg#azbppbppjmbwfgp!#`lmwfmw>!bvwklqjwz#lemlqwktfpwfqm?,gju=\t?gju#!=?,gju=\t##`lmpvowbwjlm`lnnvmjwz#lewkf#mbwjlmbojw#pklvog#afsbqwj`jsbmwp#bojdm>!ofewwkf#dqfbwfpwpfof`wjlm#lepvsfqmbwvqbogfsfmgfmw#lmjp#nfmwjlmfgbooltjmd#wkftbp#jmufmwfgb``lnsbmzjmdkjp#sfqplmbobubjobaof#bwpwvgz#le#wkflm#wkf#lwkfqf{f`vwjlm#leKvnbm#Qjdkwpwfqnp#le#wkfbppl`jbwjlmpqfpfbq`k#bmgpv``ffgfg#azgfefbwfg#wkfbmg#eqln#wkfavw#wkfz#bqf`lnnbmgfq#lepwbwf#le#wkfzfbqp#le#bdfwkf#pwvgz#le?vo#`obpp>!psob`f#jm#wkftkfqf#kf#tbp?oj#`obpp>!ewkfqf#bqf#mltkj`k#af`bnfkf#svaojpkfgf{sqfppfg#jmwl#tkj`k#wkf`lnnjppjlmfqelmw.tfjdkw9wfqqjwlqz#lef{wfmpjlmp!=Qlnbm#Fnsjqffrvbo#wl#wkfJm#`lmwqbpw/kltfufq/#bmgjp#wzsj`boozbmg#kjp#tjef+bopl#`boofg=?vo#`obpp>!feef`wjufoz#fuloufg#jmwlpffn#wl#kbuftkj`k#jp#wkfwkfqf#tbp#mlbm#f{`foofmwboo#le#wkfpfgfp`qjafg#azJm#sqb`wj`f/aqlbg`bpwjmd`kbqdfg#tjwkqfeof`wfg#jmpvaif`wfg#wlnjojwbqz#bmgwl#wkf#sljmwf`lmlnj`boozpfwWbqdfwjmdbqf#b`wvboozuj`wlqz#lufq+*8?,p`qjsw=`lmwjmvlvpozqfrvjqfg#elqfulovwjlmbqzbm#feef`wjufmlqwk#le#wkf/#tkj`k#tbp#eqlmw#le#wkflq#lwkfqtjpfplnf#elqn#lekbg#mlw#affmdfmfqbwfg#azjmelqnbwjlm-sfqnjwwfg#wljm`ovgfp#wkfgfufolsnfmw/fmwfqfg#jmwlwkf#sqfujlvp`lmpjpwfmwozbqf#hmltm#bpwkf#ejfog#lewkjp#wzsf#ledjufm#wl#wkfwkf#wjwof#le`lmwbjmp#wkfjmpwbm`fp#lejm#wkf#mlqwkgvf#wl#wkfjqbqf#gfpjdmfg`lqslqbwjlmptbp#wkbw#wkflmf#le#wkfpfnlqf#slsvobqpv``ffgfg#jmpvsslqw#eqlnjm#gjeefqfmwglnjmbwfg#azgfpjdmfg#elqltmfqpkjs#lebmg#slppjaozpwbmgbqgjyfgqfpslmpfWf{wtbp#jmwfmgfgqf`fjufg#wkfbppvnfg#wkbwbqfbp#le#wkfsqjnbqjoz#jmwkf#abpjp#lejm#wkf#pfmpfb``lvmwp#elqgfpwqlzfg#azbw#ofbpw#wtltbp#gf`obqfg`lvog#mlw#afPf`qfwbqz#lebssfbq#wl#afnbqdjm.wls92,]_p(_p(\',df*xwkqlt#f~8wkf#pwbqw#lewtl#pfsbqbwfobmdvbdf#bmgtkl#kbg#affmlsfqbwjlm#legfbwk#le#wkfqfbo#mvnafqp\n?ojmh#qfo>!sqlujgfg#wkfwkf#pwlqz#le`lnsfwjwjlmpfmdojpk#+VH*fmdojpk#+VP*#evm`wjlm+*-isd!#tjgwk>!`lmejdvqbwjlm-smd!#tjgwk>!?algz#`obpp>!Nbwk-qbmgln+*`lmwfnslqbqz#Vmjwfg#Pwbwfp`jq`vnpwbm`fp-bssfmg@kjog+lqdbmjybwjlmp?psbm#`obpp>!!=?jnd#pq`>!,gjpwjmdvjpkfgwklvpbmgp#le#`lnnvmj`bwjlm`ofbq!=?,gju=jmufpwjdbwjlmebuj`lm-j`l!#nbqdjm.qjdkw9abpfg#lm#wkf#Nbppb`kvpfwwpwbaof#alqgfq>jmwfqmbwjlmbobopl#hmltm#bpsqlmvm`jbwjlmab`hdqlvmg9 esbggjmd.ofew9Elq#f{bnsof/#njp`foobmflvp%ow8,nbwk%dw8spz`kloldj`bojm#sbqwj`vobqfbq`k!#wzsf>!elqn#nfwklg>!bp#lsslpfg#wlPvsqfnf#@lvqwl``bpjlmbooz#Bggjwjlmbooz/Mlqwk#Bnfqj`bs{8ab`hdqlvmglsslqwvmjwjfpFmwfqwbjmnfmw-wlOltfq@bpf+nbmveb`wvqjmdsqlefppjlmbo#`lnajmfg#tjwkElq#jmpwbm`f/`lmpjpwjmd#le!#nb{ofmdwk>!qfwvqm#ebopf8`lmp`jlvpmfppNfgjwfqqbmfbmf{wqblqgjmbqzbppbppjmbwjlmpvapfrvfmwoz#avwwlm#wzsf>!wkf#mvnafq#lewkf#lqjdjmbo#`lnsqfkfmpjufqfefqp#wl#wkf?,vo=\t?,gju=\tskjolplskj`bool`bwjlm-kqfetbp#svaojpkfgPbm#Eqbm`jp`l+evm`wjlm+*x\t?gju#jg>!nbjmplskjpwj`bwfgnbwkfnbwj`bo#,kfbg=\t?algzpvddfpwp#wkbwgl`vnfmwbwjlm`lm`fmwqbwjlmqfobwjlmpkjspnbz#kbuf#affm+elq#f{bnsof/Wkjp#bqwj`of#jm#plnf#`bpfpsbqwp#le#wkf#gfejmjwjlm#leDqfbw#Aqjwbjm#`foosbggjmd>frvjubofmw#wlsob`fklogfq>!8#elmw.pjyf9#ivpwjej`bwjlmafojfufg#wkbwpveefqfg#eqlnbwwfnswfg#wl#ofbgfq#le#wkf`qjsw!#pq`>!,+evm`wjlm+*#xbqf#bubjobaof\t\n?ojmh#qfo>!#pq`>$kwws9,,jmwfqfpwfg#jm`lmufmwjlmbo#!#bow>!!#,=?,bqf#dfmfqboozkbp#bopl#affmnlpw#slsvobq#`lqqfpslmgjmd`qfgjwfg#tjwkwzof>!alqgfq9?,b=?,psbm=?,-dje!#tjgwk>!?jeqbnf#pq`>!wbaof#`obpp>!jmojmf.aol`h8b``lqgjmd#wl#wldfwkfq#tjwkbssql{jnbwfozsbqojbnfmwbqznlqf#bmg#nlqfgjpsobz9mlmf8wqbgjwjlmboozsqfglnjmbmwoz%maps8%maps8%maps8?,psbm=#`foopsb`jmd>?jmsvw#mbnf>!lq!#`lmwfmw>!`lmwqlufqpjbosqlsfqwz>!ld9,{.pkl`htbuf.gfnlmpwqbwjlmpvqqlvmgfg#azMfufqwkfofpp/tbp#wkf#ejqpw`lmpjgfqbaof#Bowklvdk#wkf#`loobalqbwjlmpklvog#mlw#afsqlslqwjlm#le?psbm#pwzof>!hmltm#bp#wkf#pklqwoz#bewfqelq#jmpwbm`f/gfp`qjafg#bp#,kfbg=\t?algz#pwbqwjmd#tjwkjm`qfbpjmdoz#wkf#eb`w#wkbwgjp`vppjlm#lenjggof#le#wkfbm#jmgjujgvbogjeej`vow#wl#sljmw#le#ujftklnlpf{vbojwzb``fswbm`f#le?,psbm=?,gju=nbmveb`wvqfqplqjdjm#le#wkf`lnnlmoz#vpfgjnslqwbm`f#legfmlnjmbwjlmpab`hdqlvmg9# ofmdwk#le#wkfgfwfqnjmbwjlmb#pjdmjej`bmw!#alqgfq>!3!=qfulovwjlmbqzsqjm`jsofp#lejp#`lmpjgfqfgtbp#gfufolsfgJmgl.Fvqlsfbmuvomfqbaof#wlsqlslmfmwp#lebqf#plnfwjnfp`olpfq#wl#wkfMft#Zlqh#@jwz#mbnf>!pfbq`kbwwqjavwfg#wl`lvqpf#le#wkfnbwkfnbwj`jbmaz#wkf#fmg#lebw#wkf#fmg#le!#alqgfq>!3!#wf`kmloldj`bo-qfnluf@obpp+aqbm`k#le#wkffujgfm`f#wkbw"Xfmgje^..=\tJmpwjwvwf#le#jmwl#b#pjmdofqfpsf`wjufoz-bmg#wkfqfelqfsqlsfqwjfp#lejp#ol`bwfg#jmplnf#le#tkj`kWkfqf#jp#bopl`lmwjmvfg#wl#bssfbqbm`f#le#%bns8mgbpk8#gfp`qjafp#wkf`lmpjgfqbwjlmbvwklq#le#wkfjmgfsfmgfmwozfrvjssfg#tjwkglfp#mlw#kbuf?,b=?b#kqfe>!`lmevpfg#tjwk?ojmh#kqfe>!,bw#wkf#bdf#lebssfbq#jm#wkfWkfpf#jm`ovgfqfdbqgofpp#le`lvog#af#vpfg#pwzof>%rvlw8pfufqbo#wjnfpqfsqfpfmw#wkfalgz=\t?,kwno=wklvdkw#wl#afslsvobwjlm#leslppjajojwjfpsfq`fmwbdf#leb``fpp#wl#wkfbm#bwwfnsw#wlsqlgv`wjlm#leirvfqz,irvfqzwtl#gjeefqfmwafolmd#wl#wkffpwbaojpknfmwqfsob`jmd#wkfgfp`qjswjlm!#gfwfqnjmf#wkfbubjobaof#elqB``lqgjmd#wl#tjgf#qbmdf#le\n?gju#`obpp>!nlqf#`lnnlmozlqdbmjpbwjlmpevm`wjlmbojwztbp#`lnsofwfg#%bns8ngbpk8#sbqwj`jsbwjlmwkf#`kbqb`wfqbm#bggjwjlmbobssfbqp#wl#afeb`w#wkbw#wkfbm#f{bnsof#lepjdmjej`bmwozlmnlvpflufq>!af`bvpf#wkfz#bpzm`#>#wqvf8sqlaofnp#tjwkpffnp#wl#kbufwkf#qfpvow#le#pq`>!kwws9,,ebnjojbq#tjwkslppfppjlm#leevm`wjlm#+*#xwllh#sob`f#jmbmg#plnfwjnfppvapwbmwjbooz?psbm=?,psbm=jp#lewfm#vpfgjm#bm#bwwfnswdqfbw#gfbo#leFmujqlmnfmwbopv``fppevooz#ujqwvbooz#boo13wk#`fmwvqz/sqlefppjlmbopmf`fppbqz#wl#gfwfqnjmfg#az`lnsbwjajojwzaf`bvpf#jw#jpGj`wjlmbqz#lenlgjej`bwjlmpWkf#elooltjmdnbz#qfefq#wl9@lmpfrvfmwoz/Jmwfqmbwjlmbobowklvdk#plnfwkbw#tlvog#aftlqog$p#ejqpw`obppjejfg#bpalwwln#le#wkf+sbqwj`vobqozbojdm>!ofew!#nlpw#`lnnlmozabpjp#elq#wkfelvmgbwjlm#le`lmwqjavwjlmpslsvobqjwz#le`fmwfq#le#wkfwl#qfgv`f#wkfivqjpgj`wjlmpbssql{jnbwjlm#lmnlvpflvw>!Mft#Wfpwbnfmw`loof`wjlm#le?,psbm=?,b=?,jm#wkf#Vmjwfgejon#gjqf`wlq.pwqj`w-gwg!=kbp#affm#vpfgqfwvqm#wl#wkfbowklvdk#wkjp`kbmdf#jm#wkfpfufqbo#lwkfqavw#wkfqf#bqfvmsqf`fgfmwfgjp#pjnjobq#wlfpsf`jbooz#jmtfjdkw9#alog8jp#`boofg#wkf`lnsvwbwjlmbojmgj`bwf#wkbwqfpwqj`wfg#wl\n?nfwb#mbnf>!bqf#wzsj`booz`lmeoj`w#tjwkKltfufq/#wkf#Bm#f{bnsof#le`lnsbqfg#tjwkrvbmwjwjfp#leqbwkfq#wkbm#b`lmpwfoobwjlmmf`fppbqz#elqqfslqwfg#wkbwpsf`jej`bwjlmslojwj`bo#bmg%maps8%maps8?qfefqfm`fp#wlwkf#pbnf#zfbqDlufqmnfmw#ledfmfqbwjlm#lekbuf#mlw#affmpfufqbo#zfbqp`lnnjwnfmw#wl\n\n?vo#`obpp>!ujpvbojybwjlm2:wk#`fmwvqz/sqb`wjwjlmfqpwkbw#kf#tlvogbmg#`lmwjmvfgl``vsbwjlm#lejp#gfejmfg#bp`fmwqf#le#wkfwkf#bnlvmw#le=?gju#pwzof>!frvjubofmw#legjeefqfmwjbwfaqlvdkw#balvwnbqdjm.ofew9#bvwlnbwj`boozwklvdkw#le#bpPlnf#le#wkfpf\t?gju#`obpp>!jmsvw#`obpp>!qfsob`fg#tjwkjp#lmf#le#wkffgv`bwjlm#bmgjmeovfm`fg#azqfsvwbwjlm#bp\t?nfwb#mbnf>!b``lnnlgbwjlm?,gju=\t?,gju=obqdf#sbqw#leJmpwjwvwf#elqwkf#pl.`boofg#bdbjmpw#wkf#Jm#wkjp#`bpf/tbp#bssljmwfg`objnfg#wl#afKltfufq/#wkjpGfsbqwnfmw#lewkf#qfnbjmjmdfeef`w#lm#wkfsbqwj`vobqoz#gfbo#tjwk#wkf\t?gju#pwzof>!bonlpw#botbzpbqf#`vqqfmwozf{sqfppjlm#leskjolplskz#leelq#nlqf#wkbm`jujojybwjlmplm#wkf#jpobmgpfof`wfgJmgf{`bm#qfpvow#jm!#ubovf>!!#,=wkf#pwqv`wvqf#,=?,b=?,gju=Nbmz#le#wkfpf`bvpfg#az#wkfle#wkf#Vmjwfgpsbm#`obpp>!n`bm#af#wqb`fgjp#qfobwfg#wlaf`bnf#lmf#lejp#eqfrvfmwozojujmd#jm#wkfwkflqfwj`boozElooltjmd#wkfQfulovwjlmbqzdlufqmnfmw#jmjp#gfwfqnjmfgwkf#slojwj`bojmwqlgv`fg#jmpveej`jfmw#wlgfp`qjswjlm!=pklqw#pwlqjfppfsbqbwjlm#lebp#wl#tkfwkfqhmltm#elq#jwptbp#jmjwjboozgjpsobz9aol`hjp#bm#f{bnsofwkf#sqjm`jsbo`lmpjpwp#le#bqf`ldmjyfg#bp,algz=?,kwno=b#pvapwbmwjboqf`lmpwqv`wfgkfbg#le#pwbwfqfpjpwbm`f#wlvmgfqdqbgvbwfWkfqf#bqf#wtldqbujwbwjlmbobqf#gfp`qjafgjmwfmwjlmboozpfqufg#bp#wkf`obpp>!kfbgfqlsslpjwjlm#wlevmgbnfmwboozglnjmbwfg#wkfbmg#wkf#lwkfqboojbm`f#tjwktbp#elq`fg#wlqfpsf`wjufoz/bmg#slojwj`bojm#pvsslqw#lesflsof#jm#wkf13wk#`fmwvqz-bmg#svaojpkfgolbg@kbqwafbwwl#vmgfqpwbmgnfnafq#pwbwfpfmujqlmnfmwboejqpw#kboe#le`lvmwqjfp#bmgbq`kjwf`wvqboaf#`lmpjgfqfg`kbqb`wfqjyfg`ofbqJmwfqubobvwklqjwbwjufEfgfqbwjlm#letbp#pv``ffgfgbmg#wkfqf#bqfb#`lmpfrvfm`fwkf#Sqfpjgfmwbopl#jm`ovgfgeqff#plewtbqfpv``fppjlm#legfufolsfg#wkftbp#gfpwqlzfgbtbz#eqln#wkf8\t?,p`qjsw=\t?bowklvdk#wkfzelooltfg#az#bnlqf#sltfqevoqfpvowfg#jm#bVmjufqpjwz#leKltfufq/#nbmzwkf#sqfpjgfmwKltfufq/#plnfjp#wklvdkw#wlvmwjo#wkf#fmgtbp#bmmlvm`fgbqf#jnslqwbmwbopl#jm`ovgfp=?jmsvw#wzsf>wkf#`fmwfq#le#GL#MLW#BOWFQvpfg#wl#qfefqwkfnfp,wkbw#kbg#affmwkf#abpjp#elqkbp#gfufolsfgjm#wkf#pvnnfq`lnsbqbwjufozgfp`qjafg#wkfpv`k#bp#wklpfwkf#qfpvowjmdjp#jnslppjaofubqjlvp#lwkfqPlvwk#Beqj`bmkbuf#wkf#pbnffeef`wjufmfppjm#tkj`k#`bpf8#wf{w.bojdm9pwqv`wvqf#bmg8#ab`hdqlvmg9qfdbqgjmd#wkfpvsslqwfg#wkfjp#bopl#hmltmpwzof>!nbqdjmjm`ovgjmd#wkfabkbpb#Nfobzvmlqph#alhn/Iomlqph#mzmlqphpolufm)M(ajmbjmwfqmb`jlmbo`bojej`b`j/_m`lnvmj`b`j/_m`lmpwqv``j/_m!=?gju#`obpp>!gjpbnajdvbwjlmGlnbjmMbnf$/#$bgnjmjpwqbwjlmpjnvowbmflvpozwqbmpslqwbwjlmJmwfqmbwjlmbo#nbqdjm.alwwln9qfpslmpjajojwz?"Xfmgje^..=\t?,=?nfwb#mbnf>!jnsofnfmwbwjlmjmeqbpwqv`wvqfqfsqfpfmwbwjlmalqgfq.alwwln9?,kfbg=\t?algz=>kwws&0B&1E&1E?elqn#nfwklg>!nfwklg>!slpw!#,ebuj`lm-j`l!#~*8\t?,p`qjsw=\t-pfwBwwqjavwf+Bgnjmjpwqbwjlm>#mft#Bqqbz+*8?"Xfmgje^..=\tgjpsobz9aol`h8Vmelqwvmbwfoz/!=%maps8?,gju=,ebuj`lm-j`l!=>$pwzofpkffw$#jgfmwjej`bwjlm/#elq#f{bnsof/?oj=?b#kqfe>!,bm#bowfqmbwjufbp#b#qfpvow#lesw!=?,p`qjsw=\twzsf>!pvanjw!#\t+evm`wjlm+*#xqf`lnnfmgbwjlmelqn#b`wjlm>!,wqbmpelqnbwjlmqf`lmpwqv`wjlm-pwzof-gjpsobz#B``lqgjmd#wl#kjggfm!#mbnf>!bolmd#tjwk#wkfgl`vnfmw-algz-bssql{jnbwfoz#@lnnvmj`bwjlmpslpw!#b`wjlm>!nfbmjmd#%rvlw8..?"Xfmgje^..=Sqjnf#Njmjpwfq`kbqb`wfqjpwj`?,b=#?b#`obpp>wkf#kjpwlqz#le#lmnlvpflufq>!wkf#dlufqmnfmwkqfe>!kwwsp9,,tbp#lqjdjmbooztbp#jmwqlgv`fg`obppjej`bwjlmqfsqfpfmwbwjufbqf#`lmpjgfqfg?"Xfmgje^..=\t\tgfsfmgp#lm#wkfVmjufqpjwz#le#jm#`lmwqbpw#wl#sob`fklogfq>!jm#wkf#`bpf#lejmwfqmbwjlmbo#`lmpwjwvwjlmbopwzof>!alqgfq.9#evm`wjlm+*#xAf`bvpf#le#wkf.pwqj`w-gwg!=\t?wbaof#`obpp>!b``lnsbmjfg#azb``lvmw#le#wkf?p`qjsw#pq`>!,mbwvqf#le#wkf#wkf#sflsof#jm#jm#bggjwjlm#wlp*8#ip-jg#>#jg!#tjgwk>!233&!qfdbqgjmd#wkf#Qlnbm#@bwkloj`bm#jmgfsfmgfmwelooltjmd#wkf#-dje!#tjgwk>!2wkf#elooltjmd#gjp`qjnjmbwjlmbq`kbfloldj`bosqjnf#njmjpwfq-ip!=?,p`qjsw=`lnajmbwjlm#le#nbqdjmtjgwk>!`qfbwfFofnfmw+t-bwwb`kFufmw+?,b=?,wg=?,wq=pq`>!kwwsp9,,bJm#sbqwj`vobq/#bojdm>!ofew!#@yf`k#Qfsvaoj`Vmjwfg#Hjmdgln`lqqfpslmgfm`f`lm`ovgfg#wkbw-kwno!#wjwof>!+evm`wjlm#+*#x`lnfp#eqln#wkfbssoj`bwjlm#le?psbm#`obpp>!pafojfufg#wl#affnfmw+$p`qjsw$?,b=\t?,oj=\t?ojufqz#gjeefqfmw=?psbm#`obpp>!lswjlm#ubovf>!+bopl#hmltm#bp\n?oj=?b#kqfe>!=?jmsvw#mbnf>!pfsbqbwfg#eqlnqfefqqfg#wl#bp#ubojdm>!wls!=elvmgfq#le#wkfbwwfnswjmd#wl#`bqalm#gjl{jgf\t\t?gju#`obpp>!`obpp>!pfbq`k.,algz=\t?,kwno=lsslqwvmjwz#wl`lnnvmj`bwjlmp?,kfbg=\t?algz#pwzof>!tjgwk9Wj\rVSmd#Uj\rWkw`kbmdfp#jm#wkfalqgfq.`lolq9 3!#alqgfq>!3!#?,psbm=?,gju=?tbp#gjp`lufqfg!#wzsf>!wf{w!#*8\t?,p`qjsw=\t\tGfsbqwnfmw#le#f``ofpjbpwj`bowkfqf#kbp#affmqfpvowjmd#eqln?,algz=?,kwno=kbp#mfufq#affmwkf#ejqpw#wjnfjm#qfpslmpf#wlbvwlnbwj`booz#?,gju=\t\t?gju#jtbp#`lmpjgfqfgsfq`fmw#le#wkf!#,=?,b=?,gju=`loof`wjlm#le#gfp`fmgfg#eqlnpf`wjlm#le#wkfb``fsw.`kbqpfwwl#af#`lmevpfgnfnafq#le#wkf#sbggjmd.qjdkw9wqbmpobwjlm#lejmwfqsqfwbwjlm#kqfe>$kwws9,,tkfwkfq#lq#mlwWkfqf#bqf#boplwkfqf#bqf#nbmzb#pnboo#mvnafqlwkfq#sbqwp#lejnslppjaof#wl##`obpp>!avwwlmol`bwfg#jm#wkf-#Kltfufq/#wkfbmg#fufmwvboozBw#wkf#fmg#le#af`bvpf#le#jwpqfsqfpfmwp#wkf?elqn#b`wjlm>!#nfwklg>!slpw!jw#jp#slppjaofnlqf#ojhfoz#wlbm#jm`qfbpf#jmkbuf#bopl#affm`lqqfpslmgp#wlbmmlvm`fg#wkbwbojdm>!qjdkw!=nbmz#`lvmwqjfpelq#nbmz#zfbqpfbqojfpw#hmltmaf`bvpf#jw#tbpsw!=?,p`qjsw=#ubojdm>!wls!#jmkbajwbmwp#leelooltjmd#zfbq\t?gju#`obpp>!njoojlm#sflsof`lmwqlufqpjbo#`lm`fqmjmd#wkfbqdvf#wkbw#wkfdlufqmnfmw#bmgb#qfefqfm`f#wlwqbmpefqqfg#wlgfp`qjajmd#wkf#pwzof>!`lolq9bowklvdk#wkfqfafpw#hmltm#elqpvanjw!#mbnf>!nvowjsoj`bwjlmnlqf#wkbm#lmf#qf`ldmjwjlm#le@lvm`jo#le#wkffgjwjlm#le#wkf##?nfwb#mbnf>!Fmwfqwbjmnfmw#btbz#eqln#wkf#8nbqdjm.qjdkw9bw#wkf#wjnf#lejmufpwjdbwjlmp`lmmf`wfg#tjwkbmg#nbmz#lwkfqbowklvdk#jw#jpafdjmmjmd#tjwk#?psbm#`obpp>!gfp`fmgbmwp#le?psbm#`obpp>!j#bojdm>!qjdkw!?,kfbg=\t?algz#bpsf`wp#le#wkfkbp#pjm`f#affmFvqlsfbm#Vmjlmqfnjmjp`fmw#lenlqf#gjeej`vowUj`f#Sqfpjgfmw`lnslpjwjlm#lesbppfg#wkqlvdknlqf#jnslqwbmwelmw.pjyf922s{f{sobmbwjlm#lewkf#`lm`fsw#letqjwwfm#jm#wkf\n?psbm#`obpp>!jp#lmf#le#wkf#qfpfnaobm`f#wllm#wkf#dqlvmgptkj`k#`lmwbjmpjm`ovgjmd#wkf#gfejmfg#az#wkfsvaoj`bwjlm#lenfbmp#wkbw#wkflvwpjgf#le#wkfpvsslqw#le#wkf?jmsvw#`obpp>!?psbm#`obpp>!w+Nbwk-qbmgln+*nlpw#sqlnjmfmwgfp`qjswjlm#le@lmpwbmwjmlsoftfqf#svaojpkfg?gju#`obpp>!pfbssfbqp#jm#wkf2!#kfjdkw>!2!#nlpw#jnslqwbmwtkj`k#jm`ovgfptkj`k#kbg#affmgfpwqv`wjlm#lewkf#slsvobwjlm\t\n?gju#`obpp>!slppjajojwz#leplnfwjnfp#vpfgbssfbq#wl#kbufpv``fpp#le#wkfjmwfmgfg#wl#afsqfpfmw#jm#wkfpwzof>!`ofbq9a\t?,p`qjsw=\t?tbp#elvmgfg#jmjmwfqujft#tjwk\\jg!#`lmwfmw>!`bsjwbo#le#wkf\t?ojmh#qfo>!pqfofbpf#le#wkfsljmw#lvw#wkbw{NOKwwsQfrvfpwbmg#pvapfrvfmwpf`lmg#obqdfpwufqz#jnslqwbmwpsf`jej`bwjlmppvqeb`f#le#wkfbssojfg#wl#wkfelqfjdm#sloj`z\\pfwGlnbjmMbnffpwbaojpkfg#jmjp#afojfufg#wlJm#bggjwjlm#wlnfbmjmd#le#wkfjp#mbnfg#bewfqwl#sqlwf`w#wkfjp#qfsqfpfmwfgGf`obqbwjlm#lenlqf#feej`jfmw@obppjej`bwjlmlwkfq#elqnp#lekf#qfwvqmfg#wl?psbm#`obpp>!`sfqelqnbm`f#le+evm`wjlm+*#xje#bmg#lmoz#jeqfdjlmp#le#wkfofbgjmd#wl#wkfqfobwjlmp#tjwkVmjwfg#Mbwjlmppwzof>!kfjdkw9lwkfq#wkbm#wkfzsf!#`lmwfmw>!Bppl`jbwjlm#le\t?,kfbg=\t?algzol`bwfg#lm#wkfjp#qfefqqfg#wl+jm`ovgjmd#wkf`lm`fmwqbwjlmpwkf#jmgjujgvbobnlmd#wkf#nlpwwkbm#bmz#lwkfq,=\t?ojmh#qfo>!#qfwvqm#ebopf8wkf#svqslpf#lewkf#bajojwz#wl8`lolq9 eee~\t-\t?psbm#`obpp>!wkf#pvaif`w#legfejmjwjlmp#le=\t?ojmh#qfo>!`objn#wkbw#wkfkbuf#gfufolsfg?wbaof#tjgwk>!`fofaqbwjlm#leElooltjmd#wkf#wl#gjpwjmdvjpk?psbm#`obpp>!awbhfp#sob`f#jmvmgfq#wkf#mbnfmlwfg#wkbw#wkf=?"Xfmgje^..=\tpwzof>!nbqdjm.jmpwfbg#le#wkfjmwqlgv`fg#wkfwkf#sql`fpp#lejm`qfbpjmd#wkfgjeefqfm`fp#jmfpwjnbwfg#wkbwfpsf`jbooz#wkf,gju=?gju#jg>!tbp#fufmwvboozwkqlvdklvw#kjpwkf#gjeefqfm`fplnfwkjmd#wkbwpsbm=?,psbm=?,pjdmjej`bmwoz#=?,p`qjsw=\t\tfmujqlmnfmwbo#wl#sqfufmw#wkfkbuf#affm#vpfgfpsf`jbooz#elqvmgfqpwbmg#wkfjp#fppfmwjbooztfqf#wkf#ejqpwjp#wkf#obqdfpwkbuf#affm#nbgf!#pq`>!kwws9,,jmwfqsqfwfg#bppf`lmg#kboe#le`qloojmd>!ml!#jp#`lnslpfg#leJJ/#Kloz#Qlnbmjp#f{sf`wfg#wlkbuf#wkfjq#ltmgfejmfg#bp#wkfwqbgjwjlmbooz#kbuf#gjeefqfmwbqf#lewfm#vpfgwl#fmpvqf#wkbwbdqffnfmw#tjwk`lmwbjmjmd#wkfbqf#eqfrvfmwozjmelqnbwjlm#lmf{bnsof#jp#wkfqfpvowjmd#jm#b?,b=?,oj=?,vo=#`obpp>!ellwfqbmg#fpsf`jboozwzsf>!avwwlm!#?,psbm=?,psbm=tkj`k#jm`ovgfg=\t?nfwb#mbnf>!`lmpjgfqfg#wkf`bqqjfg#lvw#azKltfufq/#jw#jpaf`bnf#sbqw#lejm#qfobwjlm#wlslsvobq#jm#wkfwkf#`bsjwbo#letbp#leej`jbooztkj`k#kbp#affmwkf#Kjpwlqz#lebowfqmbwjuf#wlgjeefqfmw#eqlnwl#pvsslqw#wkfpvddfpwfg#wkbwjm#wkf#sql`fpp##?gju#`obpp>!wkf#elvmgbwjlmaf`bvpf#le#kjp`lm`fqmfg#tjwkwkf#vmjufqpjwzlsslpfg#wl#wkfwkf#`lmwf{w#le?psbm#`obpp>!swf{w!#mbnf>!r!\n\n?gju#`obpp>!wkf#p`jfmwjej`qfsqfpfmwfg#aznbwkfnbwj`jbmpfof`wfg#az#wkfwkbw#kbuf#affm=?gju#`obpp>!`gju#jg>!kfbgfqjm#sbqwj`vobq/`lmufqwfg#jmwl*8\t?,p`qjsw=\t?skjolplskj`bo#pqsphlkqubwphjwj\rVSmd#Uj\rWkw!kwws9,,!=?psbm#`obpp>!nfnafqp#le#wkf#tjmglt-ol`bwjlmufqwj`bo.bojdm9,b=##?b#kqfe>!?"gl`wzsf#kwno=nfgjb>!p`qffm!#?lswjlm#ubovf>!ebuj`lm-j`l!#,=\t\n\n?gju#`obpp>!`kbqb`wfqjpwj`p!#nfwklg>!dfw!#,algz=\t?,kwno=\tpklqw`vw#j`lm!#gl`vnfmw-tqjwf+sbggjmd.alwwln9qfsqfpfmwbwjufppvanjw!#ubovf>!bojdm>!`fmwfq!#wkqlvdklvw#wkf#p`jfm`f#ej`wjlm\t##?gju#`obpp>!pvanjw!#`obpp>!lmf#le#wkf#nlpw#ubojdm>!wls!=?tbp#fpwbaojpkfg*8\t?,p`qjsw=\tqfwvqm#ebopf8!=*-pwzof-gjpsobzaf`bvpf#le#wkf#gl`vnfmw-`llhjf?elqn#b`wjlm>!,~algzxnbqdjm938Fm`z`olsfgjb#leufqpjlm#le#wkf#-`qfbwfFofnfmw+mbnf!#`lmwfmw>!?,gju=\t?,gju=\t\tbgnjmjpwqbwjuf#?,algz=\t?,kwno=kjpwlqz#le#wkf#!=?jmsvw#wzsf>!slqwjlm#le#wkf#bp#sbqw#le#wkf#%maps8?b#kqfe>!lwkfq#`lvmwqjfp!=\t?gju#`obpp>!?,psbm=?,psbm=?Jm#lwkfq#tlqgp/gjpsobz9#aol`h8`lmwqlo#le#wkf#jmwqlgv`wjlm#le,=\t?nfwb#mbnf>!bp#tfoo#bp#wkf#jm#qf`fmw#zfbqp\t\n?gju#`obpp>!?,gju=\t\n?,gju=\tjmpsjqfg#az#wkfwkf#fmg#le#wkf#`lnsbwjaof#tjwkaf`bnf#hmltm#bp#pwzof>!nbqdjm9-ip!=?,p`qjsw=?#Jmwfqmbwjlmbo#wkfqf#kbuf#affmDfqnbm#obmdvbdf#pwzof>!`lolq9 @lnnvmjpw#Sbqwz`lmpjpwfmw#tjwkalqgfq>!3!#`foo#nbqdjmkfjdkw>!wkf#nbilqjwz#le!#bojdm>!`fmwfqqfobwfg#wl#wkf#nbmz#gjeefqfmw#Lqwklgl{#@kvq`kpjnjobq#wl#wkf#,=\t?ojmh#qfo>!ptbp#lmf#le#wkf#vmwjo#kjp#gfbwk~*+*8\t?,p`qjsw=lwkfq#obmdvbdfp`lnsbqfg#wl#wkfslqwjlmp#le#wkfwkf#Mfwkfqobmgpwkf#nlpw#`lnnlmab`hdqlvmg9vqo+bqdvfg#wkbw#wkfp`qloojmd>!ml!#jm`ovgfg#jm#wkfMlqwk#Bnfqj`bm#wkf#mbnf#le#wkfjmwfqsqfwbwjlmpwkf#wqbgjwjlmbogfufolsnfmw#le#eqfrvfmwoz#vpfgb#`loof`wjlm#leufqz#pjnjobq#wlpvqqlvmgjmd#wkff{bnsof#le#wkjpbojdm>!`fmwfq!=tlvog#kbuf#affmjnbdf\\`bswjlm#>bwwb`kfg#wl#wkfpvddfpwjmd#wkbwjm#wkf#elqn#le#jmuloufg#jm#wkfjp#gfqjufg#eqlnmbnfg#bewfq#wkfJmwqlgv`wjlm#wlqfpwqj`wjlmp#lm#pwzof>!tjgwk9#`bm#af#vpfg#wl#wkf#`qfbwjlm#lenlpw#jnslqwbmw#jmelqnbwjlm#bmgqfpvowfg#jm#wkf`loobspf#le#wkfWkjp#nfbmp#wkbwfofnfmwp#le#wkftbp#qfsob`fg#azbmbozpjp#le#wkfjmpsjqbwjlm#elqqfdbqgfg#bp#wkfnlpw#pv``fppevohmltm#bp#%rvlw8b#`lnsqfkfmpjufKjpwlqz#le#wkf#tfqf#`lmpjgfqfgqfwvqmfg#wl#wkfbqf#qfefqqfg#wlVmplvq`fg#jnbdf=\t\n?gju#`obpp>!`lmpjpwp#le#wkfpwlsSqlsbdbwjlmjmwfqfpw#jm#wkfbubjobajojwz#lebssfbqp#wl#kbuffof`wqlnbdmfwj`fmbaofPfquj`fp+evm`wjlm#le#wkfJw#jp#jnslqwbmw?,p`qjsw=?,gju=evm`wjlm+*xubq#qfobwjuf#wl#wkfbp#b#qfpvow#le#wkf#slpjwjlm#leElq#f{bnsof/#jm#nfwklg>!slpw!#tbp#elooltfg#az%bns8ngbpk8#wkfwkf#bssoj`bwjlmip!=?,p`qjsw=\tvo=?,gju=?,gju=bewfq#wkf#gfbwktjwk#qfpsf`w#wlpwzof>!sbggjmd9jp#sbqwj`vobqozgjpsobz9jmojmf8#wzsf>!pvanjw!#jp#gjujgfg#jmwl\bTA\nzk#+\vBl\bQ*qfpslmpbajojgbgbgnjmjpwqb`j/_mjmwfqmb`jlmbofp`lqqfpslmgjfmwf\fHe\fHF\fHC\fIg\fH{\fHF\fIn\fH\\\fIa\fHY\fHU\fHB\fHR\fH\\\fIk\fH^\fIg\fH{\fIg\fHn\fHv\fIm\fHD\fHR\fHY\fH^\fIk\fHy\fHS\fHD\fHT\fH\\\fHy\fHR\fH\\\fHF\fIm\fH^\fHS\fHT\fHz\fIg\fHp\fIk\fHn\fHv\fHR\fHU\fHS\fHc\fHA\fIk\fHp\fIk\fHn\fHZ\fHR\fHB\fHS\fH^\fHU\fHB\fHR\fH\\\fIl\fHp\fHR\fH{\fH\\\fHO\fH@\fHD\fHR\fHD\fIk\fHy\fIm\fHB\fHR\fH\\\fH@\fIa\fH^\fIe\fH{\fHB\fHR\fH^\fHS\fHy\fHB\fHU\fHS\fH^\fHR\fHF\fIo\fH[\fIa\fHL\fH@\fHN\fHP\fHH\fIk\fHA\fHR\fHp\fHF\fHR\fHy\fIa\fH^\fHS\fHy\fHs\fIa\fH\\\fIk\fHD\fHz\fHS\fH^\fHR\fHG\fHJ\fI`\fH\\\fHR\fHD\fHB\fHR\fHB\fH^\fIk\fHB\fHH\fHJ\fHR\fHD\fH@\fHR\fHp\fHR\fH\\\fHY\fHS\fHy\fHR\fHT\fHy\fIa\fHC\fIg\fHn\fHv\fHR\fHU\fHH\fIk\fHF\fHU\fIm\fHm\fHv\fH@\fHH\fHR\fHC\fHR\fHT\fHn\fHY\fHR\fHJ\fHJ\fIk\fHz\fHD\fIk\fHF\fHS\fHw\fH^\fIk\fHY\fHS\fHZ\fIk\fH[\fH\\\fHR\fHp\fIa\fHC\fHe\fHH\fIa\fHH\fH\\\fHB\fIm\fHn\fH@\fHd\fHJ\fIg\fHD\fIg\fHn\fHe\fHF\fHy\fH\\\fHO\fHF\fHN\fHP\fIk\fHn\fHT\fIa\fHI\fHS\fHH\fHG\fHS\fH^\fIa\fHB\fHB\fIm\fHz\fIa\fHC\fHi\fHv\fIa\fHw\fHR\fHw\fIn\fHs\fHH\fIl\fHT\fHn\fH{\fIl\fHH\fHp\fHR\fHc\fH{\fHR\fHY\fHS\fHA\fHR\fH{\fHt\fHO\fIa\fHs\fIk\fHJ\fIn\fHT\fH\\\fIk\fHJ\fHS\fHD\fIg\fHn\fHU\fHH\fIa\fHC\fHR\fHT\fIk\fHy\fIa\fHT\fH{\fHR\fHn\fHK\fIl\fHY\fHS\fHZ\fIa\fHY\fH\\\fHR\fHH\fIk\fHn\fHJ\fId\fHs\fIa\fHT\fHD\fHy\fIa\fHZ\fHR\fHT\fHR\fHB\fHD\fIk\fHi\fHJ\fHR\fH^\fHH\fH@\fHS\fHp\fH^\fIl\fHF\fIm\fH\\\fIn\fH[\fHU\fHS\fHn\fHJ\fIl\fHB\fHS\fHH\fIa\fH\\\fHy\fHY\fHS\fHH\fHR\fH\\\fIm\fHF\fHC\fIk\fHT\fIa\fHI\fHR\fHD\fHy\fH\\\fIg\fHM\fHP\fHB\fIm\fHy\fIa\fHH\fHC\fIg\fHp\fHD\fHR\fHy\fIo\fHF\fHC\fHR\fHF\fIg\fHT\fIa\fHs\fHt\fH\\\fIk\fH^\fIn\fHy\fHR\fH\\\fIa\fHC\fHY\fHS\fHv\fHR\fH\\\fHT\fIn\fHv\fHD\fHR\fHB\fIn\fH^\fIa\fHC\fHJ\fIk\fHz\fIk\fHn\fHU\fHB\fIk\fHZ\fHR\fHT\fIa\fHy\fIn\fH^\fHB\fId\fHn\fHD\fIk\fHH\fId\fHC\fHR\fH\\\fHp\fHS\fHT\fHy\fIkqpp({no!#wjwof>!.wzsf!#`lmwfmw>!wjwof!#`lmwfmw>!bw#wkf#pbnf#wjnf-ip!=?,p`qjsw=\t?!#nfwklg>!slpw!#?,psbm=?,b=?,oj=ufqwj`bo.bojdm9w,irvfqz-njm-ip!=-`oj`h+evm`wjlm+#pwzof>!sbggjmd.~*+*8\t?,p`qjsw=\t?,psbm=?b#kqfe>!?b#kqfe>!kwws9,,*8#qfwvqm#ebopf8wf{w.gf`lqbwjlm9#p`qloojmd>!ml!#alqgfq.`loobspf9bppl`jbwfg#tjwk#Abkbpb#JmglmfpjbFmdojpk#obmdvbdf?wf{w#{no9psb`f>-dje!#alqgfq>!3!?,algz=\t?,kwno=\tlufqeolt9kjggfm8jnd#pq`>!kwws9,,bggFufmwOjpwfmfqqfpslmpjaof#elq#p-ip!=?,p`qjsw=\t,ebuj`lm-j`l!#,=lsfqbwjmd#pzpwfn!#pwzof>!tjgwk92wbqdfw>!\\aobmh!=Pwbwf#Vmjufqpjwzwf{w.bojdm9ofew8\tgl`vnfmw-tqjwf+/#jm`ovgjmd#wkf#bqlvmg#wkf#tlqog*8\t?,p`qjsw=\t?!#pwzof>!kfjdkw98lufqeolt9kjggfmnlqf#jmelqnbwjlmbm#jmwfqmbwjlmbob#nfnafq#le#wkf#lmf#le#wkf#ejqpw`bm#af#elvmg#jm#?,gju=\t\n\n?,gju=\tgjpsobz9#mlmf8!=!#,=\t?ojmh#qfo>!\t##+evm`wjlm+*#xwkf#26wk#`fmwvqz-sqfufmwGfebvow+obqdf#mvnafq#le#Azybmwjmf#Fnsjqf-isdwkvnaofewubpw#nbilqjwz#lenbilqjwz#le#wkf##bojdm>!`fmwfq!=Vmjufqpjwz#Sqfppglnjmbwfg#az#wkfPf`lmg#Tlqog#Tbqgjpwqjavwjlm#le#pwzof>!slpjwjlm9wkf#qfpw#le#wkf#`kbqb`wfqjyfg#az#qfo>!mleloolt!=gfqjufp#eqln#wkfqbwkfq#wkbm#wkf#b#`lnajmbwjlm#lepwzof>!tjgwk9233Fmdojpk.psfbhjmd`lnsvwfq#p`jfm`falqgfq>!3!#bow>!wkf#f{jpwfm`f#leGfnl`qbwj`#Sbqwz!#pwzof>!nbqdjm.Elq#wkjp#qfbplm/-ip!=?,p`qjsw=\t\npAzWbdMbnf+p*X3^ip!=?,p`qjsw=\t?-ip!=?,p`qjsw=\tojmh#qfo>!j`lm!#$#bow>$$#`obpp>$elqnbwjlm#le#wkfufqpjlmp#le#wkf#?,b=?,gju=?,gju=,sbdf=\t##?sbdf=\t?gju#`obpp>!`lmwaf`bnf#wkf#ejqpwabkbpb#Jmglmfpjbfmdojpk#+pjnsof*"y"W"W"["Q"U"V"@=i=l<^<\\=n=m!?gju#jg>!ellwfq!=wkf#Vmjwfg#Pwbwfp?jnd#pq`>!kwws9,,-isdqjdkwwkvna-ip!=?,p`qjsw=\t?ol`bwjlm-sqlwl`loeqbnfalqgfq>!3!#p!#,=\t?nfwb#mbnf>!?,b=?,gju=?,gju=?elmw.tfjdkw9alog8%rvlw8#bmg#%rvlw8gfsfmgjmd#lm#wkf#nbqdjm938sbggjmd9!#qfo>!mleloolt!#Sqfpjgfmw#le#wkf#wtfmwjfwk#`fmwvqzfujpjlm=\t##?,sbdfJmwfqmfw#F{solqfqb-bpzm`#>#wqvf8\tjmelqnbwjlm#balvw?gju#jg>!kfbgfq!=!#b`wjlm>!kwws9,,?b#kqfe>!kwwsp9,,?gju#jg>!`lmwfmw!?,gju=\t?,gju=\t?gfqjufg#eqln#wkf#?jnd#pq`>$kwws9,,b``lqgjmd#wl#wkf#\t?,algz=\t?,kwno=\tpwzof>!elmw.pjyf9p`qjsw#obmdvbdf>!Bqjbo/#Kfoufwj`b/?,b=?psbm#`obpp>!?,p`qjsw=?p`qjsw#slojwj`bo#sbqwjfpwg=?,wq=?,wbaof=?kqfe>!kwws9,,ttt-jmwfqsqfwbwjlm#leqfo>!pwzofpkffw!#gl`vnfmw-tqjwf+$?`kbqpfw>!vwe.;!=\tafdjmmjmd#le#wkf#qfufbofg#wkbw#wkfwfofujpjlm#pfqjfp!#qfo>!mleloolt!=#wbqdfw>!\\aobmh!=`objnjmd#wkbw#wkfkwws&0B&1E&1Ettt-nbmjefpwbwjlmp#leSqjnf#Njmjpwfq#lejmeovfm`fg#az#wkf`obpp>!`ofbqej{!=,gju=\t?,gju=\t\twkqff.gjnfmpjlmbo@kvq`k#le#Fmdobmgle#Mlqwk#@bqlojmbprvbqf#hjolnfwqfp-bggFufmwOjpwfmfqgjpwjm`w#eqln#wkf`lnnlmoz#hmltm#bpSklmfwj`#Boskbafwgf`obqfg#wkbw#wkf`lmwqloofg#az#wkfAfmibnjm#Eqbmhojmqlof.sobzjmd#dbnfwkf#Vmjufqpjwz#lejm#Tfpwfqm#Fvqlsfsfqplmbo#`lnsvwfqSqlif`w#Dvwfmafqdqfdbqgofpp#le#wkfkbp#affm#sqlslpfgwldfwkfq#tjwk#wkf=?,oj=?oj#`obpp>!jm#plnf#`lvmwqjfpnjm-ip!=?,p`qjsw=le#wkf#slsvobwjlmleej`jbo#obmdvbdf?jnd#pq`>!jnbdfp,jgfmwjejfg#az#wkfmbwvqbo#qfplvq`fp`obppjej`bwjlm#le`bm#af#`lmpjgfqfgrvbmwvn#nf`kbmj`pMfufqwkfofpp/#wkfnjoojlm#zfbqp#bdl?,algz=\t?,kwno="y"W"W"["Q"U"V"@\twbhf#bgubmwbdf#lebmg/#b``lqgjmd#wlbwwqjavwfg#wl#wkfNj`qlplew#Tjmgltpwkf#ejqpw#`fmwvqzvmgfq#wkf#`lmwqlogju#`obpp>!kfbgfqpklqwoz#bewfq#wkfmlwbaof#f{`fswjlmwfmp#le#wklvpbmgppfufqbo#gjeefqfmwbqlvmg#wkf#tlqog-qfb`kjmd#njojwbqzjplobwfg#eqln#wkflsslpjwjlm#wl#wkfwkf#Log#WfpwbnfmwBeqj`bm#Bnfqj`bmpjmpfqwfg#jmwl#wkfpfsbqbwf#eqln#wkfnfwqlslojwbm#bqfbnbhfp#jw#slppjaofb`hmltofgdfg#wkbwbqdvbaoz#wkf#nlpwwzsf>!wf{w,`pp!=\twkf#JmwfqmbwjlmboB``lqgjmd#wl#wkf#sf>!wf{w,`pp!#,=\t`ljm`jgf#tjwk#wkfwtl.wkjqgp#le#wkfGvqjmd#wkjp#wjnf/gvqjmd#wkf#sfqjlgbmmlvm`fg#wkbw#kfwkf#jmwfqmbwjlmbobmg#nlqf#qf`fmwozafojfufg#wkbw#wkf`lmp`jlvpmfpp#bmgelqnfqoz#hmltm#bppvqqlvmgfg#az#wkfejqpw#bssfbqfg#jml``bpjlmbooz#vpfgslpjwjlm9baplovwf8!#wbqdfw>!\\aobmh!#slpjwjlm9qfobwjuf8wf{w.bojdm9`fmwfq8ib{,ojap,irvfqz,2-ab`hdqlvmg.`lolq9 wzsf>!bssoj`bwjlm,bmdvbdf!#`lmwfmw>!?nfwb#kwws.frvju>!Sqjub`z#Sloj`z?,b=f+!&0@p`qjsw#pq`>$!#wbqdfw>!\\aobmh!=Lm#wkf#lwkfq#kbmg/-isdwkvnaqjdkw1?,gju=?gju#`obpp>!?gju#pwzof>!eolbw9mjmfwffmwk#`fmwvqz?,algz=\t?,kwno=\t?jnd#pq`>!kwws9,,p8wf{w.bojdm9`fmwfqelmw.tfjdkw9#alog8#B``lqgjmd#wl#wkf#gjeefqfm`f#afwtffm!#eqbnfalqgfq>!3!#!#pwzof>!slpjwjlm9ojmh#kqfe>!kwws9,,kwno7,ollpf-gwg!=\tgvqjmd#wkjp#sfqjlg?,wg=?,wq=?,wbaof=`olpfoz#qfobwfg#wlelq#wkf#ejqpw#wjnf8elmw.tfjdkw9alog8jmsvw#wzsf>!wf{w!#?psbm#pwzof>!elmw.lmqfbgzpwbwf`kbmdf\n?gju#`obpp>!`ofbqgl`vnfmw-ol`bwjlm-#Elq#f{bnsof/#wkf#b#tjgf#ubqjfwz#le#?"GL@WZSF#kwno=\t?%maps8%maps8%maps8!=?b#kqfe>!kwws9,,pwzof>!eolbw9ofew8`lm`fqmfg#tjwk#wkf>kwws&0B&1E&1Ettt-jm#slsvobq#`vowvqfwzsf>!wf{w,`pp!#,=jw#jp#slppjaof#wl#Kbqubqg#Vmjufqpjwzwzofpkffw!#kqfe>!,wkf#nbjm#`kbqb`wfqL{elqg#Vmjufqpjwz##mbnf>!hfztlqgp!#`pwzof>!wf{w.bojdm9wkf#Vmjwfg#Hjmdglnefgfqbo#dlufqmnfmw?gju#pwzof>!nbqdjm#gfsfmgjmd#lm#wkf#gfp`qjswjlm#le#wkf?gju#`obpp>!kfbgfq-njm-ip!=?,p`qjsw=gfpwqv`wjlm#le#wkfpojdkwoz#gjeefqfmwjm#b``lqgbm`f#tjwkwfof`lnnvmj`bwjlmpjmgj`bwfp#wkbw#wkfpklqwoz#wkfqfbewfqfpsf`jbooz#jm#wkf#Fvqlsfbm#`lvmwqjfpKltfufq/#wkfqf#bqfpq`>!kwws9,,pwbwj`pvddfpwfg#wkbw#wkf!#pq`>!kwws9,,ttt-b#obqdf#mvnafq#le#Wfof`lnnvmj`bwjlmp!#qfo>!mleloolt!#wKloz#Qlnbm#Fnsfqlqbonlpw#f{`ovpjufoz!#alqgfq>!3!#bow>!Pf`qfwbqz#le#Pwbwf`vonjmbwjmd#jm#wkf@JB#Tlqog#Eb`wallhwkf#nlpw#jnslqwbmwbmmjufqpbqz#le#wkfpwzof>!ab`hdqlvmg.?oj=?fn=?b#kqfe>!,wkf#Bwobmwj`#L`fbmpwqj`woz#psfbhjmd/pklqwoz#afelqf#wkfgjeefqfmw#wzsfp#lewkf#Lwwlnbm#Fnsjqf=?jnd#pq`>!kwws9,,Bm#Jmwqlgv`wjlm#wl`lmpfrvfm`f#le#wkfgfsbqwvqf#eqln#wkf@lmefgfqbwf#Pwbwfpjmgjdfmlvp#sflsofpSql`ffgjmdp#le#wkfjmelqnbwjlm#lm#wkfwkflqjfp#kbuf#affmjmuloufnfmw#jm#wkfgjujgfg#jmwl#wkqffbgib`fmw#`lvmwqjfpjp#qfpslmpjaof#elqgjpplovwjlm#le#wkf`loobalqbwjlm#tjwktjgfoz#qfdbqgfg#bpkjp#`lmwfnslqbqjfpelvmgjmd#nfnafq#leGlnjmj`bm#Qfsvaoj`dfmfqbooz#b``fswfgwkf#slppjajojwz#lebqf#bopl#bubjobaofvmgfq#`lmpwqv`wjlmqfpwlqbwjlm#le#wkfwkf#dfmfqbo#svaoj`jp#bonlpw#fmwjqfozsbppfp#wkqlvdk#wkfkbp#affm#pvddfpwfg`lnsvwfq#bmg#ujgflDfqnbmj`#obmdvbdfp#b``lqgjmd#wl#wkf#gjeefqfmw#eqln#wkfpklqwoz#bewfqtbqgpkqfe>!kwwsp9,,ttt-qf`fmw#gfufolsnfmwAlbqg#le#Gjqf`wlqp?gju#`obpp>!pfbq`k#?b#kqfe>!kwws9,,Jm#sbqwj`vobq/#wkfNvowjsof#ellwmlwfplq#lwkfq#pvapwbm`fwklvpbmgp#le#zfbqpwqbmpobwjlm#le#wkf?,gju=\t?,gju=\t\t?b#kqfe>!jmgf{-skstbp#fpwbaojpkfg#jmnjm-ip!=?,p`qjsw=\tsbqwj`jsbwf#jm#wkfb#pwqlmd#jmeovfm`fpwzof>!nbqdjm.wls9qfsqfpfmwfg#az#wkfdqbgvbwfg#eqln#wkfWqbgjwjlmbooz/#wkfFofnfmw+!p`qjsw!*8Kltfufq/#pjm`f#wkf,gju=\t?,gju=\t?gju#ofew8#nbqdjm.ofew9sqlwf`wjlm#bdbjmpw38#ufqwj`bo.bojdm9Vmelqwvmbwfoz/#wkfwzsf>!jnbdf,{.j`lm,gju=\t?gju#`obpp>!#`obpp>!`ofbqej{!=?gju#`obpp>!ellwfq\n\n?,gju=\t\n\n?,gju=\twkf#nlwjlm#sj`wvqf<}=f!t0-lqd,2:::,{kwno!=?b#wbqdfw>!\\aobmh!#wf{w,kwno8#`kbqpfw>!#wbqdfw>!\\aobmh!=?wbaof#`foosbggjmd>!bvwl`lnsofwf>!lee!#wf{w.bojdm9#`fmwfq8wl#obpw#ufqpjlm#az#ab`hdqlvmg.`lolq9# !#kqfe>!kwws9,,ttt-,gju=?,gju=?gju#jg>?b#kqfe>! !#`obpp>!!=?jnd#pq`>!kwws9,,`qjsw!#pq`>!kwws9,,\t?p`qjsw#obmdvbdf>!,,FM!#!kwws9,,ttt-tfm`lgfVQJ@lnslmfmw+!#kqfe>!ibubp`qjsw9?gju#`obpp>!`lmwfmwgl`vnfmw-tqjwf+$?p`slpjwjlm9#baplovwf8p`qjsw#pq`>!kwws9,,#pwzof>!nbqdjm.wls9-njm-ip!=?,p`qjsw=\t?,gju=\t?gju#`obpp>!t0-lqd,2:::,{kwno!#\t\t?,algz=\t?,kwno=gjpwjm`wjlm#afwtffm,!#wbqdfw>!\\aobmh!=?ojmh#kqfe>!kwws9,,fm`lgjmd>!vwe.;!<=\tt-bggFufmwOjpwfmfq!kwws9,,ttt-j`lm!#kqfe>!kwws9,,#pwzof>!ab`hdqlvmg9wzsf>!wf{w,`pp!#,=\tnfwb#sqlsfqwz>!ld9w?jmsvw#wzsf>!wf{w!##pwzof>!wf{w.bojdm9wkf#gfufolsnfmw#le#wzofpkffw!#wzsf>!wfkwno8#`kbqpfw>vwe.;jp#`lmpjgfqfg#wl#afwbaof#tjgwk>!233&!#Jm#bggjwjlm#wl#wkf#`lmwqjavwfg#wl#wkf#gjeefqfm`fp#afwtffmgfufolsnfmw#le#wkf#Jw#jp#jnslqwbmw#wl#?,p`qjsw=\t\t?p`qjsw##pwzof>!elmw.pjyf92=?,psbm=?psbm#jg>daOjaqbqz#le#@lmdqfpp?jnd#pq`>!kwws9,,jnFmdojpk#wqbmpobwjlmB`bgfnz#le#P`jfm`fpgju#pwzof>!gjpsobz9`lmpwqv`wjlm#le#wkf-dfwFofnfmwAzJg+jg*jm#`lmivm`wjlm#tjwkFofnfmw+$p`qjsw$*8#?nfwb#sqlsfqwz>!ld9<}=f!wf{w!#mbnf>!=Sqjub`z#Sloj`z?,b=bgnjmjpwfqfg#az#wkffmbaofPjmdofQfrvfpwpwzof>%rvlw8nbqdjm9?,gju=?,gju=?,gju=?=?jnd#pq`>!kwws9,,j#pwzof>%rvlw8eolbw9qfefqqfg#wl#bp#wkf#wlwbo#slsvobwjlm#lejm#Tbpkjmdwlm/#G-@-#pwzof>!ab`hdqlvmg.bnlmd#lwkfq#wkjmdp/lqdbmjybwjlm#le#wkfsbqwj`jsbwfg#jm#wkfwkf#jmwqlgv`wjlm#lejgfmwjejfg#tjwk#wkfej`wjlmbo#`kbqb`wfq#L{elqg#Vmjufqpjwz#njpvmgfqpwbmgjmd#leWkfqf#bqf/#kltfufq/pwzofpkffw!#kqfe>!,@lovnajb#Vmjufqpjwzf{sbmgfg#wl#jm`ovgfvpvbooz#qfefqqfg#wljmgj`bwjmd#wkbw#wkfkbuf#pvddfpwfg#wkbwbeejojbwfg#tjwk#wkf`lqqfobwjlm#afwtffmmvnafq#le#gjeefqfmw=?,wg=?,wq=?,wbaof=Qfsvaoj`#le#Jqfobmg\t?,p`qjsw=\t?p`qjsw#vmgfq#wkf#jmeovfm`f`lmwqjavwjlm#wl#wkfLeej`jbo#tfapjwf#lekfbgrvbqwfqp#le#wkf`fmwfqfg#bqlvmg#wkfjnsoj`bwjlmp#le#wkfkbuf#affm#gfufolsfgEfgfqbo#Qfsvaoj`#leaf`bnf#jm`qfbpjmdoz`lmwjmvbwjlm#le#wkfMlwf/#kltfufq/#wkbwpjnjobq#wl#wkbw#le#`bsbajojwjfp#le#wkfb``lqgbm`f#tjwk#wkfsbqwj`jsbmwp#jm#wkfevqwkfq#gfufolsnfmwvmgfq#wkf#gjqf`wjlmjp#lewfm#`lmpjgfqfgkjp#zlvmdfq#aqlwkfq?,wg=?,wq=?,wbaof=?b#kwws.frvju>![.VB.skzpj`bo#sqlsfqwjfple#Aqjwjpk#@lovnajbkbp#affm#`qjwj`jyfg+tjwk#wkf#f{`fswjlmrvfpwjlmp#balvw#wkfsbppjmd#wkqlvdk#wkf3!#`foosbggjmd>!3!#wklvpbmgp#le#sflsofqfgjqf`wp#kfqf-#Elqkbuf#`kjogqfm#vmgfq&0F&0@,p`qjsw&0F!**8?b#kqfe>!kwws9,,ttt-?oj=?b#kqfe>!kwws9,,pjwf\\mbnf!#`lmwfmw>!wf{w.gf`lqbwjlm9mlmfpwzof>!gjpsobz9#mlmf?nfwb#kwws.frvju>![.mft#Gbwf+*-dfwWjnf+*#wzsf>!jnbdf,{.j`lm!?,psbm=?psbm#`obpp>!obmdvbdf>!ibubp`qjswtjmglt-ol`bwjlm-kqfe?b#kqfe>!ibubp`qjsw9..=\t?p`qjsw#wzsf>!w?b#kqfe>$kwws9,,ttt-klqw`vw#j`lm!#kqfe>!?,gju=\t?gju#`obpp>!?p`qjsw#pq`>!kwws9,,!#qfo>!pwzofpkffw!#w?,gju=\t?p`qjsw#wzsf>,b=#?b#kqfe>!kwws9,,#booltWqbmpsbqfm`z>![.VB.@lnsbwjaof!#`lmqfobwjlmpkjs#afwtffm\t?,p`qjsw=\t?p`qjsw#?,b=?,oj=?,vo=?,gju=bppl`jbwfg#tjwk#wkf#sqldqbnnjmd#obmdvbdf?,b=?b#kqfe>!kwws9,,?,b=?,oj=?oj#`obpp>!elqn#b`wjlm>!kwws9,,?gju#pwzof>!gjpsobz9wzsf>!wf{w!#mbnf>!r!?wbaof#tjgwk>!233&!#ab`hdqlvmg.slpjwjlm9!#alqgfq>!3!#tjgwk>!qfo>!pklqw`vw#j`lm!#k5=?vo=?oj=?b#kqfe>!##?nfwb#kwws.frvju>!`pp!#nfgjb>!p`qffm!#qfpslmpjaof#elq#wkf#!#wzsf>!bssoj`bwjlm,!#pwzof>!ab`hdqlvmg.kwno8#`kbqpfw>vwe.;!#booltwqbmpsbqfm`z>!pwzofpkffw!#wzsf>!wf\t?nfwb#kwws.frvju>!=?,psbm=?psbm#`obpp>!3!#`foopsb`jmd>!3!=8\t?,p`qjsw=\t?p`qjsw#plnfwjnfp#`boofg#wkfglfp#mlw#mf`fppbqjozElq#nlqf#jmelqnbwjlmbw#wkf#afdjmmjmd#le#?"GL@WZSF#kwno=?kwnosbqwj`vobqoz#jm#wkf#wzsf>!kjggfm!#mbnf>!ibubp`qjsw9uljg+3*8!feef`wjufmfpp#le#wkf#bvwl`lnsofwf>!lee!#dfmfqbooz#`lmpjgfqfg=?jmsvw#wzsf>!wf{w!#!=?,p`qjsw=\t?p`qjswwkqlvdklvw#wkf#tlqog`lnnlm#njp`lm`fswjlmbppl`jbwjlm#tjwk#wkf?,gju=\t?,gju=\t?gju#`gvqjmd#kjp#ojefwjnf/`lqqfpslmgjmd#wl#wkfwzsf>!jnbdf,{.j`lm!#bm#jm`qfbpjmd#mvnafqgjsolnbwj`#qfobwjlmpbqf#lewfm#`lmpjgfqfgnfwb#`kbqpfw>!vwe.;!#?jmsvw#wzsf>!wf{w!#f{bnsofp#jm`ovgf#wkf!=?jnd#pq`>!kwws9,,jsbqwj`jsbwjlm#jm#wkfwkf#fpwbaojpknfmw#le\t?,gju=\t?gju#`obpp>!%bns8maps8%bns8maps8wl#gfwfqnjmf#tkfwkfqrvjwf#gjeefqfmw#eqlnnbqhfg#wkf#afdjmmjmdgjpwbm`f#afwtffm#wkf`lmwqjavwjlmp#wl#wkf`lmeoj`w#afwtffm#wkftjgfoz#`lmpjgfqfg#wltbp#lmf#le#wkf#ejqpwtjwk#ubqzjmd#gfdqffpkbuf#psf`vobwfg#wkbw+gl`vnfmw-dfwFofnfmwsbqwj`jsbwjmd#jm#wkflqjdjmbooz#gfufolsfgfwb#`kbqpfw>!vwe.;!=#wzsf>!wf{w,`pp!#,=\tjmwfq`kbmdfbaoz#tjwknlqf#`olpfoz#qfobwfgpl`jbo#bmg#slojwj`bowkbw#tlvog#lwkfqtjpfsfqsfmgj`vobq#wl#wkfpwzof#wzsf>!wf{w,`ppwzsf>!pvanjw!#mbnf>!ebnjojfp#qfpjgjmd#jmgfufolsjmd#`lvmwqjfp`lnsvwfq#sqldqbnnjmdf`lmlnj`#gfufolsnfmwgfwfqnjmbwjlm#le#wkfelq#nlqf#jmelqnbwjlmlm#pfufqbo#l``bpjlmpslqwvdv/Fp#+Fvqlsfv*VWE.;!#pfwWjnflvw+evm`wjlm+*gjpsobz9jmojmf.aol`h8?jmsvw#wzsf>!pvanjw!#wzsf#>#$wf{w,ibubp`qj?jnd#pq`>!kwws9,,ttt-!#!kwws9,,ttt-t0-lqd,pklqw`vw#j`lm!#kqfe>!!#bvwl`lnsofwf>!lee!#?,b=?,gju=?gju#`obpp>?,b=?,oj=\t?oj#`obpp>!`pp!#wzsf>!wf{w,`pp!#?elqn#b`wjlm>!kwws9,,{w,`pp!#kqfe>!kwws9,,ojmh#qfo>!bowfqmbwf!#\t?p`qjsw#wzsf>!wf{w,#lm`oj`h>!ibubp`qjsw9+mft#Gbwf*-dfwWjnf+*~kfjdkw>!2!#tjgwk>!2!#Sflsof$p#Qfsvaoj`#le##?b#kqfe>!kwws9,,ttt-wf{w.gf`lqbwjlm9vmgfqwkf#afdjmmjmd#le#wkf#?,gju=\t?,gju=\t?,gju=\tfpwbaojpknfmw#le#wkf#?,gju=?,gju=?,gju=?,g ujftslqwxnjm.kfjdkw9\t?p`qjsw#pq`>!kwws9,,lswjlm=?lswjlm#ubovf>lewfm#qfefqqfg#wl#bp#,lswjlm=\t?lswjlm#ubov?"GL@WZSF#kwno=\t?"..XJmwfqmbwjlmbo#Bjqslqw=\t?b#kqfe>!kwws9,,ttt?,b=?b#kqfe>!kwws9,,t\fTL\fT^\fTE\fT^\fUh\fT{\fTN\roI\ro|\roL\ro{\roO\rov\rot\nAOGx\bTA\nzk#+\vUmGx*\fHD\fHS\fH\\\fIa\fHJ\fIk\fHZ\fHM\fHR\fHe\fHD\fH^\fIg\fHM\fHy\fIa\fH[\fIk\fHH\fIa\fH\\\fHp\fHR\fHD\fHy\fHR\fH\\\fIl\fHT\fHn\fH@\fHn\fHK\fHS\fHH\fHT\fIa\fHI\fHR\fHF\fHD\fHR\fHT\fIa\fHY\fIl\fHy\fHR\fH\\\fHT\fHn\fHT\fIa\fHy\fH\\\fHO\fHT\fHR\fHB\fH{\fIa\fH\\\fIl\fHv\fHS\fHs\fIa\fHL\fIg\fHn\fHY\fHS\fHp\fIa\fHr\fHR\fHD\fHi\fHB\fIk\fH\\\fHS\fHy\fHR\fHY\fHS\fHA\fHS\fHD\fIa\fHD\fH{\fHR\fHM\fHS\fHC\fHR\fHm\fHy\fIa\fHC\fIg\fHn\fHy\fHS\fHT\fIm\fH\\\fHy\fIa\fH[\fHR\fHF\fHU\fIm\fHm\fHv\fHH\fIl\fHF\fIa\fH\\\fH@\fHn\fHK\fHD\fHs\fHS\fHF\fIa\fHF\fHO\fIl\fHy\fIa\fH\\\fHS\fHy\fIk\fHs\fHF\fIa\fH\\\fHR\fH\\\fHn\fHA\fHF\fIa\fH\\\fHR\fHF\fIa\fHH\fHB\fHR\fH^\fHS\fHy\fIg\fHn\fH\\\fHG\fHP\fIa\fHH\fHR\fH\\\fHD\fHS\fH\\\fIa\fHB\fHR\fHO\fH^\fHS\fHB\fHS\fHs\fIk\fHMgfp`qjswjlm!#`lmwfmw>!gl`vnfmw-ol`bwjlm-sqlw-dfwFofnfmwpAzWbdMbnf+?"GL@WZSF#kwno=\t?kwno#?nfwb#`kbqpfw>!vwe.;!=9vqo!#`lmwfmw>!kwws9,,-`pp!#qfo>!pwzofpkffw!pwzof#wzsf>!wf{w,`pp!=wzsf>!wf{w,`pp!#kqfe>!t0-lqd,2:::,{kwno!#{nowzsf>!wf{w,ibubp`qjsw!#nfwklg>!dfw!#b`wjlm>!ojmh#qfo>!pwzofpkffw!##>#gl`vnfmw-dfwFofnfmwwzsf>!jnbdf,{.j`lm!#,=`foosbggjmd>!3!#`foops-`pp!#wzsf>!wf{w,`pp!#?,b=?,oj=?oj=?b#kqfe>!!#tjgwk>!2!#kfjdkw>!2!!=?b#kqfe>!kwws9,,ttt-pwzof>!gjpsobz9mlmf8!=bowfqmbwf!#wzsf>!bssoj.,,T0@,,GWG#[KWNO#2-3#foopsb`jmd>!3!#`foosbg#wzsf>!kjggfm!#ubovf>!,b=%maps8?psbm#qlof>!p\t?jmsvw#wzsf>!kjggfm!#obmdvbdf>!IbubP`qjsw!##gl`vnfmw-dfwFofnfmwpAd>!3!#`foopsb`jmd>!3!#zsf>!wf{w,`pp!#nfgjb>!wzsf>$wf{w,ibubp`qjsw$tjwk#wkf#f{`fswjlm#le#zsf>!wf{w,`pp!#qfo>!pw#kfjdkw>!2!#tjgwk>!2!#>$(fm`lgfVQJ@lnslmfmw+?ojmh#qfo>!bowfqmbwf!#\talgz/#wq/#jmsvw/#wf{wnfwb#mbnf>!qlalwp!#`lmnfwklg>!slpw!#b`wjlm>!=\t?b#kqfe>!kwws9,,ttt-`pp!#qfo>!pwzofpkffw!#?,gju=?,gju=?gju#`obppobmdvbdf>!ibubp`qjsw!=bqjb.kjggfm>!wqvf!=.[?qjsw!#wzsf>!wf{w,ibubpo>38~*+*8\t+evm`wjlm+*xab`hdqlvmg.jnbdf9#vqo+,b=?,oj=?oj=?b#kqfe>!k\n\n?oj=?b#kqfe>!kwws9,,bwlq!#bqjb.kjggfm>!wqv=#?b#kqfe>!kwws9,,ttt-obmdvbdf>!ibubp`qjsw!#,lswjlm=\t?lswjlm#ubovf,gju=?,gju=?gju#`obpp>qbwlq!#bqjb.kjggfm>!wqf>+mft#Gbwf*-dfwWjnf+*slqwvdv/Fp#+gl#Aqbpjo*!wf{w,?nfwb#kwws.frvju>!@lmwfqbmpjwjlmbo,,FM!#!kwws9?kwno#{nomp>!kwws9,,ttt.,,T0@,,GWG#[KWNO#2-3#WGWG,{kwno2.wqbmpjwjlmbo,,ttt-t0-lqd,WQ,{kwno2,sf#>#$wf{w,ibubp`qjsw$8?nfwb#mbnf>!gfp`qjswjlmsbqfmwMlgf-jmpfqwAfelqf?jmsvw#wzsf>!kjggfm!#mbip!#wzsf>!wf{w,ibubp`qj+gl`vnfmw*-qfbgz+evm`wjp`qjsw#wzsf>!wf{w,ibubpjnbdf!#`lmwfmw>!kwws9,,VB.@lnsbwjaof!#`lmwfmw>wno8#`kbqpfw>vwe.;!#,=\tojmh#qfo>!pklqw`vw#j`lm?ojmh#qfo>!pwzofpkffw!#?,p`qjsw=\t?p`qjsw#wzsf>>#gl`vnfmw-`qfbwfFofnfm?b#wbqdfw>!\\aobmh!#kqfe>#gl`vnfmw-dfwFofnfmwpAjmsvw#wzsf>!wf{w!#mbnf>b-wzsf#>#$wf{w,ibubp`qjmsvw#wzsf>!kjggfm!#mbnfkwno8#`kbqpfw>vwe.;!#,=gwg!=\t?kwno#{nomp>!kwws.,,T0@,,GWG#KWNO#7-32#WfmwpAzWbdMbnf+$p`qjsw$*jmsvw#wzsf>!kjggfm!#mbn?p`qjsw#wzsf>!wf{w,ibubp!#pwzof>!gjpsobz9mlmf8!=gl`vnfmw-dfwFofnfmwAzJg+>gl`vnfmw-`qfbwfFofnfmw+$#wzsf>$wf{w,ibubp`qjsw$jmsvw#wzsf>!wf{w!#mbnf>!g-dfwFofnfmwpAzWbdMbnf+pmj`bo!#kqfe>!kwws9,,ttt-@,,GWG#KWNO#7-32#Wqbmpjw?pwzof#wzsf>!wf{w,`pp!=\t\t?pwzof#wzsf>!wf{w,`pp!=jlmbo-gwg!=\t?kwno#{nomp>kwws.frvju>!@lmwfmw.Wzsfgjmd>!3!#`foopsb`jmd>!3!kwno8#`kbqpfw>vwe.;!#,=\t#pwzof>!gjpsobz9mlmf8!=??oj=?b#kqfe>!kwws9,,ttt-#wzsf>$wf{w,ibubp`qjsw$=&*&'&^&ˆŸా&ƭ&ƒ&)&^&%&'&‚&P&1&±&3&]&m&u&E&t&C&Ï&V&V&/&>&6&ྲྀ᝼o&p&@&E&M&P&x&@&F&e&Ì&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1ɞ*Ϫ⇳&፲&K&;&)&E&H&P&0&?&9&V&&-&v&a&,&E&)&?&=&'&'&B&മ&ԃ&̖*&*8&%&%&&&%,)&š&>&†&7&]&F&2&>&J&6&n&2&%&?&Ž&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%Լ„(,(<&,&Ϛ&ᣇ&-&,(%&(&%&(Ļ0&X&D&&j&'&J&(&.&B&3&Z&R&h&3&E&E&<Æ-͠ỳ&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&Cܬ⨥&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&ṸÌ-&7&1&F&7&t&W&7&I&.&.&^&=ྜ᧓&8(>&/&/&ݻ')'ၥ')'%@/&0&%оী*&*@&CԽהɴ׫4෗ܚӑ6඄&/Ÿ̃Z&*%ɆϿ&Ĵ&1¨ҴŴ",g,"AAAAKKLLKKKKKJJIHHIHHGGFF");!function setData(e,t){const a=m,n=p;for(let e=0;e=0)return t;e.runningState>=0&&(e.runningState=t);throw new Error("Brotli error code: "+t)}return function decode(e,t){let a=new State;a.input=new InputStream(e);initState(a);if(t){let e=t.customDictionary;e&&function attachDictionaryChunk(e,t){if(1!==e.runningState)return makeError(e,-24);if(0===e.cdNumChunks){e.cdChunks=new Array(16);e.cdChunkOffsets=new Int32Array(16);e.cdBlockBits=-1}if(15===e.cdNumChunks)return makeError(e,-27);e.cdChunks[e.cdNumChunks]=t;e.cdNumChunks++;e.cdTotalSize+=t.length;e.cdChunkOffsets[e.cdNumChunks]=e.cdTotalSize;return 0}(a,e)}let n=0,s=[];for(;;){let e=new Int8Array(16384);s.push(e);a.output=e;a.outputOffset=0;a.outputLength=16384;a.outputUsed=0;decompress(a);n+=a.outputUsed;if(a.outputUsed<16384)break}!function close(e){if(0===e.runningState)return makeError(e,-25);e.runningState>0&&(e.runningState=11);return 0}(a);!function closeInput(e){e.input=new InputStream(new Int8Array(0))}(a);let r=new Int8Array(n),i=0;for(let e=0;e>e;this.codeSize=n-=e;return a}getCode(e){const t=this.stream,a=e[0],n=e[1];let s,r=this.codeSize,i=this.codeBuf;for(;r>16,f=65535&o;if(l<1||r>l;this.codeSize=r-l;return f}generateHuffmanTable(e){const t=e.length;let a,n=0;for(a=0;an&&(n=e[a]);const s=1<>=1}for(a=e;a>=1;if(0===t){let t;if(-1===(t=n.getByte())){this.#K("Bad block header in flate stream");return}let a=t;if(-1===(t=n.getByte())){this.#K("Bad block header in flate stream");return}a|=t<<8;if(-1===(t=n.getByte())){this.#K("Bad block header in flate stream");return}let s=t;if(-1===(t=n.getByte())){this.#K("Bad block header in flate stream");return}s|=t<<8;if(s!==(65535&~a)&&(0!==a||0!==s))throw new FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;const r=this.bufferLength,i=r+a;e=this.ensureBuffer(i);this.bufferLength=i;if(0===a)-1===n.peekByte()&&(this.eof=!0);else{const t=n.getBytes(a);e.set(t,r);t.length0;)c[o++]=m}s=this.generateHuffmanTable(c.subarray(0,e));r=this.generateHuffmanTable(c.subarray(e,f))}}e=this.buffer;let i=e?e.length:0,o=this.bufferLength;for(;;){let t=this.getCode(s);if(t<256){if(o+1>=i){e=this.ensureBuffer(o+1);i=e.length}e[o++]=t;continue}if(256===t){this.bufferLength=o;return}t-=257;t=Qa[t];let n=t>>16;n>0&&(n=this.getBits(n));a=(65535&t)+n;t=this.getCode(r);t=Za[t];n=t>>16;n>0&&(n=this.getBits(n));const l=(65535&t)+n;if(o+a>=i){e=this.ensureBuffer(o+a);i=e.length}for(let t=0;t>>t&(1<0;if(e<256){u[0]=e;m=1}else{if(!(e>=258)){if(256===e){c=9;i=258;m=0;continue}this.eof=!0;delete this.lzwState;break}if(e=0;t--){u[t]=o[a];a=f[a]}}else u[m++]=u[0]}if(s){f[i]=h;l[i]=l[h]+1;o[i]=u[0];i++;c=i+r&i+r-1?c:0|Math.min(Math.log(i+r)/.6931471805599453+1,12)}h=e;p+=m;if(n15))throw new FormatError(`Unsupported predictor: ${n}`);this.readBlock=2===n?this.readBlockTiff:this.readBlockPng;this.stream=e;this.dict=e.dict;const s=this.colors=a.get("Colors")||1,r=this.bits=a.get("BPC","BitsPerComponent")||8,i=this.columns=a.get("Columns")||1;this.pixBytes=s*r+7>>3;this.rowBytes=i*s*r+7>>3;return this}readBlockTiff(){const e=this.rowBytes,t=this.bufferLength,a=this.ensureBuffer(t+e),n=this.bits,s=this.colors,r=this.stream.getBytes(e);this.eof=!r.length;if(this.eof)return;let i,o=0,l=0,f=0,c=0,h=t;if(1===n&&1===s)for(i=0;i>1;e^=e>>2;e^=e>>4;o=(1&e)<<7;a[h++]=e}else if(8===n){for(i=0;i>8&255;a[h++]=255&e}}else{const e=new Uint8Array(s+1),h=(1<>f-n)&h;f-=n;l=l<=8){a[m++]=l>>c-8&255;c-=8}}c>0&&(a[m++]=(l<<8-c)+(o&(1<<8-c)-1))}this.bufferLength+=e}readBlockPng(){const e=this.rowBytes,t=this.pixBytes,a=this.stream.getByte(),n=this.stream.getBytes(e);this.eof=!n.length;if(this.eof)return;const s=this.bufferLength,r=this.ensureBuffer(s+e);let i=r.subarray(s-e,s);0===i.length&&(i=new Uint8Array(e));let o,l,f,c=s;switch(a){case 0:for(o=0;o>1)+n[o];for(;o>1)+n[o]&255;c++}break;case 4:for(o=0;o0){const e=this.stream.getBytes(n);t.set(e,a);a+=n}}else{n=257-n;t=this.ensureBuffer(a+n+1);t.fill(e[1],a,a+n);a+=n}this.bufferLength=a}}class Parser{constructor({lexer:e,xref:t,allowStreams:a=!1,recoveryMode:n=!1}){this.lexer=e;this.xref=t;this.allowStreams=a;this.recoveryMode=n;this.imageCache=Object.create(null);this._imageId=0;this.refill()}refill(){this.buf1=this.lexer.getObj();this.buf2=this.lexer.getObj()}shift(){if(this.buf2 instanceof Cmd&&"ID"===this.buf2.cmd){this.buf1=this.buf2;this.buf2=null}else{this.buf1=this.buf2;this.buf2=this.lexer.getObj()}}tryShift(){try{this.shift();return!0}catch(e){if(e instanceof MissingDataException)throw e;return!1}}getObj(e=null){const t=this.buf1;this.shift();if(t instanceof Cmd)switch(t.cmd){case"BI":return this.makeInlineImage(e);case"[":const a=[];for(;!isCmd(this.buf1,"]")&&this.buf1!==oa;)a.push(this.getObj(e));if(this.buf1===oa){if(this.recoveryMode)return a;throw new ParserEOFException("End of file inside array.")}this.shift();return a;case"<<":const n=new Dict(this.xref);for(;!isCmd(this.buf1,">>")&&this.buf1!==oa;){if(!(this.buf1 instanceof Name)){info("Malformed dictionary: key must be a name object");this.shift();continue}const t=this.buf1.name;this.shift();if(this.buf1===oa)break;n.set(t,this.getObj(e))}if(this.buf1===oa){if(this.recoveryMode)return n;throw new ParserEOFException("End of file inside dictionary.")}if(isCmd(this.buf2,"stream"))return this.allowStreams?this.makeStream(n,e):n;this.shift();return n;default:return t}if(Number.isInteger(t)){if(Number.isInteger(this.buf1)&&isCmd(this.buf2,"R")){const e=Ref.get(t,this.buf1);this.shift();this.shift();return e}return t}return"string"==typeof t&&e?e.decryptString(t):t}findDefaultInlineStreamEnd(e){const{knownCommands:t}=this.lexer,a=e.pos;let n,s,r=0;for(;-1!==(n=e.getByte());)if(0===r)r=69===n?1:0;else if(1===r)r=73===n?2:0;else if(32===n||10===n||13===n){s=e.pos;const a=e.peekBytes(15),i=a.length;if(0===i)break;for(let e=0;e127))){r=0;break}}if(2!==r)continue;if(!t){warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");continue}const o=new Lexer(new Stream(e.peekBytes(75)),t);o._hexStringWarn=()=>{};let l=0;for(;;){const e=o.getObj();if(e===oa){r=0;break}if(e instanceof Cmd){const a=t[e.cmd];if(!a){r=0;break}if(a.variableArgs?l<=a.numArgs:l===a.numArgs)break;l=0;continue}l++}if(2===r)break}else r=0;if(-1===n){warn("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(s){warn('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-s))}}let i=4;e.skip(-i);n=e.peekByte();e.skip(i);isWhiteSpace(n)||i--;return e.pos-i-a}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let a,n,s=!1;for(;-1!==(a=e.getByte());)if(255===a){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:s=!0;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:n=e.getUint16();n>2?e.skip(n-2):e.skip(-2)}if(s)break}const r=e.pos-t;if(-1===a){warn("Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.");e.skip(-r);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return r}findASCII85DecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte());)if(126===a){const t=e.pos;a=e.peekByte();for(;isWhiteSpace(a);){e.skip();a=e.peekByte()}if(62===a){e.skip();break}if(e.pos>t){const t=e.peekBytes(2);if(69===t[0]&&73===t[1])break}}const n=e.pos-t;if(-1===a){warn("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte())&&62!==a;);const n=e.pos-t;if(-1===a){warn("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}inlineStreamSkipEI(e){let t,a=0;for(;-1!==(t=e.getByte());)if(0===a)a=69===t?1:0;else if(1===a)a=73===t?2:0;else if(2===a)break}makeInlineImage(e){const t=this.lexer,a=t.stream,n=Object.create(null);let s;for(;!isCmd(this.buf1,"ID")&&this.buf1!==oa;){if(!(this.buf1 instanceof Name))throw new FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===oa)break;n[t]=this.getObj(e)}-1!==t.beginInlineImagePos&&(s=a.pos-t.beginInlineImagePos);const r=this.xref.fetchIfRef(n.F||n.Filter);let i;if(r instanceof Name)i=r.name;else if(Array.isArray(r)){const e=this.xref.fetchIfRef(r[0]);e instanceof Name&&(i=e.name)}const o=a.pos;let l,f;switch(i){case"DCT":case"DCTDecode":l=this.findDCTDecodeInlineStreamEnd(a);break;case"A85":case"ASCII85Decode":l=this.findASCII85DecodeInlineStreamEnd(a);break;case"AHx":case"ASCIIHexDecode":l=this.findASCIIHexDecodeInlineStreamEnd(a);break;default:l=this.findDefaultInlineStreamEnd(a)}if(l<1e3&&s>0){const e=a.pos;a.pos=t.beginInlineImagePos;f=function getInlineImageCacheKey(e){const t=[],a=e.length;let n=0;for(;n=n){let n=!1;for(const e of s){const t=e.length;let s=0;for(;s=r){n=!0;break}if(s>=t){if(isWhiteSpace(i[l+o+s])){info(`Found "${bytesToString([...a,...e])}" when searching for endstream command.`);n=!0}break}}if(n){t.pos+=l;return t.pos-e}}l++}t.pos+=o}return-1}makeStream(e,t){const a=this.lexer;let n=a.stream;a.skipToNextLine();const s=n.pos-1;let r=e.get("Length");if(!Number.isInteger(r)){info(`Bad length "${r&&r.toString()}" in stream.`);r=0}n.pos=s+r;a.nextChar();if(this.tryShift()&&isCmd(this.buf2,"endstream"))this.shift();else{r=this.#G(s);if(r<0)throw new FormatError("Missing endstream command.");a.nextChar();this.shift();this.shift()}this.shift();n=n.makeSubStream(s,r,e);t&&(n=t.createStream(n,r));n=this.filter(n,e,r);n.dict=e;return n}filter(e,t,a){let n=t.get("F","Filter"),s=t.get("DP","DecodeParms");if(n instanceof Name){Array.isArray(s)&&warn("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,n.name,a,s)}let r=a;if(Array.isArray(n)){const t=n,a=s;for(let i=0,o=t.length;i=48&&e<=57?15&e:e>=65&&e<=70||e>=97&&e<=102?9+(15&e):-1}class Lexer{constructor(e,t=null){this.stream=e;this.nextChar();this.strBuf=[];this.knownCommands=t;this._hexStringNumWarn=0;this.beginInlineImagePos=-1}nextChar(){return this.currentChar=this.stream.getByte()}peekChar(){return this.stream.peekByte()}getNumber(){let e=this.currentChar,t=0,a=1;if(45===e){a=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else 43===e&&(e=this.nextChar());if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){t=10;e=this.nextChar()}if(e<48||e>57){const t=`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`;if(isWhiteSpace(e)||40===e||60===e||-1===e){info(`Lexer.getNumber - "${t}".`);return 0}throw new FormatError(t)}let n=e-48;for(;(e=this.nextChar())>=0;)if(e>=48&&e<=57){0!==t&&(t*=10);n=10*n+(e-48)}else if(46===e){if(0!==t)break;t=1}else{if(45!==e)break;warn("Badly formatted number: minus sign in the middle")}0!==t&&(n/=t);return a*n}getString(){let e=1,t=!1;const a=this.strBuf;a.length=0;let n=this.nextChar();for(;;){let s=!1;switch(0|n){case-1:warn("Unterminated string");t=!0;break;case 40:++e;a.push("(");break;case 41:if(0===--e){this.nextChar();t=!0}else a.push(")");break;case 92:n=this.nextChar();switch(n){case-1:warn("Unterminated string");t=!0;break;case 110:a.push("\n");break;case 114:a.push("\r");break;case 116:a.push("\t");break;case 98:a.push("\b");break;case 102:a.push("\f");break;case 92:case 40:case 41:a.push(String.fromCharCode(n));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&n;n=this.nextChar();s=!0;if(n>=48&&n<=55){e=(e<<3)+(15&n);n=this.nextChar();if(n>=48&&n<=55){s=!1;e=(e<<3)+(15&n)}}a.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:a.push(String.fromCharCode(n))}break;default:a.push(String.fromCharCode(n))}if(t)break;s||(n=this.nextChar())}return a.join("")}getName(){let e,t;const a=this.strBuf;a.length=0;for(;(e=this.nextChar())>=0&&!an[e];)if(35===e){e=this.nextChar();if(an[e]){warn("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");a.push("#");break}const n=toHexDigit(e);if(-1!==n){t=e;e=this.nextChar();const s=toHexDigit(e);if(-1===s){warn(`Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`);a.push("#",String.fromCharCode(t));if(an[e])break;a.push(String.fromCharCode(e));continue}a.push(String.fromCharCode(n<<4|s))}else a.push("#",String.fromCharCode(e))}else a.push(String.fromCharCode(e));a.length>127&&warn(`Name token is longer than allowed by the spec: ${a.length}`);return Name.get(a.join(""))}_hexStringWarn(e){5!==this._hexStringNumWarn++?this._hexStringNumWarn>5||warn(`getHexString - ignoring invalid character: ${e}`):warn("getHexString - ignoring additional invalid characters.")}getHexString(){const e=this.strBuf;e.length=0;let t=this.currentChar,a=-1,n=-1;this._hexStringNumWarn=0;for(;;){if(t<0){warn("Unterminated hex string");break}if(62===t){this.nextChar();break}if(1!==an[t]){n=toHexDigit(t);if(-1===n)this._hexStringWarn(t);else if(-1===a)a=n;else{e.push(String.fromCharCode(a<<4|n));a=-1}t=this.nextChar()}else t=this.nextChar()}-1!==a&&e.push(String.fromCharCode(a<<4));return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return oa;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(1!==an[t])break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return Cmd.get("[");case 93:this.nextChar();return Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return Cmd.get(">>")}return Cmd.get(">");case 123:this.nextChar();return Cmd.get("{");case 125:this.nextChar();return Cmd.get("}");case 41:this.nextChar();throw new FormatError(`Illegal character: ${t}`)}let a=String.fromCharCode(t);if(t<32||t>127){const e=this.peekChar();if(e>=32&&e<=127){this.nextChar();return Cmd.get(a)}}const n=this.knownCommands;let s=void 0!==n?.[a];for(;(t=this.nextChar())>=0&&!an[t];){const e=a+String.fromCharCode(t);if(s&&void 0===n[e])break;if(128===a.length)throw new FormatError(`Command token too long: ${a.length}`);a=e;s=void 0!==n?.[a]}if("true"===a)return!0;if("false"===a)return!1;if("null"===a)return null;"BI"===a&&(this.beginInlineImagePos=this.stream.pos);return Cmd.get(a)}skipToNextLine(){let e=this.currentChar;for(;e>=0;){if(13===e){e=this.nextChar();10===e&&this.nextChar();break}if(10===e){this.nextChar();break}e=this.nextChar()}}}class Linearization{static create(e){function getInt(e,t,a=!1){const n=e.get(t);if(Number.isInteger(n)&&(a?n>=0:n>0))return n;throw new Error(`The "${t}" parameter in the linearization dictionary is invalid.`)}const t=new Parser({lexer:new Lexer(e),xref:null}),a=t.getObj(),n=t.getObj(),s=t.getObj(),r=t.getObj();let i,o;if(!(Number.isInteger(a)&&Number.isInteger(n)&&isCmd(s,"obj")&&r instanceof Dict&&"number"==typeof(i=r.get("Linearized"))&&i>0))return null;if((o=getInt(r,"L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:o,hints:function getHints(e){const t=e.get("H");let a;if(Array.isArray(t)&&(2===(a=t.length)||4===a)){for(let e=0;e0))throw new Error(`Hint (${e}) in the linearization dictionary is invalid.`)}return t}throw new Error("Hint array in the linearization dictionary is invalid.")}(r),objectNumberFirst:getInt(r,"O"),endFirst:getInt(r,"E"),numPages:getInt(r,"N"),mainXRefEntriesOffset:getInt(r,"T"),pageFirst:r.has("P")?getInt(r,"P",!0):0}}}const nn=["Adobe-GB1-UCS2","Adobe-CNS1-UCS2","Adobe-Japan1-UCS2","Adobe-Korea1-UCS2","78-EUC-H","78-EUC-V","78-H","78-RKSJ-H","78-RKSJ-V","78-V","78ms-RKSJ-H","78ms-RKSJ-V","83pv-RKSJ-H","90ms-RKSJ-H","90ms-RKSJ-V","90msp-RKSJ-H","90msp-RKSJ-V","90pv-RKSJ-H","90pv-RKSJ-V","Add-H","Add-RKSJ-H","Add-RKSJ-V","Add-V","Adobe-CNS1-0","Adobe-CNS1-1","Adobe-CNS1-2","Adobe-CNS1-3","Adobe-CNS1-4","Adobe-CNS1-5","Adobe-CNS1-6","Adobe-GB1-0","Adobe-GB1-1","Adobe-GB1-2","Adobe-GB1-3","Adobe-GB1-4","Adobe-GB1-5","Adobe-Japan1-0","Adobe-Japan1-1","Adobe-Japan1-2","Adobe-Japan1-3","Adobe-Japan1-4","Adobe-Japan1-5","Adobe-Japan1-6","Adobe-Korea1-0","Adobe-Korea1-1","Adobe-Korea1-2","B5-H","B5-V","B5pc-H","B5pc-V","CNS-EUC-H","CNS-EUC-V","CNS1-H","CNS1-V","CNS2-H","CNS2-V","ETHK-B5-H","ETHK-B5-V","ETen-B5-H","ETen-B5-V","ETenms-B5-H","ETenms-B5-V","EUC-H","EUC-V","Ext-H","Ext-RKSJ-H","Ext-RKSJ-V","Ext-V","GB-EUC-H","GB-EUC-V","GB-H","GB-V","GBK-EUC-H","GBK-EUC-V","GBK2K-H","GBK2K-V","GBKp-EUC-H","GBKp-EUC-V","GBT-EUC-H","GBT-EUC-V","GBT-H","GBT-V","GBTpc-EUC-H","GBTpc-EUC-V","GBpc-EUC-H","GBpc-EUC-V","H","HKdla-B5-H","HKdla-B5-V","HKdlb-B5-H","HKdlb-B5-V","HKgccs-B5-H","HKgccs-B5-V","HKm314-B5-H","HKm314-B5-V","HKm471-B5-H","HKm471-B5-V","HKscs-B5-H","HKscs-B5-V","Hankaku","Hiragana","KSC-EUC-H","KSC-EUC-V","KSC-H","KSC-Johab-H","KSC-Johab-V","KSC-V","KSCms-UHC-H","KSCms-UHC-HW-H","KSCms-UHC-HW-V","KSCms-UHC-V","KSCpc-EUC-H","KSCpc-EUC-V","Katakana","NWP-H","NWP-V","RKSJ-H","RKSJ-V","Roman","UniCNS-UCS2-H","UniCNS-UCS2-V","UniCNS-UTF16-H","UniCNS-UTF16-V","UniCNS-UTF32-H","UniCNS-UTF32-V","UniCNS-UTF8-H","UniCNS-UTF8-V","UniGB-UCS2-H","UniGB-UCS2-V","UniGB-UTF16-H","UniGB-UTF16-V","UniGB-UTF32-H","UniGB-UTF32-V","UniGB-UTF8-H","UniGB-UTF8-V","UniJIS-UCS2-H","UniJIS-UCS2-HW-H","UniJIS-UCS2-HW-V","UniJIS-UCS2-V","UniJIS-UTF16-H","UniJIS-UTF16-V","UniJIS-UTF32-H","UniJIS-UTF32-V","UniJIS-UTF8-H","UniJIS-UTF8-V","UniJIS2004-UTF16-H","UniJIS2004-UTF16-V","UniJIS2004-UTF32-H","UniJIS2004-UTF32-V","UniJIS2004-UTF8-H","UniJIS2004-UTF8-V","UniJISPro-UCS2-HW-V","UniJISPro-UCS2-V","UniJISPro-UTF8-V","UniJISX0213-UTF32-H","UniJISX0213-UTF32-V","UniJISX02132004-UTF32-H","UniJISX02132004-UTF32-V","UniKS-UCS2-H","UniKS-UCS2-V","UniKS-UTF16-H","UniKS-UTF16-V","UniKS-UTF32-H","UniKS-UTF32-V","UniKS-UTF8-H","UniKS-UTF8-V","V","WP-Symbol"],sn=2**24-1;class CMap{constructor(e=!1){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.name="";this.vertical=!1;this.useCMap=null;this.builtInCMap=e}addCodespaceRange(e,t,a){this.codespaceRanges[e-1].push(t,a);this.numCodespaceRanges++}mapCidRange(e,t,a){if(t-e>sn)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=a++}mapBfRange(e,t,a){if(t-e>sn)throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");const n=a.length-1;for(;e<=t;){this._map[e++]=a;const t=a.charCodeAt(n)+1;t>255?a=a.substring(0,n-1)+String.fromCharCode(a.charCodeAt(n-1)+1)+"\0":a=a.substring(0,n)+String.fromCharCode(t)}}mapBfRangeToArray(e,t,a){if(t-e>sn)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const n=a.length;let s=0;for(;e<=t&&s>>0;const i=s[r];for(let e=0,t=i.length;e=t&&n<=s){a.charcode=n;a.length=r+1;return}}}a.charcode=0;a.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let a=0,n=t.length;a=s&&e<=r)return a+1}}return 1}get length(){return this._map.length}get isIdentityCMap(){if("Identity-H"!==this.name&&"Identity-V"!==this.name)return!1;if(65536!==this._map.length)return!1;for(let e=0;e<65536;e++)if(this._map[e]!==e)return!1;return!0}}class IdentityCMap extends CMap{constructor(e,t){super();this.vertical=e;this.addCodespaceRange(t,0,65535)}mapCidRange(e,t,a){unreachable("should not call mapCidRange")}mapBfRange(e,t,a){unreachable("should not call mapBfRange")}mapBfRangeToArray(e,t,a){unreachable("should not call mapBfRangeToArray")}mapOne(e,t){unreachable("should not call mapCidOne")}lookup(e){return Number.isInteger(e)&&e<=65535?e:void 0}contains(e){return Number.isInteger(e)&&e<=65535}forEach(e){for(let t=0;t<=65535;t++)e(t,t)}charCodeOf(e){return Number.isInteger(e)&&e<=65535?e:-1}getMap(){const e=new Array(65536);for(let t=0;t<=65535;t++)e[t]=t;return e}get length(){return 65536}get isIdentityCMap(){unreachable("should not access .isIdentityCMap")}}function strToInt(e){let t=0;for(let a=0;a>>0}function expectString(e){if("string"!=typeof e)throw new FormatError("Malformed CMap: expected string.")}function expectInt(e){if(!Number.isInteger(e))throw new FormatError("Malformed CMap: expected int.")}function parseBfChar(e,t){for(;;){let a=t.getObj();if(a===oa)break;if(isCmd(a,"endbfchar"))return;expectString(a);const n=strToInt(a);a=t.getObj();expectString(a);const s=a;e.mapOne(n,s)}}function parseBfRange(e,t){for(;;){let a=t.getObj();if(a===oa)break;if(isCmd(a,"endbfrange"))return;expectString(a);const n=strToInt(a);a=t.getObj();expectString(a);const s=strToInt(a);a=t.getObj();if(Number.isInteger(a)||"string"==typeof a){const t=Number.isInteger(a)?String.fromCharCode(a):a;e.mapBfRange(n,s,t)}else{if(!isCmd(a,"["))break;{a=t.getObj();const r=[];for(;!isCmd(a,"]")&&a!==oa;){r.push(a);a=t.getObj()}e.mapBfRangeToArray(n,s,r)}}}throw new FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let a=t.getObj();if(a===oa)break;if(isCmd(a,"endcidchar"))return;expectString(a);const n=strToInt(a);a=t.getObj();expectInt(a);const s=a;e.mapOne(n,s)}}function parseCidRange(e,t){for(;;){let a=t.getObj();if(a===oa)break;if(isCmd(a,"endcidrange"))return;expectString(a);const n=strToInt(a);a=t.getObj();expectString(a);const s=strToInt(a);a=t.getObj();expectInt(a);const r=a;e.mapCidRange(n,s,r)}}function parseCodespaceRange(e,t){for(;;){let a=t.getObj();if(a===oa)break;if(isCmd(a,"endcodespacerange"))return;if("string"!=typeof a)break;const n=strToInt(a);a=t.getObj();if("string"!=typeof a)break;const s=strToInt(a);e.addCodespaceRange(a.length,n,s)}throw new FormatError("Invalid codespace range.")}function parseWMode(e,t){const a=t.getObj();Number.isInteger(a)&&(e.vertical=!!a)}function parseCMapName(e,t){const a=t.getObj();a instanceof Name&&(e.name=a.name)}async function parseCMap(e,t,a,n){let s,r;e:for(;;)try{const a=t.getObj();if(a===oa)break;if(a instanceof Name){"WMode"===a.name?parseWMode(e,t):"CMapName"===a.name&&parseCMapName(e,t);s=a}else if(a instanceof Cmd)switch(a.cmd){case"endcmap":break e;case"usecmap":s instanceof Name&&(r=s.name);break;case"begincodespacerange":parseCodespaceRange(e,t);break;case"beginbfchar":parseBfChar(e,t);break;case"begincidchar":parseCidChar(e,t);break;case"beginbfrange":parseBfRange(e,t);break;case"begincidrange":parseCidRange(e,t)}}catch(e){if(e instanceof MissingDataException)throw e;warn("Invalid cMap data: "+e);continue}!n&&r&&(n=r);return n?extendCMap(e,a,n):e}async function extendCMap(e,t,a){e.useCMap=await createBuiltInCMap(a,t);if(0===e.numCodespaceRanges){const t=e.useCMap.codespaceRanges;for(let a=0;aextendCMap(s,t,e));const r=new Lexer(new Stream(a));return parseCMap(s,r,t,null)}class CMapFactory{static async create({encoding:e,fetchBuiltInCMap:t,useCMap:a}){if(e instanceof Name)return createBuiltInCMap(e.name,t);if(e instanceof BaseStream){if(e.isAsync){const t=await e.asyncGetBytes();t&&(e=new Stream(t,0,t.length,e.dict))}const n=await parseCMap(new CMap,new Lexer(e),t,a);return n.isIdentityCMap?createBuiltInCMap(n.name,t):n}throw new Error("Encoding required.")}}class CSS_FONT_INFO{static strings=["fontFamily","fontWeight","italicAngle"]}class SYSTEM_FONT_INFO{static strings=["css","loadedName","baseFontName","src"]}class FONT_INFO{static bools=["black","bold","disableFontFace","fontExtraProperties","isInvalidPDFjsFont","isType3Font","italic","missingFile","remeasure","vertical"];static numbers=["ascent","defaultWidth","descent"];static strings=["fallbackName","loadedName","mimetype","name"];static OFFSET_NUMBERS=Math.ceil(2*this.bools.length/8);static OFFSET_BBOX=this.OFFSET_NUMBERS+8*this.numbers.length;static OFFSET_FONT_MATRIX=this.OFFSET_BBOX+1+8;static OFFSET_DEFAULT_VMETRICS=this.OFFSET_FONT_MATRIX+1+48;static OFFSET_STRINGS=this.OFFSET_DEFAULT_VMETRICS+1+6}class PATTERN_INFO{static KIND=0;static HAS_BBOX=1;static HAS_BACKGROUND=2;static SHADING_TYPE=3;static N_COORD=4;static N_COLOR=8;static N_STOP=12;static N_FIGURES=16}function compileFontInfo(e){const t=e.systemFontInfo?function compileSystemFontInfo(e){const t=new TextEncoder,a={};let n=0;for(const s of SYSTEM_FONT_INFO.strings){const r=t.encode(e[s]);a[s]=r;n+=4+r.length}n+=4;let s,r,i=1+n;if(e.style){s=t.encode(e.style.style);r=t.encode(e.style.weight);i+=4+s.length+4+r.length}const o=new ArrayBuffer(i),l=new Uint8Array(o),f=new DataView(o);let c=0;f.setUint8(c++,e.guessFallback?1:0);f.setUint32(c,0);c+=4;n=0;for(const e of SYSTEM_FONT_INFO.strings){const t=a[e],s=t.length;n+=4+s;f.setUint32(c,s);l.set(t,c+4);c+=4+s}f.setUint32(c-n-4,n);if(e.style){f.setUint32(c,s.length);l.set(s,c+4);c+=4+s.length;f.setUint32(c,r.length);l.set(r,c+4);c+=4+r.length}assert(c<=o.byteLength,"compileSystemFontInfo: Buffer overflow");return o.transferToFixedLength(c)}(e.systemFontInfo):null,a=e.cssFontInfo?function compileCssFontInfo(e){const t=new TextEncoder,a={};let n=0;for(const s of CSS_FONT_INFO.strings){const r=t.encode(e[s]);a[s]=r;n+=4+r.length}const s=new ArrayBuffer(n),r=new Uint8Array(s),i=new DataView(s);let o=0;for(const e of CSS_FONT_INFO.strings){const t=a[e],n=t.length;i.setUint32(o,n);r.set(t,o+4);o+=4+n}assert(o===s.byteLength,"compileCssFontInfo: Buffer overflow");return s}(e.cssFontInfo):null,n=new TextEncoder,s={};let r=0;for(const t of FONT_INFO.strings){s[t]=n.encode(e[t]);r+=4+s[t].length}const i=FONT_INFO.OFFSET_STRINGS+4+r+4+(t?.byteLength??0)+4+(a?.byteLength??0)+4+(e.data?.length??0),o=new ArrayBuffer(i),l=new Uint8Array(o),f=new DataView(o);let c=0;const h=FONT_INFO.bools.length;let u=0,m=0;for(let t=0;t=5&&t<=7))return-1;n=e.substring(1)}if(n===n.toUpperCase()){a=parseInt(n,16);if(a>=0)return a}}return-1}const gn=[[0,127],[128,255],[256,383],[384,591],[592,687,7424,7551,7552,7615],[688,767,42752,42783],[768,879,7616,7679],[880,1023],[11392,11519],[1024,1279,1280,1327,11744,11775,42560,42655],[1328,1423],[1424,1535],[42240,42559],[1536,1791,1872,1919],[1984,2047],[2304,2431],[2432,2559],[2560,2687],[2688,2815],[2816,2943],[2944,3071],[3072,3199],[3200,3327],[3328,3455],[3584,3711],[3712,3839],[4256,4351,11520,11567],[6912,7039],[4352,4607],[7680,7935,11360,11391,42784,43007],[7936,8191],[8192,8303,11776,11903],[8304,8351],[8352,8399],[8400,8447],[8448,8527],[8528,8591],[8592,8703,10224,10239,10496,10623,11008,11263],[8704,8959,10752,11007,10176,10223,10624,10751],[8960,9215],[9216,9279],[9280,9311],[9312,9471],[9472,9599],[9600,9631],[9632,9727],[9728,9983],[9984,10175],[12288,12351],[12352,12447],[12448,12543,12784,12799],[12544,12591,12704,12735],[12592,12687],[43072,43135],[12800,13055],[13056,13311],[44032,55215],[55296,57343],[67840,67871],[19968,40959,11904,12031,12032,12255,12272,12287,13312,19903,131072,173791,12688,12703],[57344,63743],[12736,12783,63744,64255,194560,195103],[64256,64335],[64336,65023],[65056,65071],[65040,65055],[65104,65135],[65136,65279],[65280,65519],[65520,65535],[3840,4095],[1792,1871],[1920,1983],[3456,3583],[4096,4255],[4608,4991,4992,5023,11648,11743],[5024,5119],[5120,5759],[5760,5791],[5792,5887],[6016,6143],[6144,6319],[10240,10495],[40960,42127],[5888,5919,5920,5951,5952,5983,5984,6015],[66304,66351],[66352,66383],[66560,66639],[118784,119039,119040,119295,119296,119375],[119808,120831],[1044480,1048573],[65024,65039,917760,917999],[917504,917631],[6400,6479],[6480,6527],[6528,6623],[6656,6687],[11264,11359],[11568,11647],[19904,19967],[43008,43055],[65536,65663,65664,65791,65792,65855],[65856,65935],[66432,66463],[66464,66527],[66640,66687],[66688,66735],[67584,67647],[68096,68191],[119552,119647],[73728,74751,74752,74879],[119648,119679],[7040,7103],[7168,7247],[7248,7295],[43136,43231],[43264,43311],[43312,43359],[43520,43615],[65936,65999],[66e3,66047],[66208,66271,66176,66207,67872,67903],[127024,127135,126976,127023]];function getUnicodeRangeFor(e,t=-1){if(-1!==t){const a=gn[t];for(let n=0,s=a.length;n=a[n]&&e<=a[n+1])return t}for(let t=0,a=gn.length;t=a[n]&&e<=a[n+1])return t}return-1}const bn=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),wn=new Map;const jn=!0,kn=1,yn=2,qn=4,vn=32,Sn=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior","threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function recoverGlyphName(e,t){if(void 0!==t[e])return e;const a=getUnicodeForGlyph(e,t);if(-1!==a)for(const e in t)if(t[e]===a)return e;info("Unable to recover a standard glyph name for: "+e);return e}function type1FontGlyphMapping(e,t,a){const n=Object.create(null);let s,r,i;const o=!!(e.flags&qn);if(e.isInternalFont){i=t;for(r=0;r=0?s:0}}else if(e.baseEncodingName){i=getEncoding(e.baseEncodingName);for(r=0;r=0?s:0}}else if(o)for(r in t)n[r]=t[r];else{i=fn;for(r=0;r=0?s:0}}const l=e.differences;let f;if(l)for(r in l){const e=l[r];s=a.indexOf(e);if(-1===s){f||(f=mn());const t=recoverGlyphName(e,f);t!==e&&(s=a.indexOf(t))}n[r]=s>=0?s:0}return n}function normalizeFontName(e){return e.replaceAll(/[,_]/g,"-").replaceAll(/\s/g,"")}const An=getLookupTableFactory(e=>{e[8211]=65074;e[8212]=65073;e[8229]=65072;e[8230]=65049;e[12289]=65041;e[12290]=65042;e[12296]=65087;e[12297]=65088;e[12298]=65085;e[12299]=65086;e[12300]=65089;e[12301]=65090;e[12302]=65091;e[12303]=65092;e[12304]=65083;e[12305]=65084;e[12308]=65081;e[12309]=65082;e[12310]=65047;e[12311]=65048;e[65103]=65076;e[65281]=65045;e[65288]=65077;e[65289]=65078;e[65292]=65040;e[65306]=65043;e[65307]=65044;e[65311]=65046;e[65339]=65095;e[65341]=65096;e[65343]=65075;e[65371]=65079;e[65373]=65080});const xn=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"],Cn=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"],In=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"],Fn=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"],Tn=391,On=[null,{id:"hstem",min:2,stackClearing:!0,stem:!0},null,{id:"vstem",min:2,stackClearing:!0,stem:!0},{id:"vmoveto",min:1,stackClearing:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1},{id:"return",min:0},null,null,{id:"endchar",min:0,stackClearing:!0},null,null,null,{id:"hstemhm",min:2,stackClearing:!0,stem:!0},{id:"hintmask",min:0,stackClearing:!0},{id:"cntrmask",min:0,stackClearing:!0},{id:"rmoveto",min:2,stackClearing:!0},{id:"hmoveto",min:1,stackClearing:!0},{id:"vstemhm",min:2,stackClearing:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],Rn=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]+e[t-1]}},{id:"sub",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]-e[t-1]}},{id:"div",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]/e[t-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn(e,t){e[t-1]=-e[t-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]*e[t-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];class CFFParser{constructor(e,t,a){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!a}parse(){const e=this.properties,t=new CFF(this.bytes.length);this.cff=t;const a=this.parseHeader(),n=this.parseIndex(a.endPos),s=this.parseIndex(n.endPos),r=this.parseIndex(s.endPos),i=this.parseIndex(r.endPos),o=this.parseDict(s.obj.get(0)),l=this.createDict(CFFTopDict,o,t.strings);t.header=a.obj;t.names=this.parseNameIndex(n.obj);t.strings=this.parseStringIndex(r.obj);t.topDict=l;t.globalSubrIndex=i.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=l.hasName("ROS");const f=l.getByName("CharStrings"),c=this.parseIndex(f).obj;t.charStringCount=c.count;const h=l.getByName("FontMatrix");h&&(e.fontMatrix=h);const u=l.getByName("FontBBox");if(u){e.ascent=Math.max(u[3],u[1]);e.descent=Math.min(u[1],u[3]);e.ascentScaled=!0}let m,p;if(t.isCIDFont){const e=this.parseIndex(l.getByName("FDArray")).obj;for(let a=0,n=e.count;a=t)throw new FormatError("Invalid CFF header");if(0!==a){info("cff data is shifted");e=e.subarray(a);this.bytes=e}const n=e[0],s=e[1],r=e[2],i=e[3];return{obj:new CFFHeader(n,s,r,i),endPos:r}}parseDict(e){const t=new DataView(e.buffer,e.byteOffset,e.bytesLength);let a=0;function parseOperand(){let n=e[a++];if(30===n)return function parseFloatOperand(){let t="";const n=15,s=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],r=e.length;for(;a>4,o=15&r;if(i===n)break;t+=s[i];if(o===n)break;t+=s[o]}return parseFloat(t)}();if(28===n){n=t.getInt16(a);a+=2;return n}if(29===n){n=t.getInt32(a);a+=4;return n}if(n>=32&&n<=246)return n-139;if(n>=247&&n<=250)return 256*(n-247)+e[a++]+108;if(n>=251&&n<=254)return-256*(n-251)-e[a++]-108;warn(`CFFParser.parseDict: "${n}" is a reserved command.`);return NaN}let n=[];const s=[];a=0;const r=e.length;for(;a10)return!1;const s=new DataView(t.buffer,t.byteOffset,t.bytesLength);let r=e.stackSize;const i=e.stack;let o=t.length;for(let l=0;l=4){r-=4;if(this.seacAnalysisEnabled){e.seac=i.slice(r,r+4);return!1}}c=On[f]}else if(f>=32&&f<=246){i[r]=f-139;r++}else if(f>=247&&f<=254){i[r]=f<251?(f-247<<8)+t[l]+108:-(f-251<<8)-t[l]-108;l++;r++}else if(255===f){i[r]=s.getInt32(l)/65536;l+=4;r++}else if(19===f||20===f){e.hints+=r>>1;if(0===e.hints){t.copyWithin(l-1,l,-1);l-=1;o-=1;continue}l+=e.hints+7>>3;r%=2;c=On[f]}else{if(10===f||29===f){const t=10===f?a:n;if(!t){c=On[f];warn("Missing subrsIndex for "+c.id);return!1}let s=32768;t.count<1240?s=107:t.count<33900&&(s=1131);const o=i[--r]+s;if(o<0||o>=t.count||isNaN(o)){c=On[f];warn("Out of bounds subrIndex for "+c.id);return!1}e.stackSize=r;e.callDepth++;if(!this.parseCharString(e,t.get(o),a,n))return!1;e.callDepth--;r=e.stackSize;continue}if(11===f){e.stackSize=r;return!0}if(0===f&&l===t.length){t[l-1]=14;c=On[14]}else{if(9===f){t.copyWithin(l-1,l,-1);l-=1;o-=1;continue}c=On[f]}}if(c){if(c.stem){e.hints+=r>>1;if(3===f||23===f)e.hasVStems=!0;else if(e.hasVStems&&(1===f||18===f)){warn("CFF stem hints are in wrong order");t[l-1]=1===f?3:23}}if(r=2&&c.stem?r%=2:r>1&&warn("Found too many parameters for stack-clearing command");r>0&&(e.width=i[r-1])}if("stackDelta"in c){"stackFn"in c&&c.stackFn(i,r);r+=c.stackDelta}else(c.stackClearing||c.resetStack)&&(r=0)}}o=s.length){warn("Invalid fd index for glyph index.");h=!1}if(h){m=s[e].privateDict;u=m.subrsIndex}}else t&&(u=t);h&&(h=this.parseCharString(c,l,u,a));if(null!==c.width){const e=m.getByName("nominalWidthX");o[f]=e+c.width}else{const e=m.getByName("defaultWidthX");o[f]=e}null!==c.seac&&(i[f]=c.seac);h||e.set(f,new Uint8Array([14]))}return{charStrings:e,seacs:i,widths:o}}emptyPrivateDictionary(e){const t=this.createDict(CFFPrivateDict,[],e.strings);e.setByKey(18,[0,0]);e.privateDict=t}parsePrivateDict(e){if(!e.hasName("Private")){this.emptyPrivateDictionary(e);return}const t=e.getByName("Private");if(!Array.isArray(t)||2!==t.length){e.removeByName("Private");return}const a=t[0],n=t[1];if(0===a||n>=this.bytes.length){this.emptyPrivateDictionary(e);return}const s=n+a,r=this.bytes.subarray(n,s),i=this.parseDict(r),o=this.createDict(CFFPrivateDict,i,e.strings);e.privateDict=o;0===o.getByName("ExpansionFactor")&&o.setByName("ExpansionFactor",.06);if(!o.getByName("Subrs"))return;const l=o.getByName("Subrs"),f=n+l;if(0===l||f>=this.bytes.length){this.emptyPrivateDictionary(e);return}const c=this.parseIndex(f);o.subrsIndex=c.obj}parseCharsets(e,t,a,n){if(0===e)return new CFFCharset(!0,Dn.ISO_ADOBE,xn);if(1===e)return new CFFCharset(!0,Dn.EXPERT,Cn);if(2===e)return new CFFCharset(!0,Dn.EXPERT_SUBSET,In);const s=this.bytes,r=e,i=s[e++],o=[n?0:".notdef"];let l,f,c;t-=1;switch(i){case 0:for(c=0;c=65535){warn("Not enough space in charstrings to duplicate first glyph.");return}const e=this.charStrings.get(0);this.charStrings.add(e);this.isCIDFont&&this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0])}hasGlyphId(e){if(e<0||e>=this.charStrings.count)return!1;return this.charStrings.get(e).length>0}}class CFFHeader{constructor(e,t,a,n){this.major=e;this.minor=t;this.hdrSize=a;this.offSize=n}}class CFFStrings{strings=[];get(e){return e>=0&&e<=390?Fn[e]:e-Tn<=this.strings.length?this.strings[e-Tn]:Fn[0]}getSID(e){let t=Fn.indexOf(e);if(-1!==t)return t;t=this.strings.indexOf(e);return-1!==t?t+Tn:-1}add(e){this.strings.push(e)}get count(){return this.strings.length}}class CFFIndex{objects=[];length=0;add(e){this.length+=e.length;this.objects.push(e)}set(e,t){this.length+=t.length-this.objects[e].length;this.objects[e]=t}get(e){return this.objects[e]}get count(){return this.objects.length}}class CFFDict{constructor(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}setByKey(e,t){if(!(e in this.keyToNameMap))return!1;if(0===t.length)return!0;for(const a of t)if(isNaN(a)){warn(`Invalid CFFDict value: "${t}" for key "${e}".`);return!0}const a=this.types[e];"num"!==a&&"sid"!==a&&"offset"!==a||(t=t[0]);this.values[e]=t;return!0}setByName(e,t){if(!(e in this.nameToKeyMap))throw new FormatError(`Invalid dictionary name "${e}"`);this.values[this.nameToKeyMap[e]]=t}hasName(e){return this.nameToKeyMap[e]in this.values}getByName(e){if(!(e in this.nameToKeyMap))throw new FormatError(`Invalid dictionary name ${e}"`);const t=this.nameToKeyMap[e];return t in this.values?this.values[t]:this.defaults[t]}removeByName(e){delete this.values[this.nameToKeyMap[e]]}static createTables(e){const t={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]};for(const a of e){const e=Array.isArray(a[0])?(a[0][0]<<8)+a[0][1]:a[0];t.keyToNameMap[e]=a[1];t.nameToKeyMap[a[1]]=e;t.types[e]=a[2];t.defaults[e]=a[3];t.opcodes[e]=Array.isArray(a[0])?a[0]:[a[0]];t.order.push(e)}return t}}const Hn=[[[12,30],"ROS",["sid","sid","num"],null],[[12,20],"SyntheticBase","num",null],[0,"version","sid",null],[1,"Notice","sid",null],[[12,0],"Copyright","sid",null],[2,"FullName","sid",null],[3,"FamilyName","sid",null],[4,"Weight","sid",null],[[12,1],"isFixedPitch","num",0],[[12,2],"ItalicAngle","num",0],[[12,3],"UnderlinePosition","num",-100],[[12,4],"UnderlineThickness","num",50],[[12,5],"PaintType","num",0],[[12,6],"CharstringType","num",2],[[12,7],"FontMatrix",["num","num","num","num","num","num"],[.001,0,0,.001,0,0]],[13,"UniqueID","num",null],[5,"FontBBox",["num","num","num","num"],[0,0,0,0]],[[12,8],"StrokeWidth","num",0],[14,"XUID","array",null],[15,"charset","offset",0],[16,"Encoding","offset",0],[17,"CharStrings","offset",0],[18,"Private",["offset","offset"],null],[[12,21],"PostScript","sid",null],[[12,22],"BaseFontName","sid",null],[[12,23],"BaseFontBlend","delta",null],[[12,31],"CIDFontVersion","num",0],[[12,32],"CIDFontRevision","num",0],[[12,33],"CIDFontType","num",0],[[12,34],"CIDCount","num",8720],[[12,35],"UIDBase","num",null],[[12,37],"FDSelect","offset",null],[[12,36],"FDArray","offset",null],[[12,38],"FontName","sid",null]];class CFFTopDict extends CFFDict{static get tables(){return shadow(this,"tables",this.createTables(Hn))}constructor(e){super(CFFTopDict.tables,e);this.privateDict=null}}const Bn=[[6,"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",.039625],[[12,10],"BlueShift","num",7],[[12,11],"BlueFuzz","num",1],[10,"StdHW","num",null],[11,"StdVW","num",null],[[12,12],"StemSnapH","delta",null],[[12,13],"StemSnapV","delta",null],[[12,14],"ForceBold","num",0],[[12,17],"LanguageGroup","num",0],[[12,18],"ExpansionFactor","num",.06],[[12,19],"initialRandomSeed","num",0],[20,"defaultWidthX","num",0],[21,"nominalWidthX","num",0],[19,"Subrs","offset",null]];class CFFPrivateDict extends CFFDict{static get tables(){return shadow(this,"tables",this.createTables(Bn))}constructor(e){super(CFFPrivateDict.tables,e);this.subrsIndex=null}}const Dn={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2};class CFFCharset{constructor(e,t,a,n){this.predefined=e;this.format=t;this.charset=a;this.raw=n}}class CFFEncoding{constructor(e,t,a,n){this.predefined=e;this.format=t;this.encoding=a;this.raw=n}}class CFFFDSelect{constructor(e,t){this.format=e;this.fdSelect=t}getFDIndex(e){return e<0||e>=this.fdSelect.length?-1:this.fdSelect[e]}}class CFFOffsetTracker{offsets=Object.create(null);isTracking(e){return e in this.offsets}track(e,t){if(e in this.offsets)throw new FormatError(`Already tracking location of ${e}`);this.offsets[e]=t}offset(e){for(const t in this.offsets)this.offsets[t]+=e}setEntryLocation(e,t,a){if(!(e in this.offsets))throw new FormatError(`Not tracking location of ${e}`);const n=a.data,s=this.offsets[e];for(let e=0,a=t.length;e>24&255;n[i]=f>>16&255;n[o]=f>>8&255;n[l]=255&f}}}class CompilerOutput{#V;#$=1024;#Y=0;constructor(e){this.#J(e)}#J(e){for(;this.#$this.#$&&this.#J(t);this.#V.set(e,this.#Y);this.#Y=t}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t=new CompilerOutput(e.rawFileLength),a=this.compileHeader(e.header);t.add(a);const n=this.compileNameIndex(e.names);t.add(n);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(const a of e.fdArray){let e=t.slice(0);a.hasName("FontMatrix")&&(e=Util.transform(e,a.getByName("FontMatrix")));a.setByName("FontMatrix",e)}}const s=e.topDict.getByName("XUID");s?.length>16&&e.topDict.removeByName("XUID");e.topDict.setByName("charset",0);let r=this.compileTopDicts([e.topDict],t.length,e.isCIDFont);t.add(r.output);const i=r.trackers[0],o=this.compileStringIndex(e.strings.strings);t.add(o);const l=this.compileIndex(e.globalSubrIndex);t.add(l);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)i.setEntryLocation("Encoding",[e.encoding.format],t);else{const a=this.compileEncoding(e.encoding);i.setEntryLocation("Encoding",[t.length],t);t.add(a)}const f=this.compileCharset(e.charset,e.charStrings.count,e.strings,e.isCIDFont);i.setEntryLocation("charset",[t.length],t);t.add(f);const c=this.compileCharStrings(e.charStrings);i.setEntryLocation("CharStrings",[t.length],t);t.add(c);if(e.isCIDFont){i.setEntryLocation("FDSelect",[t.length],t);const a=this.compileFDSelect(e.fdSelect);t.add(a);r=this.compileTopDicts(e.fdArray,t.length,!0);i.setEntryLocation("FDArray",[t.length],t);t.add(r.output);const n=r.trackers;this.compilePrivateDicts(e.fdArray,n,t)}this.compilePrivateDicts([e.topDict],[i],t);t.add([0]);return t.finalData}encodeNumber(e){return Number.isInteger(e)?this.encodeInteger(e):this.encodeFloat(e)}static get EncodeFloatRegExp(){return shadow(this,"EncodeFloatRegExp",/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/)}encodeFloat(e){let t=e.toString();const a=CFFCompiler.EncodeFloatRegExp.exec(t);if(a){const n=parseFloat("1e"+((a[2]?+a[2]:0)+a[1].length));t=(Math.round(e*n)/n).toString()}let n,s,r="";for(n=0,s=t.length;n=-107&&e<=107?[e+139]:e>=108&&e<=1131?[247+((e-=108)>>8),255&e]:e>=-1131&&e<=-108?[251+((e=-e-108)>>8),255&e]:e>=-32768&&e<=32767?[28,e>>8&255,255&e]:[29,e>>24&255,e>>16&255,e>>8&255,255&e];return t}compileHeader(e){return[e.major,e.minor,4,e.offSize]}compileNameIndex(e){const t=new CFFIndex;for(const a of e){const e=Math.min(a.length,127);let n=new Array(e);for(let t=0;t"~"||"["===e||"]"===e||"("===e||")"===e||"{"===e||"}"===e||"<"===e||">"===e||"/"===e||"%"===e)&&(e="_");n[t]=e}n=n.join("");""===n&&(n="Bad_Font_Name");t.add(stringToBytes(n))}return this.compileIndex(t)}compileTopDicts(e,t,a){const n=[];let s=new CFFIndex;for(const r of e){if(a){r.removeByName("CIDFontVersion");r.removeByName("CIDFontRevision");r.removeByName("CIDFontType");r.removeByName("CIDCount");r.removeByName("UIDBase")}const e=new CFFOffsetTracker,i=this.compileDict(r,e);n.push(e);s.add(i);e.offset(t)}s=this.compileIndex(s,n);return{trackers:n,output:s}}compilePrivateDicts(e,t,a){for(let n=0,s=e.length;n>8&255,255&e])}else{s=new Uint8Array(1+2*r);let t=0;const n=e.charset.length;let i=!1;for(let r=1;r>8&255;s[r+1]=255&o}}return s}compileEncoding(e){return e.raw}compileFDSelect(e){const t=e.format;let a,n;switch(t){case 0:a=new Uint8Array(1+e.fdSelect.length);a[0]=t;for(n=0;n>8&255,255&s,r];for(n=1;n>8&255,255&n,t);r=t}}const o=(i.length-3)/3;i[1]=o>>8&255;i[2]=255&o;i.push(n>>8&255,255&n);a=new Uint8Array(i)}return a}compileIndex(e,t=[]){const a=e.objects,n=a.length;if(0===n)return new Uint8Array(2);let s,r,i=1;for(s=0;s>8&255;o[l++]=255&n;o[l++]=r;let f=1;for(s=0;s>8&255;o[l++]=255&f}else if(3===r){o[l++]=f>>16&255;o[l++]=f>>8&255;o[l++]=255&f}else{o[l++]=f>>>24&255;o[l++]=f>>16&255;o[l++]=f>>8&255;o[l++]=255&f}a[s]&&(f+=a[s].length)}for(s=0;s=this.firstChar&&e<=this.lastChar?e:-1}amend(e){unreachable("Should not call amend()")}}class CFFFont{constructor(e,t){this.properties=t;const a=new CFFParser(e,t,jn);this.cff=a.parse();this.cff.duplicateFirstGlyph();const n=new CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=n.compile()}catch{warn("Failed to compile font "+t.loadedName);this.data=e}this._createBuiltInEncoding()}get numGlyphs(){return this.cff.charStrings.count}getCharset(){return this.cff.charset.charset}getGlyphMapping(){const e=this.cff,t=this.properties,{cidToGidMap:a,cMap:n}=t,s=e.charset.charset;let r,i;if(t.composite){let t,o;if(a?.length>0){t=Object.create(null);for(let e=0,n=a.length;e=0){const n=a[t];n&&(s[e]=n)}}s.length>0&&(this.properties.builtInEncoding=s)}}function getFloat214(e,t){return e.getInt16(t)/16384}function getSubroutineBias(e){const t=e.length;let a=32768;t<1240?a=107:t<33900&&(a=1131);return a}function parseCmap(e,t,a){const n=new DataView(e.buffer,e.byteOffset,e.byteLength),s=1===n.getUint16(t+2)?n.getUint32(t+8):n.getUint32(t+16),r=n.getUint16(t+s);let i,o,l;if(4===r){const e=n.getUint16(t+s+6)>>1;o=t+s+14;i=[];for(l=0;l>1;a0;)h.push({flags:o})}for(a=0;a>1;j=!0;break;case 4:i+=s.pop();moveTo(r,i);j=!0;break;case 5:for(;s.length>0;){r+=s.shift();i+=s.shift();lineTo(r,i)}break;case 6:for(;s.length>0;){r+=s.shift();lineTo(r,i);if(0===s.length)break;i+=s.shift();lineTo(r,i)}break;case 7:for(;s.length>0;){i+=s.shift();lineTo(r,i);if(0===s.length)break;r+=s.shift();lineTo(r,i)}break;case 8:for(;s.length>0;){c=r+s.shift();u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m+s.shift();bezierCurveTo(c,u,h,m,r,i)}break;case 10:b=s.pop();w=null;if(a.isCFFCIDFont){const e=a.fdSelect.getFDIndex(n);if(e>=0&&eMath.abs(i-t)?r+=s.shift():i+=s.shift();bezierCurveTo(c,u,h,m,r,i);break;default:throw new FormatError(`unknown operator: 12 ${k}`)}break;case 14:if(s.length>=4){const e=s.pop(),n=s.pop();i=s.pop();r=s.pop();t.save();t.translate(r,i);let o=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[fn[e]]));compileCharString(a.glyphs[o.glyphId],t,a,o.glyphId);t.restore();o=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[fn[n]]));compileCharString(a.glyphs[o.glyphId],t,a,o.glyphId)}return;case 19:case 20:o+=s.length>>1;f+=o+7>>3;j=!0;break;case 21:i+=s.pop();r+=s.pop();moveTo(r,i);j=!0;break;case 22:r+=s.pop();moveTo(r,i);j=!0;break;case 24:for(;s.length>2;){c=r+s.shift();u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m+s.shift();bezierCurveTo(c,u,h,m,r,i)}r+=s.shift();i+=s.shift();lineTo(r,i);break;case 25:for(;s.length>6;){r+=s.shift();i+=s.shift();lineTo(r,i)}c=r+s.shift();u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m+s.shift();bezierCurveTo(c,u,h,m,r,i);break;case 26:s.length%2&&(r+=s.shift());for(;s.length>0;){c=r;u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h;i=m+s.shift();bezierCurveTo(c,u,h,m,r,i)}break;case 27:s.length%2&&(i+=s.shift());for(;s.length>0;){c=r+s.shift();u=i;h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m;bezierCurveTo(c,u,h,m,r,i)}break;case 28:s.push(l.getInt16(f));f+=2;break;case 29:b=s.pop()+a.gsubrsBias;w=a.gsubrs[b];w&&parse(w);break;case 30:for(;s.length>0;){c=r;u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m+(1===s.length?s.shift():0);bezierCurveTo(c,u,h,m,r,i);if(0===s.length)break;c=r+s.shift();u=i;h=c+s.shift();m=u+s.shift();i=m+s.shift();r=h+(1===s.length?s.shift():0);bezierCurveTo(c,u,h,m,r,i)}break;case 31:for(;s.length>0;){c=r+s.shift();u=i;h=c+s.shift();m=u+s.shift();i=m+s.shift();r=h+(1===s.length?s.shift():0);bezierCurveTo(c,u,h,m,r,i);if(0===s.length)break;c=r;u=i+s.shift();h=c+s.shift();m=u+s.shift();r=h+s.shift();i=m+(1===s.length?s.shift():0);bezierCurveTo(c,u,h,m,r,i)}break;default:if(k<32)throw new FormatError(`unknown operator: ${k}`);if(k<247)s.push(k-139);else if(k<251)s.push(256*(k-247)+e[f++]+108);else if(k<255)s.push(256*-(k-251)-e[f++]-108);else{s.push(l.getInt32(f)/65536);f+=4}}j&&(s.length=0)}}(e)}class Commands{cmds=[];transformStack=[];currentTransform=[1,0,0,1,0,0];add(e,t){if(t){const{currentTransform:a}=this;for(let e=0,n=t.length;e=0&&ee.getUint32(t)}else{s=2;r=(e,t)=>2*e.getUint16(t)}const i=[];let o=r(n,0);for(let a=s;ae.getSize()+3&-4))}write(){const e=this.getSize(),t=new DataView(new ArrayBuffer(e)),a=e>131070,n=a?4:2,s=new DataView(new ArrayBuffer((this.glyphs.length+1)*n));a?s.setUint32(0,0):s.setUint16(0,0);let r=0,i=0;for(const e of this.glyphs){r+=e.write(r,t);r=r+3&-4;i+=n;a?s.setUint32(i,r):s.setUint16(i,r>>1)}return{isLocationLong:a,loca:new Uint8Array(s.buffer),glyf:new Uint8Array(t.buffer)}}scale(e){for(let t=0,a=this.glyphs.length;te.getSize()));return this.header.getSize()+e}write(e,t){if(!this.header)return 0;const a=e;e+=this.header.write(e,t);if(this.simple)e+=this.simple.write(e,t);else for(const a of this.composites)e+=a.write(e,t);return e-a}scale(e){if(!this.header)return;const t=(this.header.xMin+this.header.xMax)/2;this.header.scale(t,e);if(this.simple)this.simple.scale(t,e);else for(const a of this.composites)a.scale(t,e)}}class GlyphHeader{constructor({numberOfContours:e,xMin:t,yMin:a,xMax:n,yMax:s}){this.numberOfContours=e;this.xMin=t;this.yMin=a;this.xMax=n;this.yMax=s}static parse(e,t){return[10,new GlyphHeader({numberOfContours:t.getInt16(e),xMin:t.getInt16(e+2),yMin:t.getInt16(e+4),xMax:t.getInt16(e+6),yMax:t.getInt16(e+8)})]}getSize(){return 10}write(e,t){t.setInt16(e,this.numberOfContours);t.setInt16(e+2,this.xMin);t.setInt16(e+4,this.yMin);t.setInt16(e+6,this.xMax);t.setInt16(e+8,this.yMax);return 10}scale(e,t){this.xMin=Math.round(e+(this.xMin-e)*t);this.xMax=Math.round(e+(this.xMax-e)*t)}}class Contour{constructor({flags:e,xCoordinates:t,yCoordinates:a}){this.xCoordinates=t;this.yCoordinates=a;this.flags=e}}class SimpleGlyph{constructor({contours:e,instructions:t}){this.contours=e;this.instructions=t}static parse(e,t,a){const n=[];for(let s=0;s255?e+=2:o>0&&(e+=1);t=r;o=Math.abs(i-a);o>255?e+=2:o>0&&(e+=1);a=i}}return e}write(e,t){const a=e,n=[],s=[],r=[];let i=0,o=0;for(const a of this.contours){for(let e=0,t=a.xCoordinates.length;e=0?18:2;n.push(e)}else n.push(f)}i=l;const c=a.yCoordinates[e];f=c-o;if(0===f){t|=32;s.push(0)}else{const e=Math.abs(f);if(e<=255){t|=f>=0?36:4;s.push(e)}else s.push(f)}o=c;r.push(t)}t.setUint16(e,n.length-1);e+=2}t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}for(const a of r)t.setUint8(e++,a);for(let a=0,s=n.length;a=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(e+=2):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(e+=2);return e}write(e,t){const a=e;2&this.flags?this.argument1>=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(this.flags|=1):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(this.flags|=1);t.setUint16(e,this.flags);t.setUint16(e+2,this.glyphIndex);e+=4;if(1&this.flags){if(2&this.flags){t.setInt16(e,this.argument1);t.setInt16(e+2,this.argument2)}else{t.setUint16(e,this.argument1);t.setUint16(e+2,this.argument2)}e+=4}else{t.setUint8(e,this.argument1);t.setUint8(e+1,this.argument2);e+=2}if(256&this.flags){t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}}return e-a}scale(e,t){}}class OpenTypeFileBuilder{#Q=new Map;constructor(e){this.sfnt=e}static getSearchParams(e,t){let a=1,n=0;for(;(a^e)>a;){a<<=1;n++}const s=a*t;return{range:s,entry:n,rangeShift:t*e-s}}toArray(){let e=this.sfnt;const t=this.#Q,a=[...t.keys()].sort(),n=a.length;let s=12+16*n;const r=[s];for(let e=0;e>>0;r.push(s)}const i=new Uint8Array(s),o=new DataView(i.buffer);for(let e=0;e>>0}o.setInt32(s+4,l);o.setInt32(s+8,r[e]);o.setInt32(s+12,t.get(n).length);s+=16}this.#Q.clear();return i}addTable(e,t){if(this.#Q.has(e))throw new Error(`Table ${e} already exists`);this.#Q.set(e,t)}}const Kn=[4],Gn=[5],Vn=[6],$n=[7],Yn=[8],Jn=[12,35],Qn=[14],Zn=[21],es=[22],ts=[30],as=[31];class Type1CharString{width=0;lsb=0;flexing=!1;output=[];stack=[];convert(e,t,a){const n=e.length;let s,r,i,o=!1;for(let l=0;ln)return!0;const s=n-e;for(let e=s;e>8&255,255&t);else{t=65536*t|0;this.output.push(255,t>>24&255,t>>16&255,t>>8&255,255&t)}}this.output.push(...t);a?this.stack.splice(s,e):this.stack.length=0;return!1}}function isHexDigit(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function decrypt(e,t,a){if(a>=e.length)return new Uint8Array(0);let n,s,r=0|t;for(n=0;n>8;r=52845*(t+r)+22719&65535}return o}function isSpecial(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}class Type1Parser{constructor(e,t,a){if(t){const t=e.getBytes(),a=!((isHexDigit(t[0])||isWhiteSpace(t[0]))&&isHexDigit(t[1])&&isHexDigit(t[2])&&isHexDigit(t[3])&&isHexDigit(t[4])&&isHexDigit(t[5])&&isHexDigit(t[6])&&isHexDigit(t[7]));e=new Stream(a?decrypt(t,55665,4):function decryptAscii(e,t,a){let n=0|t;const s=e.length,r=new Uint8Array(s>>>1);let i,o;for(i=0,o=0;i>8;n=52845*(e+n)+22719&65535}}return r.slice(a,o)}(t,55665,4))}this.seacAnalysisEnabled=!!a;this.stream=e;this.nextChar()}readNumberArray(){this.getToken();const e=[];for(;;){const t=this.getToken();if(null===t||"]"===t||"}"===t)break;e.push(parseFloat(t||0))}return e}readNumber(){const e=this.getToken();return parseFloat(e||0)}readInt(){const e=this.getToken();return 0|parseInt(e||0,10)}readBoolean(){return"true"===this.getToken()?1:0}nextChar(){return this.currentChar=this.stream.getByte()}prevChar(){this.stream.skip(-2);return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(-1===t)return null;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!isWhiteSpace(t))break;t=this.nextChar()}if(isSpecial(t)){this.nextChar();return String.fromCharCode(t)}let a="";do{a+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!isWhiteSpace(t)&&!isSpecial(t));return a}readCharStrings(e,t){return-1===t?e:decrypt(e,4330,t)}extractFontProgram(e){const t=this.stream,a=[],n=[],s=new Map([["lenIV",4]]),r={subrs:[],charstrings:[],properties:{privateData:s}};let i,o,l,f;for(;null!==(i=this.getToken());)if("/"===i){i=this.getToken();switch(i){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;;){i=this.getToken();if(null===i||"end"===i)break;if("/"!==i)continue;const e=this.getToken();o=this.readInt();this.getToken();l=o>0?t.getBytes(o):new Uint8Array(0);f=s.get("lenIV");const a=this.readCharStrings(l,f);this.nextChar();i=this.getToken();"noaccess"===i?this.getToken():"/"===i&&this.prevChar();n.push({glyph:e,encoded:a})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){const e=this.readInt();o=this.readInt();this.getToken();l=o>0?t.getBytes(o):new Uint8Array(0);f=s.get("lenIV");const n=this.readCharStrings(l,f);this.nextChar();i=this.getToken();"noaccess"===i&&this.getToken();a[e]=n}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":const e=this.readNumberArray();e.length>0&&e.length,0;break;case"StemSnapH":case"StemSnapV":s.set(i,this.readNumberArray());break;case"StdHW":case"StdVW":s.set(i,this.readNumberArray()[0]);break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":s.set(i,this.readNumber());break;case"ExpansionFactor":s.set(i,this.readNumber()||.06);break;case"ForceBold":s.set(i,this.readBoolean())}}for(const{encoded:t,glyph:s}of n){const n=new Type1CharString,i=n.convert(t,a,this.seacAnalysisEnabled);let o=n.output;i&&(o=[14]);const l={glyphName:s,charstring:o,width:n.width,lsb:n.lsb,seac:n.seac};".notdef"===s?r.charstrings.unshift(l):r.charstrings.push(l);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(s);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=n.width)}}return r}extractFontHeader(e){let t;for(;null!==(t=this.getToken());)if("/"===t){t=this.getToken();switch(t){case"FontMatrix":const a=this.readNumberArray();e.fontMatrix=a;break;case"Encoding":const n=this.getToken();let s;if(/^\d+$/.test(n)){s=[];const e=0|parseInt(n,10);this.getToken();for(let a=0;a=s){i+=a;for(;i=0&&(n[e]=s)}}return type1FontGlyphMapping(e,n,a)}hasGlyphId(e){if(e<0||e>=this.numGlyphs)return!1;if(0===e)return!0;return this.charstrings[e-1].charstring.length>0}getSeacs(e){const t=[];for(let a=0,n=e.length;a0;e--)t[e]-=t[e-1];h.setByName(e,t)}r.topDict.privateDict=h;const m=new CFFIndex;for(const e of n)m.add(e);h.subrsIndex=m;return new CFFCompiler(r).compile()}}const ns=[[57344,63743],[1048576,1114109]],ss=1e3,rs=["ascent","bbox","black","bold","cssFontInfo","data","defaultVMetrics","defaultWidth","descent","disableFontFace","fallbackName","fontExtraProperties","fontMatrix","isInvalidPDFjsFont","isType3Font","italic","loadedName","mimetype","missingFile","name","remeasure","systemFontInfo","vertical"],is=["cMap","composite","defaultEncoding","differences","isMonospace","isSerifFont","isSymbolicFont","seacMap","subtype","toFontChar","toUnicode","type","vmetrics","widths"];function adjustWidths(e){if(!e.fontMatrix)return;if(e.fontMatrix[0]===n[0])return;const t=.001/e.fontMatrix[0],a=e.widths;for(const e in a)a[e]*=t;e.defaultWidth*=t}function amendFallbackToUnicode(e){if(!e.fallbackToUnicode)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;const t=[];for(const a in e.fallbackToUnicode)e.toUnicode.has(a)||(t[a]=e.fallbackToUnicode[a]);t.length>0&&e.toUnicode.amend(t)}class fonts_Glyph{constructor(e,t,a,n,s,r,i,o,l){this.originalCharCode=e;this.fontChar=t;this.unicode=a;this.accent=n;this.width=s;this.vmetric=r;this.operatorListId=i;this.isSpace=o;this.isInFont=l}get category(){return shadow(this,"category",function getCharUnicodeCategory(e){const t=wn.get(e);if(t)return t;const a=e.match(bn),n={isWhitespace:!!a?.[1],isZeroWidthDiacritic:!!a?.[2],isInvisibleFormatMark:!!a?.[3]};wn.set(e,n);return n}(this.unicode),!0)}}function int16(e,t){return(e<<8)+t}function writeSignedInt16(e,t,a){e[t+1]=a;e[t]=a>>>8}function signedInt16(e,t){const a=(e<<8)+t;return 32768&a?a-65536:a}class TrueTypeTableBuilder{#V;#$=1024;#ee=!1;#Y=0;#te;constructor({exactLength:e,minLength:t}){this.#ee=!!e;this.#J(e||t)}#J(e){if(this.#ee)this.#$=e;else for(;this.#$this.#$&&this.#J(t);this.#V.set(e,this.#Y);this.#Y=t}setInt16(e){const t=this.#Y+2;!this.#ee&&t>this.#$&&this.#J(t);this.#te.setInt16(this.#Y,e);this.#Y=t}setSafeInt16(e){const t=this.#Y+2;!this.#ee&&t>this.#$&&this.#J(t);this.#te.setInt16(this.#Y,MathClamp(e,-32768,32767));this.#Y=t}setInt32(e){const t=this.#Y+4;!this.#ee&&t>this.#$&&this.#J(t);this.#te.setInt32(this.#Y,e);this.#Y=t}}function isTrueTypeCollectionFile(e){return"ttcf"===bytesToString(e.peekBytes(4))}function getFontFileType(e,{type:t,subtype:a,composite:n}){let s,r;if(function isTrueTypeFile(e){const t=bytesToString(e.peekBytes(4));return"\0\0\0"===t||"true"===t}(e)||isTrueTypeCollectionFile(e))s=n?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){return"OTTO"===bytesToString(e.peekBytes(4))}(e))s=n?"CIDFontType2":"OpenType";else if(function isType1File(e){const t=e.peekBytes(2);return 37===t[0]&&33===t[1]||128===t[0]&&1===t[1]}(e))s=n?"CIDFontType0":"MMType1"===t?"MMType1":"Type1";else if(function isCFFFile(e){const t=e.peekBytes(4);return t[0]>=1&&t[3]>=1&&t[3]<=4}(e))if(n){s="CIDFontType0";r="CIDFontType0C"}else{s="MMType1"===t?"MMType1":"Type1";r="Type1C"}else{warn("getFontFileType: Unable to detect correct font file Type/Subtype.");s=t;r=a}return[s,r]}function applyStandardFontGlyphMap(e,t){for(const a in t)e[+a]=t[a]}function buildToFontChar(e,t,a){const n=[];let s;for(let a=0,r=e.length;ans[0][0]<=e&&e<=ns[0][1]||ns[1][0]<=e&&e<=ns[1][1];let h=null;for(const u in e){let m=e[u];if(!t(m))continue;if(f>c){l++;if(l>=ns.length){warn("Ran out of space in font private use area.");break}f=ns[l][0];c=ns[l][1]}const p=f++;0===m&&(m=a);let d=n.get(u);if("string"==typeof d)if(1===d.length)d=d.codePointAt(0);else{if(!h){h=new Map;for(let e=64256;e<=64335;e++){const t=String.fromCharCode(e).normalize("NFKD");t.length>1&&h.set(t,e)}}d=h.get(d)||d.codePointAt(0)}if(d&&!isInPrivateArea(d)&&!o.has(m)){r.set(d,m);o.add(m)}s[p]=m;i[u]=p}return{toFontChar:i,charCodeToGlyphId:s,toUnicodeExtraMap:r,nextAvailableFontCharCode:f}}function createCmapTable(e,t,a){const n=function getRanges(e,t,a){const n=[];for(const t in e)e[t]>=a||n.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,s]of t)s>=a||n.push({fontCharCode:e,glyphId:s});0===n.length&&n.push({fontCharCode:0,glyphId:0});n.sort((e,t)=>e.fontCharCode-t.fontCharCode);const s=[],r=n.length;for(let e=0;e65535?2:1,r=new TrueTypeTableBuilder({exactLength:12});r.skip(2);r.setInt16(s);r.setArray([0,3]);r.setArray([0,1]);r.setInt32(4+8*s);let i,o,l,f;for(i=n.length-1;i>=0&&!(n[i][0]<=65535);--i);const c=i+1;n[i][0]<65535&&65535===n[i][1]&&(n[i][1]=65534);const h=n[i][1]<65535?1:0,u=c+h,m=OpenTypeFileBuilder.getSearchParams(u,2),p=2*c+2*h,d=new TrueTypeTableBuilder({exactLength:p}),g=new TrueTypeTableBuilder({exactLength:p}),b=new TrueTypeTableBuilder({exactLength:p}),w=new TrueTypeTableBuilder({exactLength:p}),j=new TrueTypeTableBuilder({});let k=0;for(i=0,o=c;i0){g.setArray([255,255]);d.setArray([255,255]);b.setArray([0,1]);w.skip(2)}const y=new TrueTypeTableBuilder({exactLength:12+d.length+g.length+b.length+w.length+j.length});y.skip(2);y.setInt16(2*u);y.setInt16(m.range);y.setInt16(m.entry);y.setInt16(m.rangeShift);y.setArray(g.data);y.skip(2);y.setArray(d.data);y.setArray(b.data);y.setArray(w.data);y.setArray(j.data);let q=null,v=null,S=null;if(s>1){q=new TrueTypeTableBuilder({exactLength:8});q.setArray([0,3]);q.setArray([0,10]);q.setInt32(4+8*s+4+y.length);v=new TrueTypeTableBuilder({});for(const e of n){let t=e[0];const a=e[2];let n=a[0];for(l=1,f=a.length;le||!o)&&(o=e);l 123 are reserved for internal usage");i|=1<65535&&(l=65535)}else{o=0;l=255}const c=e.bbox||[0,0,0,0],h=a.unitsPerEm||(e.fontMatrix?1/Math.max(...e.fontMatrix.slice(0,4).map(Math.abs)):1e3),u=e.ascentScaled?1:h/ss,m=a.ascent||Math.round(u*(e.ascent||c[3]));let p=a.descent||Math.round(u*(e.descent||c[1]));p>0&&e.descent>0&&c[1]<0&&(p=-p);const d=a.yMax||m,g=-a.yMin||-p,b=new TrueTypeTableBuilder({exactLength:96});b.setArray([0,3]);b.setArray([2,36]);b.setArray([1,244]);b.setArray([0,5]);b.skip(2);b.setArray([2,138]);b.setArray([2,187]);b.skip(2);b.setArray([0,140]);b.setArray([2,138]);b.setArray([2,187]);b.skip(2);b.setArray([1,223]);b.setArray([0,49]);b.setArray([1,2]);b.skip(2);b.setArray([0,0,6,e.fixedPitch?9:0,0,0,0,0,0,0]);b.setInt32(n);b.setInt32(s);b.setInt32(r);b.setInt32(i);b.setArray([42,50,49,42]);b.setInt16(e.italicAngle?1:0);b.setInt16(o||e.firstChar);b.setInt16(l||e.lastChar);b.setInt16(m);b.setInt16(p);b.setArray([0,100]);b.setInt16(d);b.setInt16(g);b.skip(8);b.setInt16(e.xHeight);b.setInt16(e.capHeight);b.skip(2);b.setInt16(o||e.firstChar);b.setArray([0,3]);return b.data}function createPostTable(e){const t=new TrueTypeTableBuilder({exactLength:32});t.setArray([0,3,0,0]);t.setInt32(Math.floor(65536*e.italicAngle));t.skip(4);t.setInt32(e.fixedPitch?1:0);t.skip(16);return t.data}function createPostscriptName(e){return e.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g,"").slice(0,63)}function createNameTable(e,t){t||=[[],[]];const a=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||createPostscriptName(e),t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"],n=a.map(e=>stringToBytes(e)),s=new Array(a.length);let r,i,o,l,f;for(r=0,i=a.length;re.length))+Math.sumPrecise(n.map(e=>e.length))+Math.sumPrecise(s.map(e=>e.length))});b.skip(2);b.setInt16(g);b.setInt16(12*g+6);for(const e of p)b.setArray(e);for(const e of n)b.setArray(e);for(const e of s)b.setArray(e);return b.data}class Font{#ae=new Map;#ne=new Map;charProcOperatorList;constructor(e,t,a,n){this.name=e;this.psName=null;this.mimetype=null;this.disableFontFace=n.disableFontFace;this.fontExtraProperties=n.fontExtraProperties;this.loadedName=a.loadedName;this.isType3Font=a.isType3Font;this.missingFile=!1;this.cssFontInfo=a.cssFontInfo;let s=!!(a.flags&yn);if(!s&&!a.isSimulatedFlags){const t=Mn(),a=Pn(),n=En();for(const r of e.split("+")){let e=normalizeFontName(r);e=t[e]||a[e]||e;e=e.split("-",1)[0];if(n[e]){s=!0;break}}}this.isSerifFont=s;this.isSymbolicFont=!!(a.flags&qn);this.isMonospace=!!(a.flags&kn);let{type:r,subtype:i}=a;this.type=r;this.subtype=i;this.systemFontInfo=a.systemFontInfo;const o=e.match(/^InvalidPDFjsFont_(.*)_\d+$/);this.isInvalidPDFjsFont=!!o;this.isInvalidPDFjsFont?this.fallbackName=o[1]:this.isMonospace?this.fallbackName="monospace":this.isSerifFont?this.fallbackName="serif":this.fallbackName="sans-serif";if(this.systemFontInfo?.guessFallback){this.systemFontInfo.guessFallback=!1;this.systemFontInfo.css+=`,${this.fallbackName}`}this.differences=a.differences;this.widths=a.widths;this.defaultWidth=a.defaultWidth;this.composite=a.composite;this.cMap=a.cMap;this.capHeight=a.capHeight/ss;this.ascent=a.ascent/ss;this.descent=a.descent/ss;this.lineHeight=this.ascent-this.descent;this.fontMatrix=a.fontMatrix;this.bbox=a.bbox;this.defaultEncoding=a.defaultEncoding;this.toUnicode=a.toUnicode;this.toFontChar=[];if("Type3"===a.type){for(let e=0;e<256;e++)this.toFontChar[e]=this.differences[e]||a.defaultEncoding[e];return}this.cidEncoding=a.cidEncoding||"";this.vertical=!!a.vertical;if(this.vertical){this.vmetrics=a.vmetrics;this.defaultVMetrics=a.defaultVMetrics}if(!t||t.isEmpty){t&&warn('Font file is empty in "'+e+'" ('+this.loadedName+")");this.fallbackToSystemFont(a);return}[r,i]=getFontFileType(t,a);r===this.type&&i===this.subtype||info(`Inconsistent font file Type/SubType, expected: ${this.type}/${this.subtype} but found: ${r}/${i}.`);let l;try{switch(r){case"MMType1":info("MMType1 font ("+e+"), falling back to Type1.");case"Type1":case"CIDFontType0":this.mimetype="font/opentype";const n="Type1C"===i||"CIDFontType0C"===i?new CFFFont(t,a):new Type1Font(e,t,a);adjustWidths(a);l=this.convert(e,n,a);break;case"OpenType":case"TrueType":case"CIDFontType2":this.mimetype="font/opentype";l=this.checkAndRepair(e,t,a);adjustWidths(a);this.isOpenType&&(r="OpenType");break;default:throw new FormatError(`Font ${r} is not supported`)}}catch(e){warn(e);this.fallbackToSystemFont(a);return}amendFallbackToUnicode(a);this.data=l;this.type=r;this.subtype=i;this.fontMatrix=a.fontMatrix;this.widths=a.widths;this.defaultWidth=a.defaultWidth;this.toUnicode=a.toUnicode;this.seacMap=a.seacMap}get renderer(){return shadow(this,"renderer",FontRendererFactory.create(this,jn))}#se(e){const t=Object.create(null);for(const a of e){const e=this[a];void 0!==e&&(t[a]=e)}return t}exportData(){return{buffer:compileFontInfo(this.#se(rs)),charProcOperatorList:this.charProcOperatorList,extra:this.fontExtraProperties?this.#se(is):void 0}}fallbackToSystemFont(e){this.missingFile=!0;const{name:t,type:a}=this;let n=normalizeFontName(t);const s=Mn(),r=Pn(),i=!!s[n],o=!(!r[n]||!s[r[n]]);n=s[n]||r[n]||n;const l=Wn()[n];if(l){isNaN(this.ascent)&&(this.ascent=l.ascent/ss);isNaN(this.descent)&&(this.descent=l.descent/ss);isNaN(this.capHeight)&&(this.capHeight=l.capHeight/ss)}this.bold=/bold/gi.test(n);this.italic=/oblique|italic/gi.test(n);this.black=/Black/g.test(t);const f=/Narrow/g.test(t);this.remeasure=(!i||f)&&Object.keys(this.widths).length>0;if((i||o)&&"CIDFontType2"===a&&this.cidEncoding.startsWith("Identity-")){const a=e.cidToGidMap,n=[];applyStandardFontGlyphMap(n,zn());/Arial-?Black/i.test(t)?applyStandardFontGlyphMap(n,Ln()):/Calibri/i.test(t)&&applyStandardFontGlyphMap(n,Un());if(a){for(const e in n){const t=n[e];void 0!==a[t]&&(n[+e]=a[t])}a.length!==this.toUnicode.length&&e.hasIncludedToUnicodeMap&&this.toUnicode instanceof IdentityToUnicodeMap&&this.toUnicode.forEach(function(e,t){const s=n[e];void 0===a[s]&&(n[+e]=t)})}this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach(function(e,t){n[+e]=t});this.toFontChar=n;this.toUnicode=new ToUnicodeMap(n)}else if(/Symbol/i.test(n))this.toFontChar=buildToFontChar(hn,mn(),this.differences);else if(/Dingbats/i.test(n))this.toFontChar=buildToFontChar(un,pn(),this.differences);else if(i||o){const e=buildToFontChar(this.defaultEncoding,mn(),this.differences);"CIDFontType2"!==a||this.cidEncoding.startsWith("Identity-")||this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach(function(t,a){e[+t]=a});this.toFontChar=e}else{const e=mn(),a=[];this.toUnicode.forEach((t,n)=>{if(!this.composite){const a=getUnicodeForGlyph(this.differences[t]||this.defaultEncoding[t],e);-1!==a&&(n=a)}a[+t]=n});this.composite&&this.toUnicode instanceof IdentityToUnicodeMap&&/Tahoma|Verdana/i.test(t)&&applyStandardFontGlyphMap(a,zn());this.toFontChar=a}amendFallbackToUnicode(e);this.loadedName=n.split("-",1)[0]}checkAndRepair(e,t,a){const n=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function readTables(e,t){const a=Object.create(null);a["OS/2"]=null;a.cmap=null;a.head=null;a.hhea=null;a.hmtx=null;a.maxp=null;a.name=null;a.post=null;for(let s=0;s>>0,n=e.getInt32()>>>0,s=e.getInt32()>>>0,r=e.pos;e.pos=e.start||0;e.skip(n);const i=e.getBytes(s);e.pos=r;if("head"===t){i[8]=i[9]=i[10]=i[11]=0;i[17]|=32}return{tag:t,checksum:a,length:s,offset:n,data:i,view:new DataView(i.buffer,i.byteOffset,i.byteLength)}}function readOpenTypeHeader(e){return{version:e.getString(4),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function sanitizeGlyph(e,t,a,n,s,r){const i={length:0,sizeOfInstructions:0};if(t<0||t>=e.length||a>e.length||a-t<=12)return i;const o=e.subarray(t,a),l=signedInt16(o[2],o[3]),f=signedInt16(o[4],o[5]),c=signedInt16(o[6],o[7]),h=signedInt16(o[8],o[9]);if(l>c){writeSignedInt16(o,2,c);writeSignedInt16(o,6,l)}if(f>h){writeSignedInt16(o,4,h);writeSignedInt16(o,8,f)}const u=signedInt16(o[0],o[1]);if(u<0){if(u<-1)return i;n.set(o,s);i.length=o.length;return i}let m,p=10,d=0;for(m=0;mo.length)return i;if(!r&&b>0){n.set(o.subarray(0,g),s);n.set([0,0],s+g);n.set(o.subarray(w,k),s+g+2);k-=b;o.length-k>3&&(k=k+3&-4);i.length=k;return i}if(o.length-k>3){k=k+3&-4;n.set(o.subarray(0,k),s);i.length=k;return i}n.set(o,s);i.length=o.length;return i}function readNameTable(e){const a=(t.start||0)+e.offset;t.pos=a;const n=[[],[]],s=[],r=e.length,i=a+r;if(0!==t.getUint16()||r<6)return[n,s];const o=t.getUint16(),l=t.getUint16();let f,c;for(f=0;fi)continue;t.pos=r;const o=e.name;if(e.encoding){let a="";for(let n=0,s=e.length;n0&&(f+=e-1)}}else{if(g||w){warn("TT: nested FDEFs not allowed");d=!0}g=!0;h=f;i=u.pop();t.functionsDefined[i]={data:l,i:f}}else if(!g&&!w){i=u.at(-1);if(isNaN(i))info("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[i]=!0;if(i in t.functionsStackDeltas){const e=u.length+t.functionsStackDeltas[i];if(e<0){warn("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}u.length=e}else if(i in t.functionsDefined&&!p.includes(i)){m.push({data:l,i:f,stackTop:u.length-1});p.push(i);o=t.functionsDefined[i];if(!o){warn("TT: CALL non-existent function");t.hintsValid=!1;return}l=o.data;f=o.i}}}if(!g&&!w){let t=0;e<=142?t=s[e]:e>=192&&e<=223?t=-1:e>=224&&(t=-2);if(e>=113&&e<=117){n=u.pop();isNaN(n)||(t=2*-n)}for(;t<0&&u.length>0;){u.pop();t++}for(;t>0;){u.push(NaN);t--}}}t.tooComplexToFollowFunctions=d;const j=[l];f>l.length&&j.push(new Uint8Array(f-l.length));if(h>c){warn("TT: complementing a missing function tail");j.push(new Uint8Array([34,45]))}!function foldTTTable(e,t){if(t.length>1){let a,n,s=0;for(a=0,n=t.length;a>>0,r=[];for(let t=0;t>>0);const i={ttcTag:t,majorVersion:a,minorVersion:n,numFonts:s,offsetTable:r};switch(a){case 1:return i;case 2:i.dsigTag=e.getInt32()>>>0;i.dsigLength=e.getInt32()>>>0;i.dsigOffset=e.getInt32()>>>0;return i}throw new FormatError(`Invalid TrueType Collection majorVersion: ${a}.`)}(e),s=t.split("+");let r;for(let i=0;i=32))throw new FormatError('"maxp" table has a wrong version number');f=65536}!function writeUint32(e,t,a){e[t+3]=255&a;e[t+2]=a>>>8;e[t+1]=a>>>16;e[t]=a>>>24}(i.maxp.data,0,f)}let h=int16(i.head.data[50],i.head.data[51]);if(i.loca){const e=h?4*(c+1):2*(c+1);if(i.loca.length!==e){warn("Incorrect 'loca' table length -- attempting to fix it.");const a=Object.values(i).filter(Boolean).sort((e,t)=>e.offset-t.offset),n=a.indexOf(i.loca),s=a[n+1]||null;if(s&&i.loca.offset+e>8&255;o[a+1]=255&n;writeSignedInt16(o,a+2,Math.round(e[t]*signedInt16(o[a+2],o[a+3])))}}let u=c+1,m=!0;if(u>65535){m=!1;u=c;warn("Not enough space in glyfs to duplicate first glyph.")}let p=0,d=0;if(f>=65536&&i.maxp.length>=32){t.pos+=8;if(t.getUint16()>2){i.maxp.data[14]=0;i.maxp.data[15]=2}t.pos+=4;p=t.getUint16();t.pos+=4;d=t.getUint16()}i.maxp.data[4]=u>>8;i.maxp.data[5]=255&u;const g=function sanitizeTTPrograms(e,t,a,n){const s={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,s);t&&sanitizeTTProgram(t,s);e&&function checkInvalidFunctions(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){warn("TT: more functions defined than expected");e.hintsValid=!1}else for(let a=0,n=e.functionsUsed.length;at){warn("TT: invalid function id: "+a);e.hintsValid=!1;return}if(e.functionsUsed[a]&&!e.functionsDefined[a]){warn("TT: undefined function: "+a);e.hintsValid=!1;return}}}(s,n);if(a&&1&a.length){const e=new Uint8Array(a.length+1);e.set(a.data);a.data=e}return s.hintsValid}(i.fpgm,i.prep,i["cvt "],p);if(!g){delete i.fpgm;delete i.prep;delete i["cvt "]}!function sanitizeMetrics(e,t,a,n,s,r){if(!t){a&&(a.data=null);return}e.pos=(e.start||0)+t.offset;e.pos+=4;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;const i=e.getUint16();e.pos+=8;e.pos+=2;let o=e.getUint16();if(0!==i){if(!(2&int16(n.data[44],n.data[45]))){t.data[22]=0;t.data[23]=0}}if(o>s){info(`The numOfMetrics (${o}) should not be greater than the numGlyphs (${s}).`);o=s;t.data[34]=(65280&o)>>8;t.data[35]=255&o}const l=s-o-(a.length-4*o>>1);if(l>0){const e=new Uint8Array(a.length+2*l);e.set(a.data);if(r){e[a.length]=a.data[2];e[a.length+1]=a.data[3]}a.data=e}}(t,i.hhea,i.hmtx,i.head,u,m);if(!i.head)throw new FormatError('Required "head" table is not found');!function sanitizeHead(e,t,a){const{data:n,view:s}=e,r=s.getInt32(0);if(r>>16!=1){info("Attempting to fix invalid version in head table: "+r);s.setInt32(0,65536)}const i=signedInt16(n[50],n[51]);if(i<0||i>1){info("Attempting to fix invalid indexToLocFormat in head table: "+i);const e=t+1;if(a===e<<1){n[50]=0;n[51]=0}else{if(a!==e<<2)throw new FormatError("Could not fix indexToLocFormat: "+i);n[50]=0;n[51]=1}}}(i.head,c,o?i.loca.length:0);let b=Object.create(null);if(o){const e=function sanitizeGlyphLocations(e,t,a,n,s,r,i){let o,l,f;if(n){o=4;l=function fontItemDecodeLong(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};f=function fontItemEncodeLong(e,t,a){e[t]=a>>>24&255;e[t+1]=a>>16&255;e[t+2]=a>>8&255;e[t+3]=255&a}}else{o=2;l=function fontItemDecode(e,t){return e[t]<<9|e[t+1]<<1};f=function fontItemEncode(e,t,a){e[t]=a>>9&255;e[t+1]=a>>1&255}}const c=r?a+1:a,h=o*(1+c),u=new Uint8Array(h);u.set(e.data.subarray(0,h));e.data=u;const m=t.data,p=m.length,d=new Uint8Array(p);let g,b;const w=[];for(g=0,b=0;gp&&(e=p);w.push({index:g,offset:e,endOffset:0})}w.sort((e,t)=>e.offset-t.offset);for(g=0;ge.index-t.index);for(g=0;gi&&(i=e.sizeOfInstructions);y+=t;f(u,b,y)}if(0===y){const e=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(g=0,b=o;ga+y)t.data=d.subarray(0,a+y);else{t.data=new Uint8Array(a+y);t.data.set(d.subarray(0,y))}t.data.set(d.subarray(0,a),y);f(e.data,u.length-o,y+a)}else t.data=d.subarray(0,y);return{missingGlyphs:k,maxSizeOfInstructions:i}}(i.loca,i.glyf,c,h,g,m,d);b=e.missingGlyphs;if(f>=65536&&i.maxp.length>=32){i.maxp.data[26]=e.maxSizeOfInstructions>>8;i.maxp.data[27]=255&e.maxSizeOfInstructions}}if(!i.hhea)throw new FormatError('Required "hhea" table is not found');if(0===i.hhea.data[10]&&0===i.hhea.data[11]){i.hhea.data[10]=255;i.hhea.data[11]=255}const w={unitsPerEm:int16(i.head.data[18],i.head.data[19]),yMax:signedInt16(i.head.data[42],i.head.data[43]),yMin:signedInt16(i.head.data[38],i.head.data[39]),ascent:signedInt16(i.hhea.data[4],i.hhea.data[5]),descent:signedInt16(i.hhea.data[6],i.hhea.data[7]),lineGap:signedInt16(i.hhea.data[8],i.hhea.data[9])};this.ascent=w.ascent/w.unitsPerEm;this.descent=w.descent/w.unitsPerEm;this.lineGap=w.lineGap/w.unitsPerEm;if(this.cssFontInfo?.lineHeight){this.lineHeight=this.cssFontInfo.metrics.lineHeight;this.lineGap=this.cssFontInfo.metrics.lineGap}else this.lineHeight=this.ascent-this.descent+this.lineGap;i.post&&function readPostScriptTable(e,a,n){const s=(t.start||0)+e.offset;t.pos=s;const r=s+e.length,i=t.getInt32();t.skip(28);let o,l,f=!0;switch(i){case 65536:o=Sn;break;case 131072:const e=t.getUint16();if(e!==n){f=!1;break}const s=[];for(l=0;l=32768){f=!1;break}s.push(e)}if(!f)break;const c=[];for(;t.pos65535)throw new FormatError("Max size of CID is 65,535");let s=-1;t?s=n:void 0!==e[n]&&(s=e[n]);s>=0&&s>>0;let c=!1;if(o?.platformId!==s||o?.encodingId!==r){if(0!==s||0!==r&&1!==r&&3!==r)if(1===s&&0===r)c=!0;else if(3!==s||1!==r||!n&&o){if(a&&3===s&&0===r){c=!0;let a=!0;if(e>3;e.push(n);a=Math.max(n,a)}const n=[];for(let e=0;e<=a;e++)n.push({firstCode:t.getUint16(),entryCount:t.getUint16(),idDelta:signedInt16(t.getByte(),t.getByte()),idRangePos:t.pos+t.getUint16()});for(let a=0;a<256;a++)if(0===e[a]){t.pos=n[0].idRangePos+2*a;m=t.getUint16();h.push({charCode:a,glyphId:m})}else{const s=n[e[a]];for(u=0;u>1;t.skip(6);const a=[];let n;for(n=0;n>1)-(e-n);s.offsetIndex=i;o=Math.max(o,i+s.end-s.start+1)}else s.offsetIndex=-1}const l=[];for(u=0;u>>0;for(u=0;u>>0,a=t.getInt32()>>>0;let n=t.getInt32()>>>0;for(let t=e;t<=a;t++)h.push({charCode:t,glyphId:n++})}}}h.sort((e,t)=>e.charCode-t.charCode);const p=[],d=new Set;for(const e of h){const{charCode:t}=e;if(!d.has(t)){d.add(t);p.push(e)}}return{platformId:o.platformId,encodingId:o.encodingId,mappings:p,hasShortCmap:c}}(i.cmap,t,this.isSymbolicFont,a.hasEncoding),n=e.platformId,s=e.encodingId,r=e.mappings;let o=[],l=!1;!a.hasEncoding||"MacRomanEncoding"!==a.baseEncodingName&&"WinAnsiEncoding"!==a.baseEncodingName||(o=getEncoding(a.baseEncodingName));if(a.hasEncoding&&!this.isSymbolicFont&&(3===n&&1===s||1===n&&0===s)){const e=mn();for(let t=0;t<256;t++){let i;i=void 0!==this.differences[t]?this.differences[t]:o.length&&""!==o[t]?o[t]:fn[t];if(!i)continue;const l=recoverGlyphName(i,e);let f;3===n&&1===s?f=e[l]:1===n&&0===s&&(f=ln.indexOf(l));if(void 0===f){if(!a.glyphNames&&a.hasIncludedToUnicodeMap&&!(this.toUnicode instanceof IdentityToUnicodeMap)){const e=this.toUnicode.get(t);e&&(f=e.codePointAt(0))}if(void 0===f)continue}for(const e of r)if(e.charCode===f){j[t]=e.glyphId;break}}}else if(0===n){for(const e of r)j[e.charCode]=e.glyphId;l=!0}else if(3===n&&0===s)for(const e of r){let t=e.charCode;t>=61440&&t<=61695&&(t&=255);j[t]=e.glyphId}else for(const e of r)j[e.charCode]=e.glyphId;if(a.glyphNames&&(o.length||this.differences.length))for(let e=0;e<256;++e){if(!l&&void 0!==j[e])continue;const t=this.differences[e]||o[e];if(!t)continue;const n=a.glyphNames.indexOf(t);n>0&&hasGlyph(n)&&(j[e]=n)}}0===j.length&&(j[0]=0);let k=u-1;m||(k=0);if(!a.cssFontInfo){const e=adjustMapping(j,hasGlyph,k,this.toUnicode);this.toFontChar=e.toFontChar;i.cmap={tag:"cmap",data:createCmapTable(e.charCodeToGlyphId,e.toUnicodeExtraMap,u)};i["OS/2"]&&function validateOS2Table(e,t){t.pos=(t.start||0)+e.offset;const a=t.getUint16();t.skip(60);const n=t.getUint16();if(a<4&&768&n)return!1;if(t.getUint16()>t.getUint16())return!1;t.skip(6);if(0===t.getUint16())return!1;e.data[8]=e.data[9]=0;return!0}(i["OS/2"],t)||(i["OS/2"]={tag:"OS/2",data:createOS2Table(a,e.charCodeToGlyphId,w)})}if(i.name){const[t,n]=readNameTable(i.name);i.name.data=createNameTable(e,t);this.psName=t[0][6]||null;a.composite||function adjustTrueTypeToUnicode(e,t,a){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(e.hasEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;if(!t)return;if(0===a.length)return;if(e.defaultEncoding===cn)return;for(const e of a)if(!isWinNameRecord(e))return;const n=cn,s=[],r=mn();for(const e in n){const t=n[e];if(""===t)continue;const a=r[t];void 0!==a&&(s[e]=String.fromCharCode(a))}s.length>0&&e.toUnicode.amend(s)}(a,this.isSymbolicFont,n)}else i.name={tag:"name",data:createNameTable(this.name)};const y=new OpenTypeFileBuilder(r.version);for(const e in i)y.addTable(e,i[e].data);return y.toArray()}convert(e,t,a){a.fixedPitch=!1;a.builtInEncoding&&function adjustType1ToUnicode(e,t){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;const a=[],n=mn();for(const s in t){if(e.hasEncoding&&(e.baseEncodingName||void 0!==e.differences[s]))continue;const r=getUnicodeForGlyph(t[s],n);-1!==r&&(a[s]=String.fromCharCode(r))}a.length>0&&e.toUnicode.amend(a)}(a,a.builtInEncoding);let s=1;t instanceof CFFFont&&(s=t.numGlyphs-1);const r=t.getGlyphMapping(a);let i=null,o=r,l=null;if(!a.cssFontInfo){i=adjustMapping(r,t.hasGlyphId.bind(t),s,this.toUnicode);this.toFontChar=i.toFontChar;o=i.charCodeToGlyphId;l=i.toUnicodeExtraMap}const f=t.numGlyphs;function getCharCodes(e,t){let a=null;for(const n in e)t===e[n]&&(a||=[]).push(0|n);return a}function createCharCode(e,t){for(const a in e)if(t===e[a])return 0|a;i.charCodeToGlyphId[i.nextAvailableFontCharCode]=t;return i.nextAvailableFontCharCode++}const c=t.seacs;if(i&&c?.length){const e=a.fontMatrix||n,s=t.getCharset(),o=Object.create(null);for(let t in c){t|=0;const a=c[t],n=fn[a[2]],l=fn[a[3]],f=s.indexOf(n),h=s.indexOf(l);if(f<0||h<0)continue;const u={x:a[0]*e[0]+a[1]*e[2]+e[4],y:a[0]*e[1]+a[1]*e[3]+e[5]},m=getCharCodes(r,t);if(m)for(const e of m){const t=i.charCodeToGlyphId,a=createCharCode(t,f),n=createCharCode(t,h);o[e]={baseFontCharCode:a,accentFontCharCode:n,accentOffset:u}}}a.seacMap=o}const h=a.fontMatrix?1/Math.max(...a.fontMatrix.slice(0,4).map(Math.abs)):1e3,u=new OpenTypeFileBuilder("OTTO");u.addTable("CFF ",t.data);u.addTable("OS/2",createOS2Table(a,o));u.addTable("cmap",createCmapTable(o,l,f));u.addTable("head",function fontTableHead(){const e=[0,0,0,0,158,11,126,39],t=new TrueTypeTableBuilder({exactLength:54});t.setArray([0,1,0,0]);t.setArray([0,0,16,0]);t.skip(4);t.setArray([95,15,60,245]);t.skip(2);t.setSafeInt16(h);t.setArray(e);t.setArray(e);t.skip(2);t.setSafeInt16(a.descent);t.setArray([15,255]);t.setSafeInt16(a.ascent);t.setInt16(a.italicAngle?2:0);t.setArray([0,17]);t.skip(6);return t.data}());u.addTable("hhea",function fontTableHhea(){const e=new TrueTypeTableBuilder({exactLength:36});e.setArray([0,1,0,0]);e.setSafeInt16(a.ascent);e.setSafeInt16(a.descent);e.skip(2);e.setArray([255,255]);e.skip(6);e.setSafeInt16(a.capHeight);e.setSafeInt16(Math.tan(a.italicAngle)*a.xHeight);e.skip(12);e.setInt16(f);return e.data}());u.addTable("hmtx",function fontTableHmtx(){const e=t.charstrings,a=t.cff?.widths??null,n=new TrueTypeTableBuilder({exactLength:4*f});n.skip(4);for(let t=1,s=f;t=65520&&e<=65535?0:e>=62976&&e<=63743?dn()[e]||e:173===e?45:e}(a)}this.isType3Font&&(s=a);let c=null;if(this.seacMap?.[e]){f=!0;const t=this.seacMap[e];a=t.baseFontCharCode;c={fontChar:String.fromCodePoint(t.accentFontCharCode),offset:t.accentOffset}}let h="";"number"==typeof a&&(a<=1114111?h=String.fromCodePoint(a):warn(`charToGlyph - invalid fontCharCode: ${a}`));if(this.missingFile&&this.vertical&&1===h.length){const e=An()[h.charCodeAt(0)];e&&(h=l=String.fromCharCode(e))}r=new fonts_Glyph(e,h,l,c,n,o,s,t,f);this.#ne.set(e,r);return r}charsToGlyphs(e){let t=this.#ae.get(e);if(t)return t;t=[];if(this.cMap){const a=Object.create(null),n=e.length;let s=0;for(;st.length%2==1,n=this.toUnicode instanceof IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let s=0,r=e.length;s55295&&(r<57344||r>65533)&&s++;if(this.toUnicode){const e=n(r);if(-1!==e){if(hasCurrentBufErrors()){t.push(a.join(""));a.length=0}for(let t=(this.cMap?this.cMap.getCharCodeLength(e):1)-1;t>=0;t--)a.push(String.fromCharCode(e>>8*t&255));continue}}if(!hasCurrentBufErrors()){t.push(a.join(""));a.length=0}a.push(String.fromCodePoint(r))}t.push(a.join(""));return t}}class ErrorFont{constructor(e){this.error=e;this.loadedName="g_font_error";this.missingFile=!0}charsToGlyphs(){return[]}encodeString(e){return[e]}exportData(){return{error:this.error}}}const os=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.54657,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.73293,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.9121,.86943,.79795,.88198,.77958,.70864,.81055,.90399,.88653,.96017,.82577,.77892,.78257,.97507,1.54657,.97507,.85284,.89552,.90176,.88762,.8785,.75241,.8785,.90518,.95015,.77618,.8785,.88401,.91916,.86304,.88401,.91488,.8785,.8801,.8785,.8785,.91343,.7173,1.04106,.8785,.85075,.95794,.82616,.85162,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.12401,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.73293,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.9121,.86943,.86943,.86943,.86943,.86943,.85284,.87508,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.88762,.88762,.88762,.88762,.88762,.88762,.8715,.75241,.90518,.90518,.90518,.90518,.88401,.88401,.88401,.88401,.8785,.8785,.8801,.8801,.8801,.8801,.8801,.90747,.89049,.8785,.8785,.8785,.8785,.85162,.8785,.85162,.83908,.88762,.83908,.88762,.83908,.88762,.73293,.75241,.73293,.75241,.73293,.75241,.73293,.75241,.87289,.83016,.88506,.93125,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.81921,.77618,.81921,.77618,.81921,.77618,1,1,.87356,.8785,.91075,.89608,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76229,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.79468,.91926,.88175,.70823,.94903,.9121,.8785,1,1,.9121,.8785,.87802,.88656,.8785,.86943,.8801,.86943,.8801,.86943,.8801,.87402,.89291,.77958,.91343,1,1,.77958,.91343,.70864,.7173,.70864,.7173,.70864,.7173,.70864,.7173,1,1,.81055,.75841,.81055,1.06452,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.96017,.95794,.77892,.85162,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.88762,.77539,.8715,.87508,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70674,.98387,.94721,1.33431,1.45894,.95161,1.06303,.83908,.80352,.57184,.6965,.56289,.82001,.56029,.81235,1.02988,.83908,.7762,.68156,.80367,.73133,.78257,.87356,.86943,.95958,.75727,.89019,1.04924,.9121,.7648,.86943,.87356,.79795,.78275,.81055,.77892,.9762,.82577,.99819,.84896,.95958,.77892,.96108,1.01407,.89049,1.02988,.94211,.96108,.8936,.84021,.87842,.96399,.79109,.89049,1.00813,1.02988,.86077,.87445,.92099,.84723,.86513,.8801,.75638,.85714,.78216,.79586,.87965,.94211,.97747,.78287,.97926,.84971,1.02988,.94211,.8801,.94211,.84971,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90264,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.90518,1,1,1,1,1,1,1,1,1,1,1,1,.90548,1,1,1,1,1,1,.96017,.95794,.96017,.95794,.96017,.95794,.77892,.85162,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.92794,.87012,.87012,.87012,.89552,.89552,1.42259,.71143,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.93835,.83406,.91133,.84107,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90527,1.81055,.90527,1.81055,1.31006,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],ls={lineHeight:1.2207,lineGap:.2207},fs=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.56239,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.71805,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.90872,.85938,.79795,.87068,.77958,.69766,.81055,.90399,.88653,.96068,.82577,.77892,.78257,.97507,1.529,.97507,.85284,.89552,.90176,.94908,.86411,.74012,.86411,.88323,.95015,.86411,.86331,.88401,.91916,.86304,.88401,.9039,.86331,.86331,.86411,.86411,.90464,.70852,1.04106,.86331,.84372,.95794,.82616,.84548,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.19129,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.71805,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.90872,.85938,.85938,.85938,.85938,.85938,.85284,.87068,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.94908,.94908,.94908,.94908,.94908,.94908,.85887,.74012,.88323,.88323,.88323,.88323,.88401,.88401,.88401,.88401,.8785,.86331,.86331,.86331,.86331,.86331,.86331,.90747,.89049,.86331,.86331,.86331,.86331,.84548,.86411,.84548,.83908,.94908,.83908,.94908,.83908,.94908,.71805,.74012,.71805,.74012,.71805,.74012,.71805,.74012,.87289,.79538,.88506,.92726,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.81921,.86411,.81921,.86411,.81921,.86411,1,1,.87356,.86331,.91075,.8777,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76467,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.77312,.91926,.88175,.70823,.94903,.90872,.86331,1,1,.90872,.86331,.86906,.88116,.86331,.85938,.86331,.85938,.86331,.85938,.86331,.87402,.86549,.77958,.90464,1,1,.77958,.90464,.69766,.70852,.69766,.70852,.69766,.70852,.69766,.70852,1,1,.81055,.75841,.81055,1.06452,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.96068,.95794,.77892,.84548,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.94908,.77539,.85887,.87068,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70088,.98387,.94721,1.33431,1.45894,.95161,1.48387,.83908,.80352,.57118,.6965,.56347,.79179,.55853,.80346,1.02988,.83908,.7762,.67174,.86036,.73133,.78257,.87356,.86441,.95958,.75727,.89019,1.04924,.90872,.74889,.85938,.87891,.79795,.7957,.81055,.77892,.97447,.82577,.97466,.87179,.95958,.77892,.94252,.95612,.8753,1.02988,.92733,.94252,.87411,.84021,.8728,.95612,.74081,.8753,1.02189,1.02988,.84814,.87445,.91822,.84723,.85668,.86331,.81344,.87581,.76422,.82046,.96057,.92733,.99375,.78022,.95452,.86015,1.02988,.92733,.86331,.92733,.86015,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90631,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.88323,1,1,1,1,1,1,1,1,1,1,1,1,.85174,1,1,1,1,1,1,.96068,.95794,.96068,.95794,.96068,.95794,.77892,.84548,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.89807,.87012,.87012,.87012,.89552,.89552,1.42259,.71094,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.92972,.83406,.91133,.83326,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90616,1.81055,.90527,1.81055,1.3107,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],cs={lineHeight:1.2207,lineGap:.2207},hs=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39543,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.72346,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89249,.84118,.77452,.85374,.75186,.67789,.79776,.88844,.85066,.94309,.77818,.7306,.76659,1.10369,1.38313,1.10369,1.06139,.89552,.8739,.9245,.9245,.83203,.9245,.85865,1.09842,.9245,.9245,1.03297,1.07692,.90918,1.03297,.94959,.9245,.92274,.9245,.9245,1.02933,.77832,1.20562,.9245,.8916,.98986,.86621,.89453,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.16359,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.72346,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89249,.84118,.84118,.84118,.84118,.84118,.85284,.84557,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.9245,.9245,.9245,.9245,.9245,.9245,.84843,.83203,.85865,.85865,.85865,.85865,.82601,.82601,.82601,.82601,.94469,.9245,.92274,.92274,.92274,.92274,.92274,.90747,.86651,.9245,.9245,.9245,.9245,.89453,.9245,.89453,.8675,.9245,.8675,.9245,.8675,.9245,.72346,.83203,.72346,.83203,.72346,.83203,.72346,.83203,.85193,.8875,.86477,.99034,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.81105,.9245,.81105,.9245,.81105,.9245,1,1,.86275,.9245,.90872,.93591,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77896,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.9375,.98156,.93407,.77261,1.11429,.89249,.9245,1,1,.89249,.9245,.92534,.86698,.9245,.84118,.92274,.84118,.92274,.84118,.92274,.8667,.86291,.75186,1.02933,1,1,.75186,1.02933,.67789,.77832,.67789,.77832,.67789,.77832,.67789,.77832,1,1,.79776,.97655,.79776,1.23023,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.94309,.98986,.7306,.89453,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.9245,.76318,.84843,.84557,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67009,.96334,.93695,1.35191,1.40909,.95161,1.48387,.8675,.90861,.6192,.7363,.64824,.82411,.56321,.85696,1.23516,.8675,.81552,.7286,.84134,.73206,.76659,.86275,.84369,.90685,.77892,.85871,1.02638,.89249,.75828,.84118,.85984,.77452,.76466,.79776,.7306,.90782,.77818,.903,.87291,.90685,.7306,.99058,1.03667,.94635,1.23516,.9849,.99058,.92393,.8916,.942,1.03667,.75026,.94635,1.0297,1.23516,.90918,.94048,.98217,.89746,.84153,.92274,.82507,.88832,.84438,.88178,1.03525,.9849,1.00225,.78086,.97248,.89404,1.23516,.9849,.92274,.9849,.89404,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.89693,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.85865,1,1,1,1,1,1,1,1,1,1,1,1,.90933,1,1,1,1,1,1,.94309,.98986,.94309,.98986,.94309,.98986,.7306,.89453,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.68994,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.97858,.82616,.91133,.83437,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90572,1.81055,.90749,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85284,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],us={lineHeight:1.2207,lineGap:.2207},ms=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39016,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.73834,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89385,.85122,.77452,.86503,.75186,.68887,.79776,.88844,.85066,.94258,.77818,.7306,.76659,1.10369,1.39016,1.10369,1.06139,.89552,.8739,.86128,.94469,.8457,.94469,.89464,1.09842,.84636,.94469,1.03297,1.07692,.90918,1.03297,.95897,.94469,.9482,.94469,.94469,1.04692,.78223,1.20562,.94469,.90332,.98986,.86621,.90527,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.08707,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.73834,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89385,.85122,.85122,.85122,.85122,.85122,.85284,.85311,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.86128,.86128,.86128,.86128,.86128,.86128,.8693,.8457,.89464,.89464,.89464,.89464,.82601,.82601,.82601,.82601,.94469,.94469,.9482,.9482,.9482,.9482,.9482,.90747,.86651,.94469,.94469,.94469,.94469,.90527,.94469,.90527,.8675,.86128,.8675,.86128,.8675,.86128,.73834,.8457,.73834,.8457,.73834,.8457,.73834,.8457,.85193,.92454,.86477,.9921,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.81105,.84636,.81105,.84636,.81105,.84636,1,1,.86275,.94469,.90872,.95786,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77741,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.90452,.98156,1.11842,.77261,1.11429,.89385,.94469,1,1,.89385,.94469,.95877,.86901,.94469,.85122,.9482,.85122,.9482,.85122,.9482,.8667,.90016,.75186,1.04692,1,1,.75186,1.04692,.68887,.78223,.68887,.78223,.68887,.78223,.68887,.78223,1,1,.79776,.92188,.79776,1.23023,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.94258,.98986,.7306,.90527,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.86128,.76318,.8693,.85311,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67742,.96334,.93695,1.35191,1.40909,.95161,1.48387,.86686,.90861,.62267,.74359,.65649,.85498,.56963,.88254,1.23516,.8675,.81552,.75443,.84503,.73206,.76659,.86275,.85122,.90685,.77892,.85746,1.02638,.89385,.75657,.85122,.86275,.77452,.74171,.79776,.7306,.95165,.77818,.89772,.88831,.90685,.7306,.98142,1.02191,.96576,1.23516,.99018,.98142,.9236,.89258,.94035,1.02191,.78848,.96576,.9561,1.23516,.90918,.92578,.95424,.89746,.83969,.9482,.80113,.89442,.85208,.86155,.98022,.99018,1.00452,.81209,.99247,.89181,1.23516,.99018,.9482,.99018,.89181,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.88844,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89464,1,1,1,1,1,1,1,1,1,1,1,1,.96766,1,1,1,1,1,1,.94258,.98986,.94258,.98986,.94258,.98986,.7306,.90527,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.69043,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.99331,.82616,.91133,.84286,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90527,1.81055,.90527,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1.07185,.99413,.96334,1.08065,1,1,1,1,1,1,1,1,1,1,1],ps={lineHeight:1.2207,lineGap:.2207},ds=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.03374,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.00042,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.03828,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00034,.99977,1,.99997,1.00026,1.00078,1.00036,.99973,1.00013,1.0006,.99977,.99977,.99988,.85148,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,1.00069,1.00022,.99977,1.00001,.99984,1.00026,1.00001,1.00024,1.00001,.9999,1,1.0006,1.00001,1.00041,.99962,1.00026,1.0006,.99995,1.00041,.99942,.99973,.99927,1.00082,.99902,1.00026,1.00087,1.0006,1.00069,.99973,.99867,.99973,.9993,1.00026,1.00049,1.00056,1,.99988,.99935,.99995,.99954,1.00055,.99945,1.00032,1.0006,.99995,1.00026,.99995,1.00032,1.00001,1.00008,.99971,1.00019,.9994,1.00001,1.0006,1.00044,.99973,1.00023,1.00047,1,.99942,.99561,.99989,1.00035,.99977,1.00035,.99977,1.00019,.99944,1.00001,1.00021,.99926,1.00035,1.00035,.99942,1.00048,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.99989,1.00057,1.00001,.99936,1.00052,1.00012,.99996,1.00043,1,1.00035,.9994,.99976,1.00035,.99973,1.00052,1.00041,1.00119,1.00037,.99973,1.00002,.99986,1.00041,1.00041,.99902,.9996,1.00034,.99999,1.00026,.99999,1.00026,.99973,1.00052,.99973,1,.99973,1.00041,1.00075,.9994,1.0003,.99999,1,1.00041,.99955,1,.99915,.99973,.99973,1.00026,1.00119,.99955,.99973,1.0006,.99911,1.0006,1.00026,.99972,1.00026,.99902,1.00041,.99973,.99999,1,1,1.00038,1.0005,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,1.00047,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],gs={lineHeight:1.2,lineGap:.2},bs=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.0044,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99971,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.01011,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99977,1,1,1.00026,.99969,.99972,.99981,.9998,1.0006,.99977,.99977,1.00022,.91155,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,.99966,1.00022,1.00032,1.00001,.99944,1.00026,1.00001,.99968,1.00001,1.00047,1,1.0006,1.00001,.99981,1.00101,1.00026,1.0006,.99948,.99981,1.00064,.99973,.99942,1.00101,1.00061,1.00026,1.00069,1.0006,1.00014,.99973,1.01322,.99973,1.00065,1.00026,1.00012,.99923,1,1.00064,1.00076,.99948,1.00055,1.00063,1.00007,.99943,1.0006,.99948,1.00026,.99948,.99943,1.00001,1.00001,1.00029,1.00038,1.00035,1.00001,1.0006,1.0006,.99973,.99978,1.00001,1.00057,.99989,.99967,.99964,.99967,.99977,.99999,.99977,1.00038,.99977,1.00001,.99973,1.00066,.99967,.99967,1.00041,.99998,.99999,.99977,1.00022,.99967,1.00001,.99977,1.00026,.99964,1.00031,1.00001,.99999,.99999,1,1.00023,1,1,.99999,1.00035,1.00001,.99999,.99973,.99977,.99999,1.00058,.99973,.99973,.99955,.9995,1.00026,1.00026,1.00032,.99989,1.00034,.99999,1.00026,1.00026,1.00026,.99973,.45998,.99973,1.00026,.99973,1.00001,.99999,.99982,.99994,.99996,1,1.00042,1.00044,1.00029,1.00023,.99973,.99973,1.00026,.99949,1.00002,.99973,1.0006,1.0006,1.0006,.99975,1.00026,1.00026,1.00032,.98685,.99973,1.00026,1,1,.99966,1.00044,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1,.99973,.99971,.99978,1,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00098,1,1,1,1.00049,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],ws={lineHeight:1.35,lineGap:.2},js=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.0288,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,.99946,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.06311,.99973,1.00024,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,1.00041,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.89547,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00001,1,1.00054,.99977,1.00084,1.00007,.99973,1.00013,.99924,1.00001,1.00001,.99945,.91221,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00001,.99999,.99977,.99933,1.00022,1.00054,1.00001,1.00065,1.00026,1.00001,1.0001,1.00001,1.00052,1,1.0006,1.00001,.99945,.99897,.99968,.99924,1.00036,.99945,.99949,1,1.0006,.99897,.99918,.99968,.99911,.99924,1,.99962,1.01487,1,1.0005,.99973,1.00012,1.00043,1,.99995,.99994,1.00036,.99947,1.00019,1.00063,1.00025,.99924,1.00036,.99973,1.00036,1.00025,1.00001,1.00001,1.00027,1.0001,1.00068,1.00001,1.0006,1.0006,1,1.00008,.99957,.99972,.9994,.99954,.99975,1.00051,1.00001,1.00019,1.00001,1.0001,.99986,1.00001,1.00001,1.00038,.99954,.99954,.9994,1.00066,.99999,.99977,1.00022,1.00054,1.00001,.99977,1.00026,.99975,1.0001,1.00001,.99993,.9995,.99955,1.00016,.99978,.99974,1.00019,1.00022,.99955,1.00053,.99973,1.00089,1.00005,.99967,1.00048,.99973,1.00002,1.00034,.99973,.99973,.99964,1.00006,1.00066,.99947,.99973,.98894,.99973,1,.44898,1,.99946,1,1.00039,1.00082,.99991,.99991,.99985,1.00022,1.00023,1.00061,1.00006,.99966,.99973,.99973,.99973,1.00019,1.0008,1,.99924,.99924,.99924,.99983,1.00044,.99973,.99964,.98332,1,.99973,1,1,.99962,.99895,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,1.00423,.99925,.99999,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00049,1,1.00245,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,1.00003,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],ks={lineHeight:1.35,lineGap:.2},ys=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.04596,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,1.00019,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.02572,.99973,1.00005,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,.99999,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.84533,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99928,1,.99977,1.00013,1.00055,.99947,.99945,.99941,.99924,1.00001,1.00001,1.0004,.91621,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00005,.99999,.99977,1.00015,1.00022,.99977,1.00001,.99973,1.00026,1.00001,1.00019,1.00001,.99946,1,1.0006,1.00001,.99978,1.00045,.99973,.99924,1.00023,.99978,.99966,1,1.00065,1.00045,1.00019,.99973,.99973,.99924,1,1,.96499,1,1.00055,.99973,1.00008,1.00027,1,.9997,.99995,1.00023,.99933,1.00019,1.00015,1.00031,.99924,1.00023,.99973,1.00023,1.00031,1.00001,.99928,1.00029,1.00092,1.00035,1.00001,1.0006,1.0006,1,.99988,.99975,1,1.00082,.99561,.9996,1.00035,1.00001,.99962,1.00001,1.00092,.99964,1.00001,.99963,.99999,1.00035,1.00035,1.00082,.99962,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.9996,.99967,1.00001,1.00034,1.00074,1.00054,1.00053,1.00063,.99971,.99962,1.00035,.99975,.99977,.99973,1.00043,.99953,1.0007,.99915,.99973,1.00008,.99892,1.00073,1.00073,1.00114,.99915,1.00073,.99955,.99973,1.00092,.99973,1,.99998,1,1.0003,1,1.00043,1.00001,.99969,1.0003,1,1.00035,1.00001,.9995,1,1.00092,.99973,.99973,.99973,1.0007,.9995,1,.99924,1.0006,.99924,.99972,1.00062,.99973,1.00114,1.00073,1,.99955,1,1,1.00047,.99968,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,.99925,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],qs={lineHeight:1.2,lineGap:.2},vs=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,719,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,785,556,556,278,722,556,556,611,278,611,278,611,385,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,465,722,333,853,906,474,825,927,838,278,722,722,601,719,667,611,722,778,278,722,667,833,722,644,778,722,667,600,611,667,821,667,809,802,278,667,615,451,611,278,582,615,610,556,606,475,460,611,541,278,558,556,612,556,445,611,766,619,520,684,446,582,715,576,753,845,278,582,611,582,845,667,669,885,567,711,667,278,276,556,1094,1062,875,610,722,622,719,722,719,722,567,712,667,904,626,719,719,610,702,833,722,778,719,667,722,611,622,854,667,730,703,1005,1019,870,979,719,711,1031,719,556,618,615,417,635,556,709,497,615,615,500,635,740,604,611,604,611,556,490,556,875,556,615,581,833,844,729,854,615,552,854,583,556,556,611,417,552,556,278,281,278,969,906,611,500,615,556,604,778,611,487,447,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1094,556,885,489,1115,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333],Ss=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],As=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,740,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,782,556,556,278,722,556,556,611,278,611,278,611,396,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,333,722,333,854,906,473,844,930,847,278,722,722,610,671,667,611,722,778,278,722,667,833,722,657,778,718,667,590,611,667,822,667,829,781,278,667,620,479,611,278,591,620,621,556,610,479,492,611,558,278,566,556,603,556,450,611,712,605,532,664,409,591,704,578,773,834,278,591,611,591,834,667,667,886,614,719,667,278,278,556,1094,1042,854,622,719,677,719,722,708,722,614,722,667,927,643,719,719,615,687,833,722,778,719,667,722,611,677,781,667,729,708,979,989,854,1e3,708,719,1042,729,556,619,604,534,618,556,736,510,611,611,507,622,740,604,611,611,611,556,889,556,885,556,646,583,889,935,707,854,594,552,865,589,556,556,611,469,563,556,278,278,278,969,906,611,507,619,556,611,778,611,575,467,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1104,556,885,516,1146,1e3,768,600,834,834,834,834,999,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333],xs=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Cs=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,625,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,733,444,500,222,667,500,500,556,222,556,222,556,281,556,400,556,222,722,556,722,556,722,556,615,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,354,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,789,846,389,794,865,775,222,667,667,570,671,667,611,722,778,278,667,667,833,722,648,778,725,667,600,611,667,837,667,831,761,278,667,570,439,555,222,550,570,571,500,556,439,463,555,542,222,500,492,548,500,447,556,670,573,486,603,374,550,652,546,728,779,222,550,556,550,779,667,667,843,544,708,667,278,278,500,1066,982,844,589,715,639,724,667,651,667,544,704,667,917,614,715,715,589,686,833,722,778,725,667,722,611,639,795,667,727,673,920,923,805,886,651,694,1022,682,556,562,522,493,553,556,688,465,556,556,472,564,686,550,556,556,556,500,833,500,835,500,572,518,830,851,621,736,526,492,752,534,556,556,556,378,496,500,222,222,222,910,828,556,472,565,500,556,778,556,492,339,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1083,1e3,768,600,834,834,834,834,1e3,500,998,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,584,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285],Is=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Fs=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,615,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,735,444,500,222,667,500,500,556,222,556,222,556,292,556,334,556,222,722,556,722,556,722,556,604,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,375,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,784,838,384,774,855,752,222,667,667,551,668,667,611,722,778,278,667,668,833,722,650,778,722,667,618,611,667,798,667,835,748,278,667,578,446,556,222,547,578,575,500,557,446,441,556,556,222,500,500,576,500,448,556,690,569,482,617,395,547,648,525,713,781,222,547,556,547,781,667,667,865,542,719,667,278,278,500,1057,1010,854,583,722,635,719,667,656,667,542,677,667,923,604,719,719,583,656,833,722,778,719,667,722,611,635,760,667,740,667,917,938,792,885,656,719,1010,722,556,573,531,365,583,556,669,458,559,559,438,583,688,552,556,542,556,500,458,500,823,500,573,521,802,823,625,719,521,510,750,542,556,556,556,365,510,500,222,278,222,906,812,556,438,559,500,552,778,556,489,411,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1073,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285],Ts=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Os=[1.36898,1,1,.72706,.80479,.83734,.98894,.99793,.9897,.93884,.86209,.94292,.94292,1.16661,1.02058,.93582,.96694,.93582,1.19137,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.78076,.78076,1.02058,1.02058,1.02058,.72851,.78966,.90838,.83637,.82391,.96376,.80061,.86275,.8768,.95407,1.0258,.73901,.85022,.83655,1.0156,.95546,.92179,.87107,.92179,.82114,.8096,.89713,.94438,.95353,.94083,.91905,.90406,.9446,.94292,1.18777,.94292,1.02058,.89903,.90088,.94938,.97898,.81093,.97571,.94938,1.024,.9577,.95933,.98621,1.0474,.97455,.98981,.9672,.95933,.9446,.97898,.97407,.97646,.78036,1.10208,.95442,.95298,.97579,.9332,.94039,.938,.80687,1.01149,.80687,1.02058,.80479,.99793,.99793,.99793,.99793,1.01149,1.00872,.90088,.91882,1.0213,.8361,1.02058,.62295,.54324,.89022,1.08595,1,1,.90088,1,.97455,.93582,.90088,1,1.05686,.8361,.99642,.99642,.99642,.72851,.90838,.90838,.90838,.90838,.90838,.90838,.868,.82391,.80061,.80061,.80061,.80061,1.0258,1.0258,1.0258,1.0258,.97484,.95546,.92179,.92179,.92179,.92179,.92179,1.02058,.92179,.94438,.94438,.94438,.94438,.90406,.86958,.98225,.94938,.94938,.94938,.94938,.94938,.94938,.9031,.81093,.94938,.94938,.94938,.94938,.98621,.98621,.98621,.98621,.93969,.95933,.9446,.9446,.9446,.9446,.9446,1.08595,.9446,.95442,.95442,.95442,.95442,.94039,.97898,.94039,.90838,.94938,.90838,.94938,.90838,.94938,.82391,.81093,.82391,.81093,.82391,.81093,.82391,.81093,.96376,.84313,.97484,.97571,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.8768,.9577,.8768,.9577,.8768,.9577,1,1,.95407,.95933,.97069,.95933,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,.887,1.01591,.73901,1.0474,1,1,.97455,.83655,.98981,1,1,.83655,.73977,.83655,.73903,.84638,1.033,.95546,.95933,1,1,.95546,.95933,.8271,.95417,.95933,.92179,.9446,.92179,.9446,.92179,.9446,.936,.91964,.82114,.97646,1,1,.82114,.97646,.8096,.78036,.8096,.78036,1,1,.8096,.78036,1,1,.89713,.77452,.89713,1.10208,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94083,.97579,.90406,.94039,.90406,.9446,.938,.9446,.938,.9446,.938,1,.99793,.90838,.94938,.868,.9031,.92179,.9446,1,1,.89713,1.10208,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90989,.9358,.91945,.83181,.75261,.87992,.82976,.96034,.83689,.97268,1.0078,.90838,.83637,.8019,.90157,.80061,.9446,.95407,.92436,1.0258,.85022,.97153,1.0156,.95546,.89192,.92179,.92361,.87107,.96318,.89713,.93704,.95638,.91905,.91709,.92796,1.0258,.93704,.94836,1.0373,.95933,1.0078,.95871,.94836,.96174,.92601,.9498,.98607,.95776,.95933,1.05453,1.0078,.98275,.9314,.95617,.91701,1.05993,.9446,.78367,.9553,1,.86832,1.0128,.95871,.99394,.87548,.96361,.86774,1.0078,.95871,.9446,.95871,.86774,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.94083,.97579,.94083,.97579,.94083,.97579,.90406,.94039,.96694,1,.89903,1,1,1,.93582,.93582,.93582,1,.908,.908,.918,.94219,.94219,.96544,1,1.285,1,1,.81079,.81079,1,1,.74854,1,1,1,1,.99793,1,1,1,.65,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.17173,1,.80535,.76169,1.02058,1.0732,1.05486,1,1,1.30692,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.16161,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Rs={lineHeight:1.2,lineGap:.2},Hs=[1.36898,1,1,.66227,.80779,.81625,.97276,.97276,.97733,.92222,.83266,.94292,.94292,1.16148,1.02058,.93582,.96694,.93582,1.17337,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.78076,.78076,1.02058,1.02058,1.02058,.71541,.76813,.85576,.80591,.80729,.94299,.77512,.83655,.86523,.92222,.98621,.71743,.81698,.79726,.98558,.92222,.90637,.83809,.90637,.80729,.76463,.86275,.90699,.91605,.9154,.85308,.85458,.90531,.94292,1.21296,.94292,1.02058,.89903,1.18616,.99613,.91677,.78216,.91677,.90083,.98796,.9135,.92168,.95381,.98981,.95298,.95381,.93459,.92168,.91513,.92004,.91677,.95077,.748,1.04502,.91677,.92061,.94236,.89544,.89364,.9,.80687,.8578,.80687,1.02058,.80779,.97276,.97276,.97276,.97276,.8578,.99973,1.18616,.91339,1.08074,.82891,1.02058,.55509,.71526,.89022,1.08595,1,1,1.18616,1,.96736,.93582,1.18616,1,1.04864,.82711,.99043,.99043,.99043,.71541,.85576,.85576,.85576,.85576,.85576,.85576,.845,.80729,.77512,.77512,.77512,.77512,.98621,.98621,.98621,.98621,.95961,.92222,.90637,.90637,.90637,.90637,.90637,1.02058,.90251,.90699,.90699,.90699,.90699,.85458,.83659,.94951,.99613,.99613,.99613,.99613,.99613,.99613,.85811,.78216,.90083,.90083,.90083,.90083,.95381,.95381,.95381,.95381,.9135,.92168,.91513,.91513,.91513,.91513,.91513,1.08595,.91677,.91677,.91677,.91677,.91677,.89364,.92332,.89364,.85576,.99613,.85576,.99613,.85576,.99613,.80729,.78216,.80729,.78216,.80729,.78216,.80729,.78216,.94299,.76783,.95961,.91677,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.86523,.9135,.86523,.9135,.86523,.9135,1,1,.92222,.92168,.92222,.92168,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.86036,.97096,.71743,.98981,1,1,.95298,.79726,.95381,1,1,.79726,.6894,.79726,.74321,.81691,1.0006,.92222,.92168,1,1,.92222,.92168,.79464,.92098,.92168,.90637,.91513,.90637,.91513,.90637,.91513,.909,.87514,.80729,.95077,1,1,.80729,.95077,.76463,.748,.76463,.748,1,1,.76463,.748,1,1,.86275,.72651,.86275,1.04502,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.9154,.94236,.85458,.89364,.85458,.90531,.9,.90531,.9,.90531,.9,1,.97276,.85576,.99613,.845,.85811,.90251,.91677,1,1,.86275,1.04502,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.00899,1.30628,.85576,.80178,.66862,.7927,.69323,.88127,.72459,.89711,.95381,.85576,.80591,.7805,.94729,.77512,.90531,.92222,.90637,.98621,.81698,.92655,.98558,.92222,.85359,.90637,.90976,.83809,.94523,.86275,.83509,.93157,.85308,.83392,.92346,.98621,.83509,.92886,.91324,.92168,.95381,.90646,.92886,.90557,.86847,.90276,.91324,.86842,.92168,.99531,.95381,.9224,.85408,.92699,.86847,1.0051,.91513,.80487,.93481,1,.88159,1.05214,.90646,.97355,.81539,.89398,.85923,.95381,.90646,.91513,.90646,.85923,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9154,.94236,.9154,.94236,.9154,.94236,.85458,.89364,.96694,1,.89903,1,1,1,.91782,.91782,.91782,1,.896,.896,.896,.9332,.9332,.95973,1,1.26,1,1,.80479,.80178,1,1,.85633,1,1,1,1,.97276,1,1,1,.698,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.14542,1,.79199,.78694,1.02058,1.03493,1.05486,1,1,1.23026,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.20006,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Bs={lineHeight:1.2,lineGap:.2},Ds=[1.36898,1,1,.65507,.84943,.85639,.88465,.88465,.86936,.88307,.86948,.85283,.85283,1.06383,1.02058,.75945,.9219,.75945,1.17337,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.75945,.75945,1.02058,1.02058,1.02058,.69046,.70926,.85158,.77812,.76852,.89591,.70466,.76125,.80094,.86822,.83864,.728,.77212,.79475,.93637,.87514,.8588,.76013,.8588,.72421,.69866,.77598,.85991,.80811,.87832,.78112,.77512,.8562,1.0222,1.18417,1.0222,1.27014,.89903,1.15012,.93859,.94399,.846,.94399,.81453,1.0186,.94219,.96017,1.03075,1.02175,.912,1.03075,.96998,.96017,.93859,.94399,.94399,.95493,.746,1.12658,.94578,.91,.979,.882,.882,.83,.85034,.83537,.85034,1.02058,.70869,.88465,.88465,.88465,.88465,.83537,.90083,1.15012,.9161,.94565,.73541,1.02058,.53609,.69353,.79519,1.08595,1,1,1.15012,1,.91974,.75945,1.15012,1,.9446,.73361,.9005,.9005,.9005,.62864,.85158,.85158,.85158,.85158,.85158,.85158,.773,.76852,.70466,.70466,.70466,.70466,.83864,.83864,.83864,.83864,.90561,.87514,.8588,.8588,.8588,.8588,.8588,1.02058,.85751,.85991,.85991,.85991,.85991,.77512,.76013,.88075,.93859,.93859,.93859,.93859,.93859,.93859,.8075,.846,.81453,.81453,.81453,.81453,.82424,.82424,.82424,.82424,.9278,.96017,.93859,.93859,.93859,.93859,.93859,1.08595,.8562,.94578,.94578,.94578,.94578,.882,.94578,.882,.85158,.93859,.85158,.93859,.85158,.93859,.76852,.846,.76852,.846,.76852,.846,.76852,.846,.89591,.8544,.90561,.94399,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.80094,.94219,.80094,.94219,.80094,.94219,1,1,.86822,.96017,.86822,.96017,.83864,.82424,.83864,.82424,.83864,.82424,.83864,1.03075,.83864,.82424,.81402,1.02738,.728,1.02175,1,1,.912,.79475,1.03075,1,1,.79475,.83911,.79475,.66266,.80553,1.06676,.87514,.96017,1,1,.87514,.96017,.86865,.87396,.96017,.8588,.93859,.8588,.93859,.8588,.93859,.867,.84759,.72421,.95493,1,1,.72421,.95493,.69866,.746,.69866,.746,1,1,.69866,.746,1,1,.77598,.88417,.77598,1.12658,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.87832,.979,.77512,.882,.77512,.8562,.83,.8562,.83,.8562,.83,1,.88465,.85158,.93859,.773,.8075,.85751,.8562,1,1,.77598,1.12658,1.15012,1.15012,1.15012,1.15012,1.15012,1.15313,1.15012,1.15012,1.15012,1.08106,1.03901,.85158,.77025,.62264,.7646,.65351,.86026,.69461,.89947,1.03075,.85158,.77812,.76449,.88836,.70466,.8562,.86822,.8588,.83864,.77212,.85308,.93637,.87514,.82352,.8588,.85701,.76013,.89058,.77598,.8156,.82565,.78112,.77899,.89386,.83864,.8156,.9486,.92388,.96186,1.03075,.91123,.9486,.93298,.878,.93942,.92388,.84596,.96186,.95119,1.03075,.922,.88787,.95829,.88,.93559,.93859,.78815,.93758,1,.89217,1.03737,.91123,.93969,.77487,.85769,.86799,1.03075,.91123,.93859,.91123,.86799,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87832,.979,.87832,.979,.87832,.979,.77512,.882,.9219,1,.89903,1,1,1,.87321,.87321,.87321,1,1.027,1.027,1.027,.86847,.86847,.79121,1,1.124,1,1,.73572,.73572,1,1,.85034,1,1,1,1,.88465,1,1,1,.669,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.04828,1,.74948,.75187,1.02058,.98391,1.02119,1,1,1.06233,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05233,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Ms={lineHeight:1.2,lineGap:.2},Ns=[1.36898,1,1,.76305,.82784,.94935,.89364,.92241,.89073,.90706,.98472,.85283,.85283,1.0664,1.02058,.74505,.9219,.74505,1.23456,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.74505,.74505,1.02058,1.02058,1.02058,.73002,.72601,.91755,.8126,.80314,.92222,.73764,.79726,.83051,.90284,.86023,.74,.8126,.84869,.96518,.91115,.8858,.79761,.8858,.74498,.73914,.81363,.89591,.83659,.89633,.85608,.8111,.90531,1.0222,1.22736,1.0222,1.27014,.89903,.90088,.86667,1.0231,.896,1.01411,.90083,1.05099,1.00512,.99793,1.05326,1.09377,.938,1.06226,1.00119,.99793,.98714,1.0231,1.01231,.98196,.792,1.19137,.99074,.962,1.01915,.926,.942,.856,.85034,.92006,.85034,1.02058,.69067,.92241,.92241,.92241,.92241,.92006,.9332,.90088,.91882,.93484,.75339,1.02058,.56866,.54324,.79519,1.08595,1,1,.90088,1,.95325,.74505,.90088,1,.97198,.75339,.91009,.91009,.91009,.66466,.91755,.91755,.91755,.91755,.91755,.91755,.788,.80314,.73764,.73764,.73764,.73764,.86023,.86023,.86023,.86023,.92915,.91115,.8858,.8858,.8858,.8858,.8858,1.02058,.8858,.89591,.89591,.89591,.89591,.8111,.79611,.89713,.86667,.86667,.86667,.86667,.86667,.86667,.86936,.896,.90083,.90083,.90083,.90083,.84224,.84224,.84224,.84224,.97276,.99793,.98714,.98714,.98714,.98714,.98714,1.08595,.89876,.99074,.99074,.99074,.99074,.942,1.0231,.942,.91755,.86667,.91755,.86667,.91755,.86667,.80314,.896,.80314,.896,.80314,.896,.80314,.896,.92222,.93372,.92915,1.01411,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.83051,1.00512,.83051,1.00512,.83051,1.00512,1,1,.90284,.99793,.90976,.99793,.86023,.84224,.86023,.84224,.86023,.84224,.86023,1.05326,.86023,.84224,.82873,1.07469,.74,1.09377,1,1,.938,.84869,1.06226,1,1,.84869,.83704,.84869,.81441,.85588,1.08927,.91115,.99793,1,1,.91115,.99793,.91887,.90991,.99793,.8858,.98714,.8858,.98714,.8858,.98714,.894,.91434,.74498,.98196,1,1,.74498,.98196,.73914,.792,.73914,.792,1,1,.73914,.792,1,1,.81363,.904,.81363,1.19137,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89633,1.01915,.8111,.942,.8111,.90531,.856,.90531,.856,.90531,.856,1,.92241,.91755,.86667,.788,.86936,.8858,.89876,1,1,.81363,1.19137,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90388,1.03901,.92138,.78105,.7154,.86169,.80513,.94007,.82528,.98612,1.06226,.91755,.8126,.81884,.92819,.73764,.90531,.90284,.8858,.86023,.8126,.91172,.96518,.91115,.83089,.8858,.87791,.79761,.89297,.81363,.88157,.89992,.85608,.81992,.94307,.86023,.88157,.95308,.98699,.99793,1.06226,.95817,.95308,.97358,.928,.98088,.98699,.92761,.99793,.96017,1.06226,.986,.944,.95978,.938,.96705,.98714,.80442,.98972,1,.89762,1.04552,.95817,.99007,.87064,.91879,.88888,1.06226,.95817,.98714,.95817,.88888,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89633,1.01915,.89633,1.01915,.89633,1.01915,.8111,.942,.9219,1,.89903,1,1,1,.93173,.93173,.93173,1,1.06304,1.06304,1.06904,.89903,.89903,.80549,1,1.156,1,1,.76575,.76575,1,1,.72458,1,1,1,1,.92241,1,1,1,.619,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.07257,1,.74705,.71119,1.02058,1.024,1.02119,1,1,1.1536,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05638,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Es={lineHeight:1.2,lineGap:.2},_s=[1.76738,1,1,.99297,.9824,1.04016,1.06497,1.03424,.97529,1.17647,1.23203,1.1085,1.1085,1.16939,1.2107,.9754,1.21408,.9754,1.59578,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,.81378,.81378,1.2107,1.2107,1.2107,.71703,.97847,.97363,.88776,.8641,1.02096,.79795,.85132,.914,1.06085,1.1406,.8007,.89858,.83693,1.14889,1.09398,.97489,.92094,.97489,.90399,.84041,.95923,1.00135,1,1.06467,.98243,.90996,.99361,1.1085,1.56942,1.1085,1.2107,.74627,.94282,.96752,1.01519,.86304,1.01359,.97278,1.15103,1.01359,.98561,1.02285,1.02285,1.00527,1.02285,1.0302,.99041,1.0008,1.01519,1.01359,1.02258,.79104,1.16862,.99041,.97454,1.02511,.99298,.96752,.95801,.94856,1.16579,.94856,1.2107,.9824,1.03424,1.03424,1,1.03424,1.16579,.8727,1.3871,1.18622,1.10818,1.04478,1.2107,1.18622,.75155,.94994,1.28826,1.21408,1.21408,.91056,1,.91572,.9754,.64663,1.18328,1.24866,1.04478,1.14169,1.15749,1.17389,.71703,.97363,.97363,.97363,.97363,.97363,.97363,.93506,.8641,.79795,.79795,.79795,.79795,1.1406,1.1406,1.1406,1.1406,1.02096,1.09398,.97426,.97426,.97426,.97426,.97426,1.2107,.97489,1.00135,1.00135,1.00135,1.00135,.90996,.92094,1.02798,.96752,.96752,.96752,.96752,.96752,.96752,.93136,.86304,.97278,.97278,.97278,.97278,1.02285,1.02285,1.02285,1.02285,.97122,.99041,1,1,1,1,1,1.28826,1.0008,.99041,.99041,.99041,.99041,.96752,1.01519,.96752,.97363,.96752,.97363,.96752,.97363,.96752,.8641,.86304,.8641,.86304,.8641,.86304,.8641,.86304,1.02096,1.03057,1.02096,1.03517,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.914,1.01359,.914,1.01359,.914,1.01359,1,1,1.06085,.98561,1.06085,1.00879,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,.97138,1.08692,.8007,1.02285,1,1,1.00527,.83693,1.02285,1,1,.83693,.9455,.83693,.90418,.83693,1.13005,1.09398,.99041,1,1,1.09398,.99041,.96692,1.09251,.99041,.97489,1.0008,.97489,1.0008,.97489,1.0008,.93994,.97931,.90399,1.02258,1,1,.90399,1.02258,.84041,.79104,.84041,.79104,.84041,.79104,.84041,.79104,1,1,.95923,1.07034,.95923,1.16862,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.06467,1.02511,.90996,.96752,.90996,.99361,.95801,.99361,.95801,.99361,.95801,1.07733,1.03424,.97363,.96752,.93506,.93136,.97489,1.0008,1,1,.95923,1.16862,1.15103,1.15103,1.01173,1.03959,.75953,.81378,.79912,1.15103,1.21994,.95161,.87815,1.01149,.81525,.7676,.98167,1.01134,1.02546,.84097,1.03089,1.18102,.97363,.88776,.85134,.97826,.79795,.99361,1.06085,.97489,1.1406,.89858,1.0388,1.14889,1.09398,.86039,.97489,1.0595,.92094,.94793,.95923,.90996,.99346,.98243,1.02112,.95493,1.1406,.90996,1.03574,1.02597,1.0008,1.18102,1.06628,1.03574,1.0192,1.01932,1.00886,.97531,1.0106,1.0008,1.13189,1.18102,1.02277,.98683,1.0016,.99561,1.07237,1.0008,.90434,.99921,.93803,.8965,1.23085,1.06628,1.04983,.96268,1.0499,.98439,1.18102,1.06628,1.0008,1.06628,.98439,.79795,1,1,1,1,1,1,1,1,1,1,1,1,1.09466,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.97278,1,1,1,1,1,1,1,1,1,1,1,1,1.02065,1,1,1,1,1,1,1.06467,1.02511,1.06467,1.02511,1.06467,1.02511,.90996,.96752,1,1.21408,.89903,1,1,.75155,1.04394,1.04394,1.04394,1.04394,.98633,.98633,.98633,.73047,.73047,1.20642,.91211,1.25635,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.12454,.93503,1.03424,1.19687,1.03424,1,1,1,.771,1,1,1.15749,1.15749,1.15749,1.10948,.86279,.94434,.86279,.94434,.86182,1,1,1.16897,1,.96085,.90137,1.2107,1.18416,1.13973,.69825,.9716,2.10339,1.29004,1.29004,1.21172,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18874,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.09193,1.09193,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],zs={lineHeight:1.33008,lineGap:0},Ls=[1.76738,1,1,.98946,1.03959,1.04016,1.02809,1.036,.97639,1.10953,1.23203,1.11144,1.11144,1.16939,1.21237,.9754,1.21261,.9754,1.59754,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,.81378,.81378,1.21237,1.21237,1.21237,.73541,.97847,.97363,.89723,.87897,1.0426,.79429,.85292,.91149,1.05815,1.1406,.79631,.90128,.83853,1.04396,1.10615,.97552,.94436,.97552,.88641,.80527,.96083,1.00135,1,1.06777,.9817,.91142,.99361,1.11144,1.57293,1.11144,1.21237,.74627,1.31818,1.06585,.97042,.83055,.97042,.93503,1.1261,.97042,.97922,1.14236,.94552,1.01054,1.14236,1.02471,.97922,.94165,.97042,.97042,1.0276,.78929,1.1261,.97922,.95874,1.02197,.98507,.96752,.97168,.95107,1.16579,.95107,1.21237,1.03959,1.036,1.036,1,1.036,1.16579,.87357,1.31818,1.18754,1.26781,1.05356,1.21237,1.18622,.79487,.94994,1.29004,1.24047,1.24047,1.31818,1,.91484,.9754,1.31818,1.1349,1.24866,1.05356,1.13934,1.15574,1.17389,.73541,.97363,.97363,.97363,.97363,.97363,.97363,.94385,.87897,.79429,.79429,.79429,.79429,1.1406,1.1406,1.1406,1.1406,1.0426,1.10615,.97552,.97552,.97552,.97552,.97552,1.21237,.97552,1.00135,1.00135,1.00135,1.00135,.91142,.94436,.98721,1.06585,1.06585,1.06585,1.06585,1.06585,1.06585,.96705,.83055,.93503,.93503,.93503,.93503,1.14236,1.14236,1.14236,1.14236,.93125,.97922,.94165,.94165,.94165,.94165,.94165,1.29004,.94165,.97922,.97922,.97922,.97922,.96752,.97042,.96752,.97363,1.06585,.97363,1.06585,.97363,1.06585,.87897,.83055,.87897,.83055,.87897,.83055,.87897,.83055,1.0426,1.0033,1.0426,.97042,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.91149,.97042,.91149,.97042,.91149,.97042,1,1,1.05815,.97922,1.05815,.97922,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,.97441,1.04302,.79631,1.01582,1,1,1.01054,.83853,1.14236,1,1,.83853,1.09125,.83853,.90418,.83853,1.19508,1.10615,.97922,1,1,1.10615,.97922,1.01034,1.10466,.97922,.97552,.94165,.97552,.94165,.97552,.94165,.91602,.91981,.88641,1.0276,1,1,.88641,1.0276,.80527,.78929,.80527,.78929,.80527,.78929,.80527,.78929,1,1,.96083,1.05403,.95923,1.16862,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.06777,1.02197,.91142,.96752,.91142,.99361,.97168,.99361,.97168,.99361,.97168,1.23199,1.036,.97363,1.06585,.94385,.96705,.97552,.94165,1,1,.96083,1.1261,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,.95161,1.27126,1.00811,.83284,.77702,.99137,.95253,1.0347,.86142,1.07205,1.14236,.97363,.89723,.86869,1.09818,.79429,.99361,1.05815,.97552,1.1406,.90128,1.06662,1.04396,1.10615,.84918,.97552,1.04694,.94436,.98015,.96083,.91142,1.00356,.9817,1.01945,.98999,1.1406,.91142,1.04961,.9898,1.00639,1.14236,1.07514,1.04961,.99607,1.02897,1.008,.9898,.95134,1.00639,1.11121,1.14236,1.00518,.97981,1.02186,1,1.08578,.94165,.99314,.98387,.93028,.93377,1.35125,1.07514,1.10687,.93491,1.04232,1.00351,1.14236,1.07514,.94165,1.07514,1.00351,.79429,1,1,1,1,1,1,1,1,1,1,1,1,1.09097,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.93503,1,1,1,1,1,1,1,1,1,1,1,1,.96609,1,1,1,1,1,1,1.06777,1.02197,1.06777,1.02197,1.06777,1.02197,.91142,.96752,1,1.21261,.89903,1,1,.75155,1.04745,1.04745,1.04745,1.04394,.98633,.98633,.98633,.72959,.72959,1.20502,.91406,1.26514,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.09125,.93327,1.03336,1.16541,1.036,1,1,1,.771,1,1,1.15574,1.15574,1.15574,1.15574,.86364,.94434,.86279,.94434,.86224,1,1,1.16798,1,.96085,.90068,1.21237,1.18416,1.13904,.69825,.9716,2.10339,1.29004,1.29004,1.21339,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18775,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.13269,1.13269,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Us={lineHeight:1.33008,lineGap:0},Xs=[1.76738,1,1,.98946,1.14763,1.05365,1.06234,.96927,.92586,1.15373,1.18414,.91349,.91349,1.07403,1.17308,.78383,1.20088,.78383,1.42531,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78383,.78383,1.17308,1.17308,1.17308,.77349,.94565,.94729,.85944,.88506,.9858,.74817,.80016,.88449,.98039,.95782,.69238,.89898,.83231,.98183,1.03989,.96924,.86237,.96924,.80595,.74524,.86091,.95402,.94143,.98448,.8858,.83089,.93285,1.0949,1.39016,1.0949,1.45994,.74627,1.04839,.97454,.97454,.87207,.97454,.87533,1.06151,.97454,1.00176,1.16484,1.08132,.98047,1.16484,1.02989,1.01054,.96225,.97454,.97454,1.06598,.79004,1.16344,1.00351,.94629,.9973,.91016,.96777,.9043,.91082,.92481,.91082,1.17308,.95748,.96927,.96927,1,.96927,.92481,.80597,1.04839,1.23393,1.1781,.9245,1.17308,1.20808,.63218,.94261,1.24822,1.09971,1.09971,1.04839,1,.85273,.78032,1.04839,1.09971,1.22326,.9245,1.09836,1.13525,1.15222,.70424,.94729,.94729,.94729,.94729,.94729,.94729,.85498,.88506,.74817,.74817,.74817,.74817,.95782,.95782,.95782,.95782,.9858,1.03989,.96924,.96924,.96924,.96924,.96924,1.17308,.96924,.95402,.95402,.95402,.95402,.83089,.86237,.88409,.97454,.97454,.97454,.97454,.97454,.97454,.92916,.87207,.87533,.87533,.87533,.87533,.93146,.93146,.93146,.93146,.93854,1.01054,.96225,.96225,.96225,.96225,.96225,1.24822,.8761,1.00351,1.00351,1.00351,1.00351,.96777,.97454,.96777,.94729,.97454,.94729,.97454,.94729,.97454,.88506,.87207,.88506,.87207,.88506,.87207,.88506,.87207,.9858,.95391,.9858,.97454,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.88449,.97454,.88449,.97454,.88449,.97454,1,1,.98039,1.00176,.98039,1.00176,.95782,.93146,.95782,.93146,.95782,.93146,.95782,1.16484,.95782,.93146,.84421,1.12761,.69238,1.08132,1,1,.98047,.83231,1.16484,1,1,.84723,1.04861,.84723,.78755,.83231,1.23736,1.03989,1.01054,1,1,1.03989,1.01054,.9857,1.03849,1.01054,.96924,.96225,.96924,.96225,.96924,.96225,.92383,.90171,.80595,1.06598,1,1,.80595,1.06598,.74524,.79004,.74524,.79004,.74524,.79004,.74524,.79004,1,1,.86091,1.02759,.85771,1.16344,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.98448,.9973,.83089,.96777,.83089,.93285,.9043,.93285,.9043,.93285,.9043,1.31868,.96927,.94729,.97454,.85498,.92916,.96924,.8761,1,1,.86091,1.16344,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,.81965,.81965,.94729,.78032,.71022,.90883,.84171,.99877,.77596,1.05734,1.2,.94729,.85944,.82791,.9607,.74817,.93285,.98039,.96924,.95782,.89898,.98316,.98183,1.03989,.78614,.96924,.97642,.86237,.86075,.86091,.83089,.90082,.8858,.97296,1.01284,.95782,.83089,1.0976,1.04,1.03342,1.2,1.0675,1.0976,.98205,1.03809,1.05097,1.04,.95364,1.03342,1.05401,1.2,1.02148,1.0119,1.04724,1.0127,1.02732,.96225,.8965,.97783,.93574,.94818,1.30679,1.0675,1.11826,.99821,1.0557,1.0326,1.2,1.0675,.96225,1.0675,1.0326,.74817,1,1,1,1,1,1,1,1,1,1,1,1,1.03754,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87533,1,1,1,1,1,1,1,1,1,1,1,1,.98705,1,1,1,1,1,1,.98448,.9973,.98448,.9973,.98448,.9973,.83089,.96777,1,1.20088,.89903,1,1,.75155,.94945,.94945,.94945,.94945,1.12317,1.12317,1.12317,.67603,.67603,1.15621,.73584,1.21191,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87709,.96927,1.01473,.96927,1,1,1,.77295,1,1,1.09836,1.09836,1.09836,1.01522,.86321,.94434,.8649,.94434,.86182,1,1,1.083,1,.91578,.86438,1.17308,1.18416,1.14589,.69825,.97622,1.96791,1.24822,1.24822,1.17308,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.17984,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10742,1.10742,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Ws={lineHeight:1.33008,lineGap:0},Ks=[1.76738,1,1,.98594,1.02285,1.10454,1.06234,.96927,.92037,1.19985,1.2046,.90616,.90616,1.07152,1.1714,.78032,1.20088,.78032,1.40246,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78032,.78032,1.1714,1.1714,1.1714,.80597,.94084,.96706,.85944,.85734,.97093,.75842,.79936,.88198,.9831,.95782,.71387,.86969,.84636,1.07796,1.03584,.96924,.83968,.96924,.82826,.79649,.85771,.95132,.93119,.98965,.88433,.8287,.93365,1.08612,1.3638,1.08612,1.45786,.74627,.80499,.91484,1.05707,.92383,1.05882,.9403,1.12654,1.05882,1.01756,1.09011,1.09011,.99414,1.09011,1.034,1.01756,1.05356,1.05707,1.05882,1.04399,.84863,1.21968,1.01756,.95801,1.00068,.91797,.96777,.9043,.90351,.92105,.90351,1.1714,.85337,.96927,.96927,.99912,.96927,.92105,.80597,1.2434,1.20808,1.05937,.90957,1.1714,1.20808,.75155,.94261,1.24644,1.09971,1.09971,.84751,1,.85273,.78032,.61584,1.05425,1.17914,.90957,1.08665,1.11593,1.14169,.73381,.96706,.96706,.96706,.96706,.96706,.96706,.86035,.85734,.75842,.75842,.75842,.75842,.95782,.95782,.95782,.95782,.97093,1.03584,.96924,.96924,.96924,.96924,.96924,1.1714,.96924,.95132,.95132,.95132,.95132,.8287,.83968,.89049,.91484,.91484,.91484,.91484,.91484,.91484,.93575,.92383,.9403,.9403,.9403,.9403,.8717,.8717,.8717,.8717,1.00527,1.01756,1.05356,1.05356,1.05356,1.05356,1.05356,1.24644,.95923,1.01756,1.01756,1.01756,1.01756,.96777,1.05707,.96777,.96706,.91484,.96706,.91484,.96706,.91484,.85734,.92383,.85734,.92383,.85734,.92383,.85734,.92383,.97093,1.0969,.97093,1.05882,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.88198,1.05882,.88198,1.05882,.88198,1.05882,1,1,.9831,1.01756,.9831,1.01756,.95782,.8717,.95782,.8717,.95782,.8717,.95782,1.09011,.95782,.8717,.84784,1.11551,.71387,1.09011,1,1,.99414,.84636,1.09011,1,1,.84636,1.0536,.84636,.94298,.84636,1.23297,1.03584,1.01756,1,1,1.03584,1.01756,1.00323,1.03444,1.01756,.96924,1.05356,.96924,1.05356,.96924,1.05356,.93066,.98293,.82826,1.04399,1,1,.82826,1.04399,.79649,.84863,.79649,.84863,.79649,.84863,.79649,.84863,1,1,.85771,1.17318,.85771,1.21968,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.98965,1.00068,.8287,.96777,.8287,.93365,.9043,.93365,.9043,.93365,.9043,1.08571,.96927,.96706,.91484,.86035,.93575,.96924,.95923,1,1,.85771,1.21968,1.11437,1.11437,.93109,.91202,.60411,.84164,.55572,1.01173,.97361,.81818,.81818,.96635,.78032,.72727,.92366,.98601,1.03405,.77968,1.09799,1.2,.96706,.85944,.85638,.96491,.75842,.93365,.9831,.96924,.95782,.86969,.94152,1.07796,1.03584,.78437,.96924,.98715,.83968,.83491,.85771,.8287,.94492,.88433,.9287,1.0098,.95782,.8287,1.0625,.98248,1.03424,1.2,1.01071,1.0625,.95246,1.03809,1.04912,.98248,1.00221,1.03424,1.05443,1.2,1.04785,.99609,1.00169,1.05176,.99346,1.05356,.9087,1.03004,.95542,.93117,1.23362,1.01071,1.07831,1.02512,1.05205,1.03502,1.2,1.01071,1.05356,1.01071,1.03502,.75842,1,1,1,1,1,1,1,1,1,1,1,1,1.03719,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9403,1,1,1,1,1,1,1,1,1,1,1,1,1.04021,1,1,1,1,1,1,.98965,1.00068,.98965,1.00068,.98965,1.00068,.8287,.96777,1,1.20088,.89903,1,1,.75155,1.03077,1.03077,1.03077,1.03077,1.13196,1.13196,1.13196,.67428,.67428,1.16039,.73291,1.20996,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87796,.96927,1.01518,.96927,1,1,1,.77295,1,1,1.10539,1.10539,1.11358,1.06967,.86279,.94434,.86279,.94434,.86182,1,1,1.083,1,.91578,.86507,1.1714,1.18416,1.14589,.69825,.97622,1.9697,1.24822,1.24822,1.17238,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18083,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10938,1.10938,1,1,1,1.05425,1.09971,1.09971,1.09971,1,1,1,1,1,1,1,1,1,1,1],Gs={lineHeight:1.33008,lineGap:0},Vs=getLookupTableFactory(function(e){e["MyriadPro-Regular"]=e["PdfJS-Fallback-Regular"]={name:"LiberationSans-Regular",factors:Ns,baseWidths:Fs,baseMapping:Ts,metrics:Es};e["MyriadPro-Bold"]=e["PdfJS-Fallback-Bold"]={name:"LiberationSans-Bold",factors:Os,baseWidths:vs,baseMapping:Ss,metrics:Rs};e["MyriadPro-It"]=e["MyriadPro-Italic"]=e["PdfJS-Fallback-Italic"]={name:"LiberationSans-Italic",factors:Ds,baseWidths:Cs,baseMapping:Is,metrics:Ms};e["MyriadPro-BoldIt"]=e["MyriadPro-BoldItalic"]=e["PdfJS-Fallback-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:Hs,baseWidths:As,baseMapping:xs,metrics:Bs};e.ArialMT=e.Arial=e["Arial-Regular"]={name:"LiberationSans-Regular",baseWidths:Fs,baseMapping:Ts};e["Arial-BoldMT"]=e["Arial-Bold"]={name:"LiberationSans-Bold",baseWidths:vs,baseMapping:Ss};e["Arial-ItalicMT"]=e["Arial-Italic"]={name:"LiberationSans-Italic",baseWidths:Cs,baseMapping:Is};e["Arial-BoldItalicMT"]=e["Arial-BoldItalic"]={name:"LiberationSans-BoldItalic",baseWidths:As,baseMapping:xs};e["Calibri-Regular"]={name:"LiberationSans-Regular",factors:ms,baseWidths:Fs,baseMapping:Ts,metrics:ps};e["Calibri-Bold"]={name:"LiberationSans-Bold",factors:os,baseWidths:vs,baseMapping:Ss,metrics:ls};e["Calibri-Italic"]={name:"LiberationSans-Italic",factors:hs,baseWidths:Cs,baseMapping:Is,metrics:us};e["Calibri-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:fs,baseWidths:As,baseMapping:xs,metrics:cs};e["Segoeui-Regular"]={name:"LiberationSans-Regular",factors:Ks,baseWidths:Fs,baseMapping:Ts,metrics:Gs};e["Segoeui-Bold"]={name:"LiberationSans-Bold",factors:_s,baseWidths:vs,baseMapping:Ss,metrics:zs};e["Segoeui-Italic"]={name:"LiberationSans-Italic",factors:Xs,baseWidths:Cs,baseMapping:Is,metrics:Ws};e["Segoeui-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:Ls,baseWidths:As,baseMapping:xs,metrics:Us};e["Helvetica-Regular"]=e.Helvetica={name:"LiberationSans-Regular",factors:ys,baseWidths:Fs,baseMapping:Ts,metrics:qs};e["Helvetica-Bold"]={name:"LiberationSans-Bold",factors:ds,baseWidths:vs,baseMapping:Ss,metrics:gs};e["Helvetica-Italic"]={name:"LiberationSans-Italic",factors:js,baseWidths:Cs,baseMapping:Is,metrics:ks};e["Helvetica-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:bs,baseWidths:As,baseMapping:xs,metrics:ws}});function getXfaFontName(e){const t=normalizeFontName(e);return Vs()[t]}function getXfaFontDict(e){const t=function getXfaFontWidths(e){const t=getXfaFontName(e);if(!t)return null;const{baseWidths:a,baseMapping:n,factors:s}=t,r=s?a.map((e,t)=>e*s[t]):a;let i,o=-2;const l=[];for(const[e,t]of n.map((e,t)=>[e,t]).sort(([e],[t])=>e-t))if(-1!==e)if(e===o+1){i.push(r[t]);o+=1}else{o=e;i=[r[t]];l.push(e,i)}return l}(e),a=new Dict(null);a.set("BaseFont",Name.get(e));a.set("Type",Name.get("Font"));a.set("Subtype",Name.get("CIDFontType2"));a.set("Encoding",Name.get("Identity-H"));a.set("CIDToGIDMap",Name.get("Identity"));a.set("W",t);a.set("FirstChar",t[0]);a.set("LastChar",t.at(-2)+t.at(-1).length-1);const n=new Dict(null);a.set("FontDescriptor",n);const s=new Dict(null);s.set("Ordering","Identity");s.set("Registry","Adobe");s.set("Supplement",0);a.set("CIDSystemInfo",s);return a}const $s={number:0,lbrace:1,rbrace:2,true:3,false:4,add:5,sub:6,mul:7,div:8,idiv:9,mod:10,exp:11,eq:12,ne:13,gt:14,ge:15,lt:16,le:17,and:18,or:19,xor:20,bitshift:21,abs:22,neg:23,ceiling:24,floor:25,round:26,truncate:27,not:28,sqrt:29,sin:30,cos:31,ln:32,log:33,atan:34,cvi:35,cvr:36,dup:37,exch:38,pop:39,copy:40,index:41,roll:42,if:43,ifelse:44,eof:45,min:46,max:47};class Token{constructor(e,t=null){this.id=e;this.value=t}}class lexer_Lexer{static#re=null;static#ie=null;static#oe(){const e=Object.create(null),t=Object.create(null);for(const[a,n]of Object.entries($s)){if("number"===a)continue;const s=n>=$s.true&&n<=$s.ifelse,r=new Token(n,s?a:null);e[a]=r;s&&(t[a]=r)}this.#re=e;this.#ie=t}constructor(e){lexer_Lexer.#re||lexer_Lexer.#oe();this.data=e;this.pos=0;this.len=e.length;this._numberPattern=/[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/y;this._identifierPattern=/[a-z]+/y}_skipComment(){const e=this.data.indexOf("\n",this.pos),t=this.data.indexOf("\r",this.pos),a=Math.min(e<0?this.len:e,t<0?this.len:t);this.pos=Math.min(a+1,this.len)}_getNumber(){this._numberPattern.lastIndex=this.pos;const e=this._numberPattern.exec(this.data);if(!e)return new Token($s.number,0);const t=parseFloat(e[0]);if(!Number.isFinite(t))return new Token($s.number,0);this.pos=this._numberPattern.lastIndex;return new Token($s.number,t)}_getOperator(){this._identifierPattern.lastIndex=this.pos;const e=this._identifierPattern.exec(this.data);if(!e)return new Token($s.number,0);this.pos=this._identifierPattern.lastIndex;const t=e[0],a=lexer_Lexer.#ie[t];return a||new Token($s.number,0)}next(){for(;this.pos=48&&e<=57){this.pos--;return this._getNumber()}if(e>=97&&e<=122){this.pos--;return this._getOperator()}return new Token($s.number,0)}}return lexer_Lexer.#re.eof}}const Ys=0,Js=1,Qs=2,Zs=0,er=1,tr=2,ar=3,nr=4,sr=5,rr=6,ir=7,or=8,lr=9,fr=10;class PsNode{constructor(e){this.type=e}}class PsProgram extends PsNode{constructor(e){super(Zs);this.body=e}}class PsBlock extends PsNode{constructor(e){super(er);this.instructions=e}}class PsNumber extends PsNode{constructor(e){super(tr);this.value=e}}class PsOperator extends PsNode{constructor(e){super(ar);this.op=e}}class PsIf extends PsNode{constructor(e){super(nr);this.then=e}}class PsIfElse extends PsNode{constructor(e,t){super(sr);this.then=e;this.otherwise=t}}class PsArgNode extends PsNode{constructor(e){super(rr);this.index=e;this.valueType=Ys}}class PsConstNode extends PsNode{constructor(e){super(ir);this.value=e;this.valueType="boolean"==typeof e?Js:Ys}}class PsUnaryNode extends PsNode{constructor(e,t,a=Qs){super(or);this.op=e;this.operand=t;this.valueType=a}}class PsBinaryNode extends PsNode{constructor(e,t,a,n=Qs){super(lr);this.op=e;this.first=t;this.second=a;this.valueType=n}}class PsTernaryNode extends PsNode{constructor(e,t,a,n=Qs){super(fr);this.cond=e;this.then=t;this.otherwise=a;this.valueType=n}}class ast_Parser{constructor(e){this.lexer=e;this._token=null}static _isRegularOperator(e){return e>=$s.true&&e<$s.if}_advance(){this._token=this.lexer.next()}_expect(e){if(this._token.id!==e)throw new FormatError(`PostScript function: expected token id ${e}, got ${this._token.id}.`);const t=this._token;this._advance();return t}parse(){this._advance();this._expect($s.lbrace);const e=this._parseBlock();this._expect($s.rbrace);this._token.id!==$s.eof&&warn("PostScript function: unexpected content after closing brace.");return new PsProgram(e)}_parseBlock(){const e=[];for(;;){const t=this._token;switch(t.id){case $s.number:e.push(new PsNumber(t.value));this._advance();break;case $s.lbrace:{this._advance();const t=this._parseBlock();this._expect($s.rbrace);if(this._token.id===$s.if){this._advance();e.push(new PsIf(t))}else{if(this._token.id!==$s.lbrace)throw new FormatError("PostScript function: a procedure block must be followed by 'if' or '{…} ifelse'.");{this._advance();const a=this._parseBlock();this._expect($s.rbrace);this._expect($s.ifelse);e.push(new PsIfElse(t,a))}}break}case $s.rbrace:case $s.eof:return new PsBlock(e);case $s.if:case $s.ifelse:throw new FormatError(`PostScript function: unexpected '${t.value}' operator.`);default:if(ast_Parser._isRegularOperator(t.id)){e.push(new PsOperator(t.id));this._advance();break}throw new FormatError(`PostScript function: unexpected token id ${t.id}.`)}}}}function parsePostScriptFunction(e){return new ast_Parser(new lexer_Lexer(e)).parse()}function _nodesEqual(e,t){if(e===t)return!0;if(e.type!==t.type)return!1;switch(e.type){case rr:return e.index===t.index;case ir:return e.value===t.value;case or:return e.op===t.op&&_nodesEqual(e.operand,t.operand);case lr:return e.op===t.op&&_nodesEqual(e.first,t.first)&&_nodesEqual(e.second,t.second);case fr:return _nodesEqual(e.cond,t.cond)&&_nodesEqual(e.then,t.then)&&_nodesEqual(e.otherwise,t.otherwise);default:return!1}}const cr=100;class PSStackToTree{static#le=null;static#fe=null;static#ce=null;static#he=null;static#ue(){this.#le=new Set([$s.add,$s.sub,$s.mul,$s.div,$s.idiv,$s.mod,$s.exp,$s.atan,$s.eq,$s.ne,$s.gt,$s.ge,$s.lt,$s.le,$s.and,$s.or,$s.xor,$s.bitshift]);this.#fe=new Set([$s.abs,$s.neg,$s.ceiling,$s.floor,$s.round,$s.truncate,$s.sqrt,$s.sin,$s.cos,$s.ln,$s.log,$s.cvi,$s.cvr,$s.not]);this.#ce=new Set([$s.abs,$s.ceiling,$s.cvi,$s.cvr,$s.floor,$s.round,$s.truncate]);this.#he=new Map([[$s.eq,$s.ne],[$s.ne,$s.eq],[$s.lt,$s.ge],[$s.le,$s.gt],[$s.gt,$s.le],[$s.ge,$s.lt]])}evaluate(e,t){PSStackToTree.#le||PSStackToTree.#ue();this._failed=!1;if(t>cr)return null;const a=[];for(let e=0;e{if(!e||e.type===rr||e.type===ir)return;const a=t.get(e)??0;t.set(e,a+1);if(!(a>0))switch(e.type){case or:visit(e.operand);break;case lr:visit(e.first);visit(e.second);break;case fr:visit(e.cond);visit(e.then);visit(e.otherwise)}};for(const t of e)visit(t);for(const[e,a]of t)if(a>1){e.shared=!0;e.sharedCount=a}}_evalBlock(e,t){this._evalBlockFrom(e.instructions,0,t)}_evalBlockFrom(e,t,a){for(let n=t;ncr&&(this._failed=!0);break;case ar:this._evalOp(t.op,a);break;case nr:{if(a.length<1){this._failed=!0;break}const s=a.pop(),r=a.slice();this._evalBlock(t.then,a);if(this._failed)break;if(a.length===r.length)for(let e=0;er.length){if(s.type===ir){if(!s.value){a.length=0;a.push(...r)}break}const t=a.slice();this._evalBlockFrom(e,n+1,t);if(this._failed)break;const i=r;this._evalBlockFrom(e,n+1,i);if(this._failed)break;if(t.length!==i.length){const e=new PsConstNode(0);for(;t.lengthcr&&(this._failed=!0);break;case $s.false:t.push(new PsConstNode(!1));t.length>cr&&(this._failed=!0);break;case $s.dup:if(t.length<1){this._failed=!0;break}t.push(t.at(-1));t.length>cr&&(this._failed=!0);break;case $s.exch:{if(t.length<2){this._failed=!0;break}const e=t.pop(),a=t.pop();t.push(e,a);break}case $s.pop:if(t.length<1){this._failed=!0;break}t.pop();break;case $s.copy:{if(t.length<1){this._failed=!0;break}const e=t.pop();if(e.type===ir){const a=0|e.value;if(0===a);else if(a<0||a>t.length)this._failed=!0;else{t.push(...t.slice(-a));t.length>cr&&(this._failed=!0)}}else this._failed=!0;break}case $s.index:{if(t.length<1){this._failed=!0;break}const e=t.pop();if(e.type===ir){const a=0|e.value;a<0||a>=t.length?this._failed=!0:t.push(t.at(-a-1))}else this._failed=!0;break}case $s.roll:{if(t.length<2){this._failed=!0;break}const e=t.pop(),a=t.pop();if(a.type===ir&&e.type===ir){const n=0|a.value;if(0===n);else if(n<0||n>t.length)this._failed=!0;else{const a=((0|e.value)%n+n)%n;if(a>0){const e=t.splice(-n,n);t.push(...e.slice(n-a),...e.slice(0,n-a))}}}else this._failed=!0;break}default:this._failed=!0}}_makeBinary(e,t,a){if(t.type===ir&&a.type===ir){const n=function _evalBinaryConst(e,t,a){switch(e){case $s.add:return t+a;case $s.sub:return t-a;case $s.mul:return t*a;case $s.div:return 0!==a?t/a:0;case $s.idiv:return 0!==a?Math.trunc(t/a):0;case $s.mod:return 0!==a?t-Math.trunc(t/a)*a:0;case $s.exp:{const e=t**a;return Number.isFinite(e)?e:void 0}case $s.atan:{let e=Math.atan2(t,a)*(180/Math.PI);e<0&&(e+=360);return e}case $s.eq:return t===a;case $s.ne:return t!==a;case $s.gt:return t>a;case $s.ge:return t>=a;case $s.lt:return t=0?t<>-a|0;case $s.min:return Math.min(t,a);case $s.max:return Math.max(t,a);default:return}}(e,a.value,t.value);if(void 0!==n)return new PsConstNode(n)}if(_nodesEqual(t,a))switch(e){case $s.sub:return new PsConstNode(0);case $s.xor:return new PsConstNode(t.valueType!==Js&&0);case $s.and:case $s.or:case $s.min:case $s.max:return t;case $s.eq:case $s.ge:case $s.le:return new PsConstNode(!0);case $s.ne:case $s.gt:case $s.lt:return new PsConstNode(!1)}if(t.type===ir){const n=t.value;switch(e){case $s.add:case $s.sub:if(0===n)return a;break;case $s.mul:if(1===n)return a;if(0===n)return t;if(-1===n)return this._makeUnary($s.neg,a);break;case $s.div:if(0!==n)return this._makeBinary($s.mul,new PsConstNode(1/n),a);break;case $s.idiv:if(1===n)return a;break;case $s.exp:if(1===n)return a;if(-1===n)return this._makeBinary($s.div,a,new PsConstNode(1));if(.5===n)return this._makeUnary($s.sqrt,a);if(.25===n){const e=this._makeUnary($s.sqrt,a);return this._makeUnary($s.sqrt,e)}if(2===n)return this._makeBinary($s.mul,a,a);if(3===n)return this._makeBinary($s.mul,this._makeBinary($s.mul,a,a),a);if(4===n){const e=this._makeBinary($s.mul,a,a);return this._makeBinary($s.mul,e,e)}if(0===n)return new PsConstNode(1);break;case $s.and:if(!0===n)return a;if(!1===n)return t;break;case $s.or:if(!1===n)return a;if(!0===n)return t;break;case $s.min:if(a.type===lr&&a.op===$s.max&&a.first.type===ir&&a.first.value>=n)return t;break;case $s.max:if(a.type===lr&&a.op===$s.min&&a.first.type===ir&&a.first.value<=n)return t}}if(a.type===ir){const n=a.value;switch(e){case $s.add:if(0===n)return t;break;case $s.sub:if(0===n)return this._makeUnary($s.neg,t);break;case $s.mul:if(1===n)return t;if(0===n)return a;if(-1===n)return this._makeUnary($s.neg,t);break;case $s.and:if(!0===n)return t;if(!1===n)return a;break;case $s.or:if(!1===n)return t;if(!0===n)return a}}return new PsBinaryNode(e,t,a,function _binaryValueType(e,t,a){switch(e){case $s.eq:case $s.ne:case $s.gt:case $s.ge:case $s.lt:case $s.le:return Js;case $s.and:case $s.or:case $s.xor:return t===a&&t!==Qs?t:Qs;default:return Ys}}(e,t.valueType,a.valueType))}_makeUnary(e,t){if(t.type===ir){const a=function _evalUnaryConst(e,t){switch(e){case $s.abs:return Math.abs(t);case $s.neg:return-t;case $s.ceiling:return Math.ceil(t);case $s.floor:return Math.floor(t);case $s.round:return Math.round(t);case $s.truncate:return Math.trunc(t);case $s.sqrt:{const e=Math.sqrt(t);return Number.isFinite(e)?e:void 0}case $s.sin:return Math.sin(t%360*Math.PI/180);case $s.cos:return Math.cos(t%360*Math.PI/180);case $s.ln:{const e=Math.log(t);return Number.isFinite(e)?e:void 0}case $s.log:{const e=Math.log10(t);return Number.isFinite(e)?e:void 0}case $s.cvi:return Math.trunc(t);case $s.cvr:return t;case $s.not:return"boolean"==typeof t?!t:~t;default:return}}(e,t.value);if(void 0!==a)return new PsConstNode(a)}if(e===$s.not&&t.type===lr){const e=PSStackToTree.#he.get(t.op);if(void 0!==e)return new PsBinaryNode(e,t.first,t.second,Js)}if(e===$s.neg&&t.type===lr&&t.op===$s.sub)return this._makeBinary($s.sub,t.second,t.first);if(t.type===or){if(e===$s.neg&&t.op===$s.neg||e===$s.not&&t.op===$s.not)return t.operand;if(e===$s.abs&&t.op===$s.neg)return this._makeUnary($s.abs,t.operand);if(PSStackToTree.#ce.has(e)&&e===t.op)return t}return new PsUnaryNode(e,t,function _unaryValueType(e,t){return e===$s.not?t:Ys}(e,t.valueType))}_makeTernary(e,t,a){if(e.type===ir)return e.value?t:a;if(_nodesEqual(t,a))return t;if(t.type===ir&&a.type===ir){if(!0===t.value&&!1===a.value)return e;if(!1===t.value&&!0===a.value)return this._makeUnary($s.not,e)}if(e.type===lr){const{op:n,first:s,second:r}=e;if(n===$s.gt||n===$s.ge){if(_nodesEqual(t,s)&&_nodesEqual(a,r))return this._makeBinary($s.min,s,r);if(_nodesEqual(t,r)&&_nodesEqual(a,s))return this._makeBinary($s.max,s,r)}else if(n===$s.lt||n===$s.le){if(_nodesEqual(t,s)&&_nodesEqual(a,r))return this._makeBinary($s.max,s,r);if(_nodesEqual(t,r)&&_nodesEqual(a,s))return this._makeBinary($s.min,s,r)}}return new PsTernaryNode(e,t,a,t.valueType===a.valueType?t.valueType:Qs)}}const hr=0,ur=1,mr=2,pr=3,dr=4,gr=5,br=6,wr=7,jr=8,kr=9,yr=10,qr=11,vr=12,Sr=13,Ar=14,xr=15,Cr=16,Ir=17,Fr=18,Tr=19,Or=20,Rr=21,Hr=22,Dr=23,Mr=24,Nr=25,Pr=26,Er=27,_r=28,zr=29,Lr=30,Ur=31,Xr=32,Wr=33,Kr=34,Gr=35,Vr=36,$r=37,Yr=38,Jr=39,Qr=40,Zr=Math.PI/180,ei=180/Math.PI;class PsJsCompiler{static#pe=new Float64Array(64);static#de=new Float64Array(64);constructor(e,t){this.nIn=e.length>>1;this.nOut=t.length>>1;this.range=t;this.ir=[];this._tmpMap=new Map;this._nextTmp=0}_compileNode(e){if(e.shared){const t=this._tmpMap.get(e);if(void 0!==t){this.ir.push(Qr,t);return!0}if(!this._compileNodeImpl(e))return!1;const a=this._nextTmp++;this._tmpMap.set(e,a);this.ir.push(Jr,a);return!0}return this._compileNodeImpl(e)}_compileNodeImpl(e){switch(e.type){case rr:this.ir.push(hr,e.index);return!0;case ir:{const t=e.value;this.ir.push(ur,"boolean"==typeof t?Number(t):t);return!0}case or:return this._compileUnary(e);case lr:return this._compileBinary(e);case fr:return this._compileTernary(e);default:return!1}}_compileUnary(e){const{op:t,operand:a,valueType:n}=e;if(t===$s.cvr)return this._compileNode(a);if(!this._compileNode(a))return!1;switch(t){case $s.abs:this.ir.push(gr);break;case $s.neg:this.ir.push(br);break;case $s.ceiling:this.ir.push(wr);break;case $s.floor:this.ir.push(jr);break;case $s.round:this.ir.push(kr);break;case $s.truncate:this.ir.push(yr);break;case $s.sqrt:this.ir.push(Sr);break;case $s.sin:this.ir.push(Ar);break;case $s.cos:this.ir.push(xr);break;case $s.ln:this.ir.push(Cr);break;case $s.log:this.ir.push(Ir);break;case $s.cvi:this.ir.push(Fr);break;case $s.not:if(n===Js)this.ir.push(qr);else{if(n!==Ys)return!1;this.ir.push(vr)}break;default:return!1}return!0}_compileBinary(e){const{op:t,first:a,second:n}=e;if(t===$s.bitshift){if(a.type!==ir||!Number.isInteger(a.value))return!1;if(!this._compileNode(n))return!1;this.ir.push(Tr,a.value);return!0}if(!this._compileNode(n))return!1;if(!this._compileNode(a))return!1;switch(t){case $s.add:this.ir.push(Or);break;case $s.sub:this.ir.push(Rr);break;case $s.mul:this.ir.push(Hr);break;case $s.div:this.ir.push(Dr);break;case $s.idiv:this.ir.push(Mr);break;case $s.mod:this.ir.push(Nr);break;case $s.exp:this.ir.push(Pr);break;case $s.eq:this.ir.push(Er);break;case $s.ne:this.ir.push(_r);break;case $s.gt:this.ir.push(zr);break;case $s.ge:this.ir.push(Lr);break;case $s.lt:this.ir.push(Ur);break;case $s.le:this.ir.push(Xr);break;case $s.and:this.ir.push(Wr);break;case $s.or:this.ir.push(Kr);break;case $s.xor:this.ir.push(Gr);break;case $s.atan:this.ir.push(Vr);break;case $s.min:this.ir.push($r);break;case $s.max:this.ir.push(Yr);break;default:return!1}return!0}_compileTernary(e){if(!this._compileNode(e.cond))return!1;this.ir.push(pr,0);const t=this.ir.length-1;if(!this._compileNode(e.then))return!1;this.ir.push(dr,0);const a=this.ir.length-1;this.ir[t]=this.ir.length;if(!this._compileNode(e.otherwise))return!1;this.ir[a]=this.ir.length;return!0}compile(e){const t=(new PSStackToTree).evaluate(e,this.nIn);if(!t||t.length0?a<>-t:a;break}case Or:{const e=l[--i];l[i-1]+=e;break}case Rr:{const e=l[--i];l[i-1]-=e;break}case Hr:{const e=l[--i];l[i-1]*=e;break}case Dr:{const e=l[--i];l[i-1]=0!==e?l[i-1]/e:0;break}case Mr:{const e=l[--i];l[i-1]=0!==e?Math.trunc(l[i-1]/e):0;break}case Nr:{const e=l[--i];l[i-1]=0!==e?l[i-1]%e:0;break}case Pr:{const e=l[--i];l[i-1]**=e;break}case Er:{const e=l[--i];l[i-1]=l[i-1]===e?1:0;break}case _r:{const e=l[--i];l[i-1]=l[i-1]!==e?1:0;break}case zr:{const e=l[--i];l[i-1]=l[i-1]>e?1:0;break}case Lr:{const e=l[--i];l[i-1]=l[i-1]>=e?1:0;break}case Ur:{const e=l[--i];l[i-1]=l[i-1]e?1:0;break}case $s.ge:{const e=t[--this.#ge];t[this.#ge-1]=t[this.#ge-1]>=e?1:0;break}case $s.lt:{const e=t[--this.#ge];t[this.#ge-1]=t[this.#ge-1]0?a<>-e;break}case $s.min:{const e=t[--this.#ge];t[this.#ge-1]=Math.min(t[this.#ge-1],e);break}case $s.max:{const e=t[--this.#ge];t[this.#ge-1]=Math.max(t[this.#ge-1],e);break}case $s.dup:this.#be(t[this.#ge-1]);break;case $s.exch:{const e=t[--this.#ge],a=t[--this.#ge];this.#be(e);this.#be(a);break}case $s.pop:this.#ge--;break;case $s.copy:{const e=Math.trunc(t[--this.#ge]),a=this.#ge-e;for(let n=0;n1&&0!==e){const n=(e%a+a)%a;if(0!==n){const e=this.#ge-a,s=t.slice(e,this.#ge);for(let r=0;r>1,s=a.length>>1,{instructions:r}=e.body;return(e,t,i,o)=>{this.#ge=0;for(let a=0;a=0?this.#pe[l+e]:0;i[o+e]=MathClamp(a[2*e+1],a[2*e],t)}}}}const ti={if:4,else:5,end:11,select:27,call:16,local_get:32,local_set:33,local_tee:34,i32_const:65,i32_eqz:69,i32_and:113,i32_or:114,i32_xor:115,i32_shl:116,i32_shr_s:117,i32_trunc_f64_s:170,f64_const:68,f64_eq:97,f64_ne:98,f64_lt:99,f64_gt:100,f64_le:101,f64_ge:102,f64_abs:153,f64_neg:154,f64_ceil:155,f64_floor:156,f64_trunc:157,f64_nearest:158,f64_sqrt:159,f64_add:160,f64_sub:161,f64_mul:162,f64_div:163,f64_min:164,f64_max:165,f64_convert_i32_s:183,f64_store:57},ai=124,ni=1,si=2,ri=3,ii=5,oi=7,li=10;function unsignedLEB128(e){const t=[];do{let a=127&e;0!==(e>>>=7)&&(a|=128);t.push(a)}while(0!==e);return t}function encodeASCIIString(e){return[...unsignedLEB128(e.length),...Array.from(e,e=>e.charCodeAt(0))]}function section(e,t){return[e,...unsignedLEB128(t.length),...t]}function vec(e){const t=unsignedLEB128(e.length);for(const a of e)if("number"!=typeof a)for(const e of a)t.push(e);else t.push(a);return t}const fi=[["sin","Math","sin",[ai],[ai]],["cos","Math","cos",[ai],[ai]],["atan2","Math","atan2",[ai,ai],[ai]],["log","Math","log",[ai],[ai]],["log10","Math","log10",[ai],[ai]],["pow","Math","pow",[ai,ai],[ai]]],ci={Math:Object.fromEntries(fi.map(([e])=>[e,Math[e]]))};class PsWasmCompiler{static#ke=!1;static#ye=null;static#qe=null;static#ve=0;static#Se=0;static#Ae=null;static#xe=null;static#Ce=null;static#Ie=null;static#Fe=null;static#Te=null;static#Oe=null;static#Re=null;static#ue(){this.#ye=new Map([[$s.eq,ti.f64_eq],[$s.ne,ti.f64_ne],[$s.lt,ti.f64_lt],[$s.le,ti.f64_le],[$s.gt,ti.f64_gt],[$s.ge,ti.f64_ge]]);this.#qe=Object.create(null);for(let e=0;e[96,...vec(e),...vec(t)]);this.#xe=new Uint8Array(section(si,vec(fi.map(([,e,t],a)=>[...encodeASCIIString(e),...encodeASCIIString(t),0,...unsignedLEB128(a+1)]))));this.#Ce=new Uint8Array(section(ri,vec([[0]])));this.#Ie=new Uint8Array(section(ii,vec([[0,1]])));this.#Fe=new Uint8Array(section(oi,vec([[...encodeASCIIString("fn"),0,...unsignedLEB128(fi.length)],[...encodeASCIIString("mem"),2,0]])));this.#Te=new Uint8Array([0,97,115,109,1,0,0,0]);const e=new ArrayBuffer(8);this.#Oe=new DataView(e);this.#Re=new Uint8Array(e);this.#ke=!0}constructor(e,t){PsWasmCompiler.#ke||PsWasmCompiler.#ue();this._nIn=e.length>>1;this._nOut=t.length>>1;this._range=t;this._code=[];this._nextLocal=this._nIn;this._freeLocals=[];this._sharedLocals=new Map}_allocLocal(){return this._freeLocals.pop()??this._nextLocal++}_releaseLocal(e){this._freeLocals.push(e)}_emitULEB128(e){do{let t=127&e;0!==(e>>>=7)&&(t|=128);this._code.push(t)}while(0!==e)}_emitF64Const(e){this._code.push(ti.f64_const);PsWasmCompiler.#Oe.setFloat64(0,e,!0);for(let e=0;e<8;e++)this._code.push(PsWasmCompiler.#Re[e])}_emitLocalGet(e){this._code.push(ti.local_get);this._emitULEB128(e)}_emitLocalSet(e){this._code.push(ti.local_set);this._emitULEB128(e)}_emitLocalTee(e){this._code.push(ti.local_tee);this._emitULEB128(e)}_compileNode(e){if(e.shared){const t=this._sharedLocals.get(e);if(void 0!==t){this._emitLocalGet(t.local);0===--t.remaining&&this._releaseLocal(t.local);return!0}if(!this._compileNodeImpl(e))return!1;const a=this._allocLocal();this._sharedLocals.set(e,{local:a,remaining:e.sharedCount-1});this._emitLocalTee(a);return!0}return this._compileNodeImpl(e)}_compileNodeImpl(e){switch(e.type){case rr:this._emitLocalGet(e.index);return!0;case ir:{let t=e.value;"boolean"==typeof t&&(t=t?1:0);this._emitF64Const(t);return!0}case or:return this._compileUnaryNode(e);case lr:return this._compileBinaryNode(e);case fr:return this._compileTernaryNode(e);default:return!1}}_compileSinCosNode(e){const t=this._allocLocal();try{if(!this._compileNode(e.operand))return!1;const a=this._code;this._emitLocalSet(t);this._emitLocalGet(t);this._emitLocalGet(t);this._emitF64Const(360);a.push(ti.f64_div,ti.f64_trunc);this._emitF64Const(360);a.push(ti.f64_mul,ti.f64_sub);this._emitF64Const(PsWasmCompiler.#ve);a.push(ti.f64_mul,ti.call);this._emitULEB128(PsWasmCompiler.#qe[e.op===$s.sin?"sin":"cos"]);return!0}finally{this._releaseLocal(t)}}_compileUnaryNode(e){const t=this._code;if(e.op===$s.sin||e.op===$s.cos)return this._compileSinCosNode(e);if(e.op===$s.not){if(e.valueType===Js){if(!this._compileNodeAsBoolI32(e.operand))return!1;t.push(ti.i32_eqz,ti.f64_convert_i32_s);return!0}if(e.valueType===Ys){if(!this._compileNode(e.operand))return!1;t.push(ti.i32_trunc_f64_s,ti.i32_const,127,ti.i32_xor,ti.f64_convert_i32_s);return!0}return!1}if(!this._compileNode(e.operand))return!1;switch(e.op){case $s.abs:t.push(ti.f64_abs);break;case $s.neg:t.push(ti.f64_neg);break;case $s.sqrt:t.push(ti.f64_sqrt);break;case $s.floor:t.push(ti.f64_floor);break;case $s.ceiling:t.push(ti.f64_ceil);break;case $s.round:this._emitF64Const(.5);t.push(ti.f64_add,ti.f64_floor);break;case $s.truncate:t.push(ti.f64_trunc);break;case $s.cvi:t.push(ti.i32_trunc_f64_s,ti.f64_convert_i32_s);break;case $s.cvr:break;case $s.ln:t.push(ti.call);this._emitULEB128(PsWasmCompiler.#qe.log);break;case $s.log:t.push(ti.call);this._emitULEB128(PsWasmCompiler.#qe.log10);break;default:return!1}return!0}_compileSafeDivNode(e,t){const a=this._allocLocal();try{if(!this._compileNode(t))return!1;if(!this._compileNode(e))return!1;const n=this._code;this._emitLocalTee(a);n.push(ti.f64_div);this._emitF64Const(0);this._emitLocalGet(a);this._emitF64Const(0);n.push(ti.f64_ne,ti.select);return!0}finally{this._releaseLocal(a)}}_compileSafeIdivNode(e,t){const a=this._allocLocal();try{if(!this._compileNode(t))return!1;if(!this._compileNode(e))return!1;const n=this._code;this._emitLocalTee(a);n.push(ti.f64_div,ti.f64_trunc);this._emitF64Const(0);this._emitLocalGet(a);this._emitF64Const(0);n.push(ti.f64_ne,ti.select);return!0}finally{this._releaseLocal(a)}}_compileBitshiftNode(e,t){if(e.type!==ir||!Number.isInteger(e.value))return!1;if(!this._compileNode(t))return!1;const a=this._code;a.push(ti.i32_trunc_f64_s);const n=e.value;if(n>0){a.push(ti.i32_const);this._emitULEB128(n);a.push(ti.i32_shl)}else if(n<0){a.push(ti.i32_const);this._emitULEB128(-n);a.push(ti.i32_shr_s)}a.push(ti.f64_convert_i32_s);return!0}_compileModNode(e,t){if(e.type===ir&&0===e.value){if(!this._compileNode(t))return!1;this._code.push(ti.drop);this._emitF64Const(0);return!0}const a=this._allocLocal();try{if(!this._compileNode(t))return!1;this._emitLocalTee(a);const n=this._code;if(e.type===ir){this._emitLocalGet(a);this._emitF64Const(e.value);n.push(ti.f64_div,ti.f64_trunc);this._emitF64Const(e.value);n.push(ti.f64_mul,ti.f64_sub)}else{const t=this._allocLocal();try{if(!this._compileNode(e))return!1;this._emitLocalSet(t);this._emitLocalGet(a);this._emitLocalGet(t);n.push(ti.f64_div,ti.f64_trunc);this._emitLocalGet(t);n.push(ti.f64_mul,ti.f64_sub);this._emitF64Const(0);this._emitLocalGet(t);this._emitF64Const(0);n.push(ti.f64_ne,ti.select)}finally{this._releaseLocal(t)}}return!0}finally{this._releaseLocal(a)}}_compileAtanNode(e,t){const a=this._allocLocal();try{if(!this._compileNode(t))return!1;if(!this._compileNode(e))return!1;const n=this._code;n.push(ti.call);this._emitULEB128(PsWasmCompiler.#qe.atan2);this._emitF64Const(PsWasmCompiler.#Se);n.push(ti.f64_mul);this._emitLocalTee(a);this._emitF64Const(0);n.push(ti.f64_lt,ti.if,ai);this._emitLocalGet(a);this._emitF64Const(360);n.push(ti.f64_add,ti.else);this._emitLocalGet(a);n.push(ti.end);return!0}finally{this._releaseLocal(a)}}_compileBitwiseNode(e,t,a){if(!this._compileBitwiseOperandI32(a))return!1;if(!this._compileBitwiseOperandI32(t))return!1;const n=this._code;switch(e){case $s.and:n.push(ti.i32_and);break;case $s.or:n.push(ti.i32_or);break;case $s.xor:n.push(ti.i32_xor);break;default:return!1}n.push(ti.f64_convert_i32_s);return!0}_compileBitwiseOperandI32(e){if(e.valueType===Js)return this._compileNodeAsBoolI32(e);if(!this._compileNode(e))return!1;this._code.push(ti.i32_trunc_f64_s);return!0}_compileStandardBinaryNode(e,t,a){if(t!==a||t.type===rr||t.type===ir||t.shared){if(!this._compileNode(a))return!1;if(!this._compileNode(t))return!1}else{const e=this._allocLocal();try{if(!this._compileNode(t))return!1;this._emitLocalTee(e);this._emitLocalGet(e)}finally{this._releaseLocal(e)}}const n=this._code;switch(e){case $s.add:n.push(ti.f64_add);break;case $s.sub:n.push(ti.f64_sub);break;case $s.mul:n.push(ti.f64_mul);break;case $s.exp:n.push(ti.call);this._emitULEB128(PsWasmCompiler.#qe.pow);break;case $s.eq:n.push(ti.f64_eq,ti.f64_convert_i32_s);break;case $s.ne:n.push(ti.f64_ne,ti.f64_convert_i32_s);break;case $s.lt:n.push(ti.f64_lt,ti.f64_convert_i32_s);break;case $s.le:n.push(ti.f64_le,ti.f64_convert_i32_s);break;case $s.gt:n.push(ti.f64_gt,ti.f64_convert_i32_s);break;case $s.ge:n.push(ti.f64_ge,ti.f64_convert_i32_s);break;case $s.min:n.push(ti.f64_min);break;case $s.max:n.push(ti.f64_max);break;default:return!1}return!0}_compileBinaryNode(e){const{op:t,first:a,second:n}=e;return t===$s.bitshift?this._compileBitshiftNode(a,n):t===$s.div?this._compileSafeDivNode(a,n):t===$s.idiv?this._compileSafeIdivNode(a,n):t===$s.mod?this._compileModNode(a,n):t===$s.atan?this._compileAtanNode(a,n):t===$s.and||t===$s.or||t===$s.xor?this._compileBitwiseNode(t,a,n):this._compileStandardBinaryNode(t,a,n)}_compileNodeAsBoolI32(e){if(e.type===lr){const t=PsWasmCompiler.#ye.get(e.op);if(void 0!==t){if(!this._compileNode(e.second))return!1;if(!this._compileNode(e.first))return!1;this._code.push(t);return!0}if(e.valueType===Js&&(e.op===$s.and||e.op===$s.or||e.op===$s.xor)){if(!this._compileNodeAsBoolI32(e.second))return!1;if(!this._compileNodeAsBoolI32(e.first))return!1;switch(e.op){case $s.and:this._code.push(ti.i32_and);break;case $s.or:this._code.push(ti.i32_or);break;case $s.xor:this._code.push(ti.i32_xor)}return!0}}if(e.type===or&&e.op===$s.not&&e.valueType===Js){if(!this._compileNodeAsBoolI32(e.operand))return!1;this._code.push(ti.i32_eqz);return!0}if(!this._compileNode(e))return!1;if(e.valueType===Js)this._code.push(ti.i32_trunc_f64_s);else{this._emitF64Const(0);this._code.push(ti.f64_ne)}return!0}_compileTernaryNode(e){if(!this._compileNodeAsBoolI32(e.cond))return!1;this._code.push(ti.if,ai);if(!this._compileNode(e.then))return!1;this._code.push(ti.else);if(!this._compileNode(e.otherwise))return!1;this._code.push(ti.end);return!0}compile(e){const t=(new PSStackToTree).evaluate(e,this._nIn);if(!t||t.length0?[[...unsignedLEB128(s),ai]]:[]),l=o.length+a.length,f=new Uint8Array(section(li,vec([[...unsignedLEB128(l),...o,...a]]))),c=PsWasmCompiler.#Te,h=PsWasmCompiler.#xe,u=PsWasmCompiler.#Ce,m=PsWasmCompiler.#Ie,p=PsWasmCompiler.#Fe,d=c.length+i.length+h.length+u.length+m.length+p.length+f.length,g=new Uint8Array(d);let b=0;g.set(c,b);b+=c.length;g.set(i,b);b+=i.length;g.set(h,b);b+=h.length;g.set(u,b);b+=u.length;g.set(m,b);b+=m.length;g.set(p,b);b+=p.length;g.set(f,b);return g}}function buildPostScriptWasmFunction(e,t,a){const n=function compilePostScriptToWasm(e,t,a){return new PsWasmCompiler(t,a).compile(parsePostScriptFunction(e))}(e,t,a);if(!n)return null;try{return function _makeWrapper(e,t,a){const{fn:n,mem:s}=e,r=new Float64Array(s.buffer,0,a);let i;switch(a){case 1:i=(e,t)=>{e[t]=r[0]};break;case 2:i=(e,t)=>{e[t]=r[0];e[t+1]=r[1]};break;case 3:i=(e,t)=>{e[t]=r[0];e[t+1]=r[1];e[t+2]=r[2]};break;case 4:i=(e,t)=>{e[t]=r[0];e[t+1]=r[1];e[t+2]=r[2];e[t+3]=r[3]};break;default:i=(e,t)=>{for(let n=0;n{n(e[t]);i(a,s)};case 2:return(e,t,a,s)=>{n(e[t],e[t+1]);i(a,s)};case 3:return(e,t,a,s)=>{n(e[t],e[t+1],e[t+2]);i(a,s)};case 4:return(e,t,a,s)=>{n(e[t],e[t+1],e[t+2],e[t+3]);i(a,s)};default:{const e=new Float64Array(t);return(a,s,r,o)=>{for(let n=0;n>1,a.length>>1)}catch{return null}}class BaseLocalCache{constructor(e){this._onlyRefs=!0===e?.onlyRefs;if(!this._onlyRefs){this._nameRefMap=new Map;this._imageMap=new Map}this._imageCache=new RefSetCache}getByName(e){this._onlyRefs&&unreachable("Should not call `getByName` method.");const t=this._nameRefMap.get(e);return t?this.getByRef(t):this._imageMap.get(e)||null}getByRef(e){return this._imageCache.get(e)||null}set(e,t,a){unreachable("Abstract method `set` called.")}}class LocalImageCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalImageCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}}class LocalColorSpaceCache extends BaseLocalCache{set(e=null,t=null,a){if("string"!=typeof e&&!t)throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');if(t){if(this._imageCache.has(t))return;null!==e&&this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}}class LocalFunctionCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalFunctionCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}}class LocalGStateCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalGStateCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}}class LocalTilingPatternCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}}class RegionalImageCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('RegionalImageCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}}class GlobalColorSpaceCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('GlobalColorSpaceCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}clear(){this._imageCache.clear()}}class GlobalImageCache{static NUM_PAGES_THRESHOLD=2;static MIN_IMAGES_TO_CACHE=10;static MAX_BYTE_SIZE=5e7;#He=new RefSet;constructor(){this._refCache=new RefSetCache;this._imageCache=new RefSetCache}get#Be(){let e=0;for(const t of this._imageCache)e+=t.byteSize;return e}get#De(){return!(this._imageCache.size+e):null}class PDFFunction{static getSampleArray(e,t,a,n){let s=t;for(const t of e)s*=t;const r=new Array(s);let i=0,o=0;const l=1/(2**a-1),f=n.getBytes((s*a+7)/8);let c=0;for(let e=0;e>i)*l;o&=(1<0?r[h-1]:a[0],m=h{PsJsCompiler.execute(r,e,t,a,n)}:PSStackBasedInterpreter.build(s,t,a)}(r,n,s)}}function isPDFFunction(e){let t;if(e instanceof Dict)t=e;else{if(!(e instanceof BaseStream))return!1;t=e.dict}return t.has("FunctionType")}const di=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","BN","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"],gi=["AN","AN","AN","AN","AN","AN","ON","ON","AL","ET","ET","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","AL","AL","AL","AL","AL","AL"];function isOdd(e){return!!(1&e)}function isEven(e){return!(1&e)}function findUnequal(e,t,a){let n,s;for(n=t,s=e.length;n4){n=!0;t=0}else{n=!1;t=1}const l=[];for(r=0;r=0&&"ET"===wi[e];--e)wi[e]="EN";for(let e=r+1;e=0;e--){const a=wi[e];if("L"===a){t="L";break}if("R"===a||"EN"===a||"AN"===a){t="R";break}}let a=h;for(let t=e;tp&&isOdd(p)&&(g=p)}for(p=d;p>=g;--p){let e=-1;for(r=0,i=l.length;r=0){reverseValues(bi,e,r);e=-1}}else e<0&&(e=r);e>=0&&reverseValues(bi,e,l.length)}for(r=0,i=bi.length;r"!==e||(bi[r]="")}return createBidiText(bi.join(""),n)}const ji={style:"normal",weight:"normal"},ki={style:"normal",weight:"bold"},yi={style:"italic",weight:"normal"},qi={style:"italic",weight:"bold"},vi=new Map([["Times-Roman",{local:["Times New Roman","Times-Roman","Times","Liberation Serif","Nimbus Roman","Nimbus Roman L","Tinos","Thorndale","TeX Gyre Termes","FreeSerif","Linux Libertine O","Libertinus Serif","PT Astra Serif","DejaVu Serif","Bitstream Vera Serif","Ubuntu"],style:ji,ultimate:"serif"}],["Times-Bold",{alias:"Times-Roman",style:ki,ultimate:"serif"}],["Times-Italic",{alias:"Times-Roman",style:yi,ultimate:"serif"}],["Times-BoldItalic",{alias:"Times-Roman",style:qi,ultimate:"serif"}],["Helvetica",{local:["Helvetica","Helvetica Neue","Arial","Arial Nova","Liberation Sans","Arimo","Nimbus Sans","Nimbus Sans L","A030","TeX Gyre Heros","FreeSans","DejaVu Sans","Albany","Bitstream Vera Sans","Arial Unicode MS","Microsoft Sans Serif","Apple Symbols","Cantarell"],path:"LiberationSans-Regular.ttf",style:ji,ultimate:"sans-serif"}],["Helvetica-Bold",{alias:"Helvetica",path:"LiberationSans-Bold.ttf",style:ki,ultimate:"sans-serif"}],["Helvetica-Oblique",{alias:"Helvetica",path:"LiberationSans-Italic.ttf",style:yi,ultimate:"sans-serif"}],["Helvetica-BoldOblique",{alias:"Helvetica",path:"LiberationSans-BoldItalic.ttf",style:qi,ultimate:"sans-serif"}],["Courier",{local:["Courier","Courier New","Liberation Mono","Nimbus Mono","Nimbus Mono L","Cousine","Cumberland","TeX Gyre Cursor","FreeMono","Linux Libertine Mono O","Libertinus Mono"],style:ji,ultimate:"monospace"}],["Courier-Bold",{alias:"Courier",style:ki,ultimate:"monospace"}],["Courier-Oblique",{alias:"Courier",style:yi,ultimate:"monospace"}],["Courier-BoldOblique",{alias:"Courier",style:qi,ultimate:"monospace"}],["ArialBlack",{local:["Arial Black"],style:{style:"normal",weight:"900"},fallback:"Helvetica-Bold"}],["ArialBlack-Bold",{alias:"ArialBlack"}],["ArialBlack-Italic",{alias:"ArialBlack",style:{style:"italic",weight:"900"},fallback:"Helvetica-BoldOblique"}],["ArialBlack-BoldItalic",{alias:"ArialBlack-Italic"}],["ArialNarrow",{local:["Arial Narrow","Liberation Sans Narrow","Helvetica Condensed","Nimbus Sans Narrow","TeX Gyre Heros Cn"],style:ji,fallback:"Helvetica"}],["ArialNarrow-Bold",{alias:"ArialNarrow",style:ki,fallback:"Helvetica-Bold"}],["ArialNarrow-Italic",{alias:"ArialNarrow",style:yi,fallback:"Helvetica-Oblique"}],["ArialNarrow-BoldItalic",{alias:"ArialNarrow",style:qi,fallback:"Helvetica-BoldOblique"}],["Calibri",{local:["Calibri","Carlito"],style:ji,fallback:"Helvetica"}],["Calibri-Bold",{alias:"Calibri",style:ki,fallback:"Helvetica-Bold"}],["Calibri-Italic",{alias:"Calibri",style:yi,fallback:"Helvetica-Oblique"}],["Calibri-BoldItalic",{alias:"Calibri",style:qi,fallback:"Helvetica-BoldOblique"}],["Wingdings",{local:["Wingdings","URW Dingbats"],style:ji}],["Wingdings-Regular",{alias:"Wingdings"}],["Wingdings-Bold",{alias:"Wingdings"}],["ËÎÌå",{local:["SimSun","SimSun Regular","NSimSun"],style:ji,ultimate:"serif"}],["ºÚÌå",{local:["SimHei","SimHei Regular"],style:ji,ultimate:"sans-serif"}],["¿¬Ìå",{local:["KaiTi","SimKai","SimKai Regular"],style:ji,ultimate:"sans-serif"}],["·ÂËÎ",{local:["FangSong","SimFang","SimFang Regular"],style:ji,ultimate:"serif"}],["¿¬Ìå_GB2312",{alias:"¿¬Ìå"}],["·ÂËÎ_GB2312",{alias:"·ÂËÎ"}],["Á¥Êé",{local:["SimLi","SimLi Regular"],style:ji,ultimate:"serif"}],["ÐÂËÎ",{alias:"ËÎÌå"}]]),Si=new Map([["Arial-Black","ArialBlack"]]);function getFamilyName(e){const t=new Set(["thin","extralight","ultralight","demilight","semilight","light","book","regular","normal","medium","demibold","semibold","bold","extrabold","ultrabold","black","heavy","extrablack","ultrablack","roman","italic","oblique","ultracondensed","extracondensed","condensed","semicondensed","normal","semiexpanded","expanded","extraexpanded","ultraexpanded","bolditalic"]);return e.split(/[- ,+]+/g).filter(e=>!t.has(e.toLowerCase())).join(" ")}function generateFont({alias:e,local:t,path:a,fallback:n,style:s,ultimate:r},i,o,l=!0,f=!0,c=""){const h={style:null,ultimate:null};if(t){const e=c?` ${c}`:"";for(const a of t)i.push(`local(${a}${e})`)}if(e){const t=vi.get(e),r=c||function getStyleToAppend(e){switch(e){case ki:return"Bold";case yi:return"Italic";case qi:return"Bold Italic";default:if("bold"===e?.weight)return"Bold";if("italic"===e?.style)return"Italic"}return""}(s);Object.assign(h,generateFont(t,i,o,l&&!n,f&&!a,r))}s&&(h.style=s);r&&(h.ultimate=r);if(l&&n){const e=vi.get(n),{ultimate:t}=generateFont(e,i,o,l,f&&!a,c);h.ultimate||=t}f&&a&&o&&i.push(`url(${o}${a})`);return h}function getFontSubstitution(e,t,a,n,s,r){if(n.startsWith("InvalidPDFjsFont_"))return null;"TrueType"!==r&&"Type1"!==r||!/^[A-Z]{6}\+/.test(n)||(n=n.slice(7));const i=n=normalizeFontName(n);let o=e.get(i);if(o)return o;let l=vi.get(n);if(!l)for(const[e,t]of Si)if(n.startsWith(e)){n=`${t}${n.substring(e.length)}`;l=vi.get(n);break}let f=!1;if(!l){l=vi.get(s);f=!0}const c=`${t.getDocId()}_s${t.createFontId()}`;if(!l){if(!validateFontName(n)){warn(`Cannot substitute the font because of its name: ${n}`);e.set(i,null);return null}const t=/bold/gi.test(n),a=/oblique|italic/gi.test(n),s=t&&a&&qi||t&&ki||a&&yi||ji;o={css:`"${getFamilyName(n)}",${c}`,guessFallback:!0,loadedName:c,baseFontName:n,src:`local(${n})`,style:s};e.set(i,o);return o}const h=[];f&&validateFontName(n)&&h.push(`local(${n})`);const{style:u,ultimate:m}=generateFont(l,h,a),p=null===m,d=p?"":`,${m}`;o={css:`"${getFamilyName(n)}",${c}${d}`,guessFallback:p,loadedName:c,baseFontName:n,src:h.join(","),style:u};e.set(i,o);return o}const Ai=3285377520,xi=4294901760,Ci=65535;class MurmurHash3_64{constructor(e){this.h1=e?4294967295&e:Ai;this.h2=e?4294967295&e:Ai}update(e){let t,a;if("string"==typeof e){t=new Uint8Array(2*e.length);a=0;for(let n=0,s=e.length;n>>8;t[a++]=255&s}}}else{if(!ArrayBuffer.isView(e))throw new Error("Invalid data format, must be a string or TypedArray.");t=e.slice();a=t.byteLength}const n=a>>2,s=a-4*n,r=new Uint32Array(t.buffer,0,n);let i=0,o=0,l=this.h1,f=this.h2;const c=3432918353,h=461845907,u=11601,m=13715;for(let e=0;e>>17;i=i*h&xi|i*m&Ci;l^=i;l=l<<13|l>>>19;l=5*l+3864292196}else{o=r[e];o=o*c&xi|o*u&Ci;o=o<<15|o>>>17;o=o*h&xi|o*m&Ci;f^=o;f=f<<13|f>>>19;f=5*f+3864292196}i=0;switch(s){case 3:i^=t[4*n+2]<<16;case 2:i^=t[4*n+1]<<8;case 1:i^=t[4*n];i=i*c&xi|i*u&Ci;i=i<<15|i>>>17;i=i*h&xi|i*m&Ci;1&n?l^=i:f^=i}this.h1=l;this.h2=f}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&xi|36045*e&Ci;t=4283543511*t&xi|(2950163797*(t<<16|e>>>16)&xi)>>>16;e^=t>>>1;e=444984403*e&xi|60499*e&Ci;t=3301882366*t&xi|(3120437893*(t<<16|e>>>16)&xi)>>>16;e^=t>>>1;return(e>>>0).toString(16).padStart(8,"0")+(t>>>0).toString(16).padStart(8,"0")}}class PDFImage{constructor({xref:e,res:t,image:a,isInline:n=!1,smask:s=null,mask:r=null,isMask:i=!1,pdfFunctionFactory:o,globalColorSpaceCache:l,localColorSpaceCache:f}){this.image=a;const c=a.dict,h=c.get("F","Filter");let u;if(h instanceof Name)u=h.name;else if(Array.isArray(h)){const t=e.fetchIfRef(h[0]);t instanceof Name&&(u=t.name)}switch(u){case"JPXDecode":({width:a.width,height:a.height,componentsCount:a.numComps,bitsPerComponent:a.bitsPerComponent}=JpxImage.parseImageProperties(a.stream));a.stream.reset();const e=ImageResizer.getReducePowerForJPX(a.width,a.height,a.numComps);this.jpxDecoderOptions={numComponents:0,isIndexedColormap:!1,smaskInData:c.has("SMaskInData"),reducePower:e};if(e){const t=2**e;a.width=Math.ceil(a.width/t);a.height=Math.ceil(a.height/t)}break;case"JBIG2Decode":a.bitsPerComponent=1;a.numComps=1}let m=c.get("W","Width"),p=c.get("H","Height");if(Number.isInteger(a.width)&&a.width>0&&Number.isInteger(a.height)&&a.height>0&&(a.width!==m||a.height!==p)){warn("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");m=a.width;p=a.height}else{const e="number"==typeof m&&m>0,t="number"==typeof p&&p>0;if(!e||!t){if(!a.fallbackDims)throw new FormatError(`Invalid image width: ${m} or height: ${p}`);warn("PDFImage - using the Width/Height of the parent image, for SMask/Mask data.");e||(m=a.fallbackDims.width);t||(p=a.fallbackDims.height)}}this.width=m;this.height=p;this.interpolate=c.get("I","Interpolate");this.imageMask=c.get("IM","ImageMask")||!1;this.matte=c.get("Matte")||!1;let d=a.bitsPerComponent;if(!d){d=c.get("BPC","BitsPerComponent");if(!d){if(!this.imageMask)throw new FormatError(`Bits per component missing in image: ${this.imageMask}`);d=1}}this.bpc=d;if(this.imageMask)this.numComps=1;else{let s=c.getRaw("CS")||c.getRaw("ColorSpace");const r=!!s;if(r)this.jpxDecoderOptions?.smaskInData&&(s=Name.get("DeviceRGBA"));else if(this.jpxDecoderOptions)s=Name.get("DeviceRGBA");else switch(a.numComps){case 1:s=Name.get("DeviceGray");break;case 3:s=Name.get("DeviceRGB");break;case 4:s=Name.get("DeviceCMYK");break;default:throw new Error(`Images with ${a.numComps} color components not supported.`)}this.colorSpace=ColorSpaceUtils.parse({cs:s,xref:e,resources:n?t:null,pdfFunctionFactory:o,globalColorSpaceCache:l,localColorSpaceCache:f});this.numComps=this.colorSpace.numComps;if(this.jpxDecoderOptions){this.jpxDecoderOptions.numComponents=r?this.numComps:0;this.jpxDecoderOptions.isIndexedColormap="Indexed"===this.colorSpace.name}}this.decode=c.getArray("D","Decode");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode,d)||i&&!ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<0,l=(n+7>>3)*s,f=await e.getImageData(l),c=1===n&&1===s&&o===(0===f.length||!!(128&f[0]));if(c)return{isSingleOpaquePixel:c};if(t){if(ImageResizer.needsToBeResized(n,s)){const e=new Uint8ClampedArray(n*s*4);convertBlackAndWhiteToRGBA({src:f,dest:e,width:n,height:s,nonBlackColor:0,inverseDecode:o});return ImageResizer.createImage({kind:O,data:e,width:n,height:s,interpolate:r})}const e=new OffscreenCanvas(n,s),t=e.getContext("2d"),a=t.createImageData(n,s);convertBlackAndWhiteToRGBA({src:f,dest:a.data,width:n,height:s,nonBlackColor:0,inverseDecode:o});t.putImageData(a,0,0);return{data:null,width:n,height:s,interpolate:r,bitmap:e.transferToImageBitmap()}}const h=f.byteLength;let u;if(e instanceof DecodeStream&&(!o||l===h))u=f;else if(o){u=new Uint8Array(l);u.set(f);u.fill(255,h)}else u=new Uint8Array(f);if(o)for(let e=0;e>7&1;i[u+1]=h>>6&1;i[u+2]=h>>5&1;i[u+3]=h>>4&1;i[u+4]=h>>3&1;i[u+5]=h>>2&1;i[u+6]=h>>1&1;i[u+7]=1&h;u+=8}if(u>=1}}}}else{let a=0;h=0;for(u=0,c=r;u>n;s<0?s=0:s>f&&(s=f);i[u]=s;h&=(1<this.smask.fillGrayBuffer(e,{...n,destWidth:t,destHeight:a});else if(this.mask)if(this.mask instanceof PDFImage)r=(e,n)=>this.mask.fillGrayBuffer(e,{...n,invertOutput:!0,destWidth:t,destHeight:a});else{if(!Array.isArray(this.mask))throw new FormatError("Unknown mask format.");r=(e,{maxRows:a,offset:n,stride:r})=>{for(let i=0,o=t*a;ithis.mask[r+1]){t=255;break}}e[i*r+n]=t}}}else r=(e,{maxRows:a,offset:n,stride:s})=>{for(let r=0,i=t*a;r>3,c=t&&ImageResizer.needsToBeResized(a,n);if(!this.smask&&!this.mask&&"DeviceRGBA"===this.colorSpace.name){s.kind=O;const e=s.data=await this.getImageBytes(o*i*4,{internal:t&&c});return t?c?ImageResizer.createImage(s,!1):this.createBitmap(O,a,n,e):s}if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===l?e=F:"DeviceRGB"!==this.colorSpace.name||8!==l||this.needsDecode||(e=T);if(e&&!this.smask&&!this.mask&&a===i&&n===o){const r=await this.#Me(i,o);if(r)return r;const l=await this.getImageBytes(o*f,{internal:t&&c});if(t)return c?ImageResizer.createImage({data:l,kind:e,width:a,height:n,interpolate:this.interpolate},this.needsDecode):this.createBitmap(e,i,o,l);s.kind=e;s.data=l;if(this.needsDecode){assert(e===F,"PDFImage.createImageData: The image must be grayscale.");const t=s.data;for(let e=0,a=t.length;e>3,u=await this.getImageBytes(f*h,{internal:!0}),m=this.getComponents(u),p=t??l,d=a??f,g=p!==l||d!==f,b=void 0===s?d:Math.min(d,s);let w=l,j=0,k=null;if(g){w=p;j=f/d;const e=l/p;k=new Uint32Array(p);for(let t=0;t0&&n[0].count++}class TimeSlotManager{static TIME_SLOT_DURATION_MS=20;static CHECK_TIME_EVERY=100;constructor(){this.reset()}check(){if(++this.checked!isFinite(e))&&(m=null);l.has("OC")&&(h=await this.parseMarkedContentProps(l.get("OC"),e));void 0!==h&&n.addOp(xt,["OC",h]);const p=l.get("Group");let d;const g=[f&&new Float32Array(f),!p&&m||null],b=l.get("Resources");if(p){u={matrix:f,bbox:m,smask:a,isolated:!1,knockout:!1,needsIsolation:!1};let t=null;if(isName(p.get("S"),"Transparency")){u.isolated=p.get("I")||!1;u.knockout=p.get("K")||!1;if(p.has("CS")){const a=this._getColorSpace(p.getRaw("CS"),e,i);t=a instanceof ColorSpace?a:await this._handleColorSpace(a)}}if(a?.backdrop){t||=ColorSpaceUtils.rgb;a.backdrop=t.getRgbHex(a.backdrop,0)}d=new CheckedOperatorList}else{d=n;n.addOp(Tt,g)}await this.getOperatorList({stream:t,task:s,resources:b instanceof Dict?b:e,operatorList:d,initialState:r,prevRefs:o});if(p){u.needsIsolation=d.needsIsolation||!!a;n.addOp(Rt,[u]);n.addOp(Tt,g);n.addOpList(d);n.addOp(Ot,[]);n.addOp(Ht,[u])}else n.addOp(Ot,[]);void 0!==h&&n.addOp(Ct,[])}_sendImgData(e,t,a=!1){const n=t?[t.bitmap||t.data.buffer]:null;return this.parsingType3Font||a?this.handler.send("commonobj",[e,"Image",t],n):this.handler.send("obj",[e,this.pageIndex,"Image",t],n)}async buildPaintImageXObject({resources:e,image:t,isInline:a=!1,operatorList:n,cacheKey:s,localImageCache:r,localColorSpaceCache:i}){const{maxImageSize:o,ignoreErrors:l,isOffscreenCanvasSupported:f}=this.options,{dict:c}=t,h=c.objId,u=c.get("W","Width"),m=c.get("H","Height");if(!u||"number"!=typeof u||!m||"number"!=typeof m){warn("Image dimensions are missing, or not numbers.");return}if(-1!==o&&u*m>o){const e="Image exceeded maximum allowed size and was removed.";if(!l)throw new Error(e);warn(e);return}let p;c.has("OC")&&(p=await this.parseMarkedContentProps(c.get("OC"),e));let d,g,b;if(c.get("IM","ImageMask")||!1){d=await PDFImage.createMask({image:t,isOffscreenCanvasSupported:f&&!this.parsingType3Font});if(d.isSingleOpaquePixel){g=Ut;b=[];n.addImageOps(g,b,p);if(s){const e={fn:g,args:b,optionalContent:p};r.set(s,h,e);h&&this._regionalImageCache.set(null,h,e)}return}if(this.parsingType3Font){b=function compileType3Glyph({data:e,width:t,height:a}){if(t>1e3||a>1e3)return null;const n=new Uint8Array([0,2,4,0,1,0,5,4,8,10,0,8,0,2,1,0]),s=t+1,r=new Uint8Array(s*(a+1));let i,o,l;const f=t+7&-8,c=new Uint8Array(f*a);let h=0;for(const t of e){let e=128;for(;e>0;){c[h++]=t&e?0:255;e>>=1}}let u=0;h=0;if(0!==c[h]){r[0]=1;++u}for(o=1;o>2)+(c[h+1]?4:0)+(c[h-f+1]?8:0);if(n[e]){r[l+o]=n[e];++u}h++}if(c[h-f]!==c[h]){r[l+o]=c[h]?2:4;++u}if(u>1e3)return null}h=f*(a-1);l=i*s;if(0!==c[h]){r[l]=8;++u}for(o=1;o1e3)return null;const m=new Int32Array([0,s,-1,0,-s,0,0,0,1]),p=[],{a:d,b:g,c:b,d:w,e:j,f:k}=(new DOMMatrix).scaleSelf(1/t,-1/a).translateSelf(0,-a);for(i=0;u&&i<=a;i++){let e=i*s;const a=e+t;for(;e>4;r[e]&=f>>2|f<<2}n=e%s;o=e/s|0;p.push($t,d*n+b*o+j,g*n+w*o+k);r[e]||--u}while(l!==e);--i}return[Gt,[new Float32Array(p)],new Float32Array([0,0,t,a])]}(d);if(b){n.addImageOps(Xt,b,p);return}warn("Cannot compile Type3 glyph.");n.addImageOps(Mt,[d],p);return}const e=`mask_${this.idFactory.createObjId()}`;n.addDependency(e);d.dataLen=d.bitmap?d.width*d.height*4:d.data.length;this._sendImgData(e,d);g=Mt;b=[{data:e,width:d.width,height:d.height,interpolate:d.interpolate,count:1}];n.addImageOps(g,b,p);if(s){const t={objId:e,fn:g,args:b,optionalContent:p};r.set(s,h,t);h&&this._regionalImageCache.set(null,h,t)}return}const w=c.has("SMask")||c.has("Mask");if(a&&u+m<200&&!w){try{const s=new PDFImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,globalColorSpaceCache:this.globalColorSpaceCache,localColorSpaceCache:i});d=await s.createImageData(!0,!1);n.addImageOps(Et,[d],p)}catch(e){const t=`Unable to decode inline image: "${e}".`;if(!l)throw new Error(t);warn(t)}return}let j=`img_${this.idFactory.createObjId()}`,k=!1,y=null;if(this.parsingType3Font)j=`${this.idFactory.getDocId()}_type3_${j}`;else if(s&&h){k=this.globalImageCache.shouldCache(h,this.pageIndex);if(k){assert(!a,"Cannot cache an inline image globally.");j=`${this.idFactory.getDocId()}_${j}`}}n.addDependency(j);g=Pt;b=[j,u,m];n.addImageOps(g,b,p,w);if(k){y={objId:j,fn:g,args:b,optionalContent:p,hasMask:w,byteSize:0};if(this.globalImageCache.hasDecodeFailed(h)){this.globalImageCache.setData(h,y);this._sendImgData(j,null,k);return}if(u*m>25e4||w){const e=await this.handler.sendWithPromise("commonobj",[j,"CopyLocalImage",{imageRef:h}]);if(e){this.globalImageCache.setData(h,y);this.globalImageCache.addByteSize(h,e);return}}}PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,globalColorSpaceCache:this.globalColorSpaceCache,localColorSpaceCache:i}).then(async e=>{d=await e.createImageData(!1,f);d.dataLen=d.bitmap?d.width*d.height*4:d.data.length;d.ref=h;k&&this.globalImageCache.addByteSize(h,d.dataLen);return this._sendImgData(j,d,k)}).catch(e=>{warn(`Unable to decode image "${j}": "${e}".`);h&&this.globalImageCache.addDecodeFailed(h);return this._sendImgData(j,null,k)});if(s){const e={objId:j,fn:g,args:b,optionalContent:p,hasMask:w};r.set(s,h,e);if(h){this._regionalImageCache.set(null,h,e);if(k){assert(y,"The global cache-data must be available.");this.globalImageCache.setData(h,y)}}}}handleSMask(e,t,a,n,s,r,i){const o=e.get("G"),l={subtype:e.get("S").name,backdrop:e.get("BC")},f=e.get("TR");if(isPDFFunction(f)){const e=this._pdfFunctionFactory.create(f),t=new Uint8Array(256),a=new Float32Array(1);for(let n=0;n<256;n++){a[0]=n/255;e(a,0,a,0);t[n]=255*a[0]|0}l.transferMap=t}return this.buildFormXObject(t,o,l,a,n,s.state.clone({newPath:!0}),r,i)}handleTransferFunction(e){let t;if(Array.isArray(e)){t=e;e.length>1&&e.every(t=>t===e[0])&&(t=[e[0]])}else{if(!isPDFFunction(e))return null;t=[e]}const a=[];let n=0,s=0;for(const e of t){const t=this.xref.fetchIfRef(e);n++;if(isName(t,"Identity")){a.push(null);continue}if(!isPDFFunction(t))return null;const r=this._pdfFunctionFactory.create(t),i=new Uint8Array(256),o=new Float32Array(1);for(let e=0;e<256;e++){o[0]=e/255;r(o,0,o,0);i[e]=255*o[0]|0}a.push(i);s++}return 1!==n&&4!==n||0===s?null:a}handleTilingType(e,t,a,n,s,r,i,o){const l=new CheckedOperatorList,f=Dict.merge({xref:this.xref,dictArray:[s.get("Resources"),a]});return this.getOperatorList({stream:n,task:i,resources:f,operatorList:l}).then(function(){const a=l.getIR(),{needsIsolation:n}=l,i=getTilingPatternIR(a,s,t,n);r.addDependencies(l.dependencies);r.addOp(e,i);s.objId&&o.set(null,s.objId,{operatorListIR:a,needsIsolation:n,dict:s})}).catch(e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`handleTilingType - ignoring pattern: "${e}".`)}})}async handleSetFont(e,t,a,n,s,r,i=null,o=null){const l=t?.[0]instanceof Name?t[0].name:null,f=await this.loadFont(l,a,e,s,i,o);f.font.isType3Font&&n.addDependencies(f.type3Dependencies);r.font=f.font;f.send(this.handler);return f.loadedName}handleText(e,t){const a=t.font,n=a.charsToGlyphs(e);if(a.data){(!!(t.textRenderingMode&C)||"Pattern"===t.fillColorSpace.name||"Pattern"===t.strokeColorSpace.name||a.disableFontFace)&&PartialEvaluator.buildFontPaths(a,n,this.handler,this.options)}return n}ensureStateFont(e){if(e.font)return;const t=new FormatError("Missing setFont (Tf) operator before text rendering operator.");if(!this.options.ignoreErrors)throw t;warn(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:a,cacheKey:n,task:s,stateManager:r,localGStateCache:i,localColorSpaceCache:o,seenRefs:l}){const f=t.objId;let c=!0;const h=[];let u=Promise.resolve();for(const[n,i]of t)switch(n){case"Type":break;case"LW":if("number"!=typeof i){warn(`Invalid LW (line width): ${i}`);break}h.push([n,Math.abs(i)]);break;case"LC":case"LJ":case"ML":case"D":case"RI":case"FL":case"CA":case"ca":h.push([n,i]);break;case"Font":c=!1;u=u.then(()=>this.handleSetFont(e,null,i[0],a,s,r.state).then(function(e){a.addDependency(e);h.push([n,[e,i[1]]])}));break;case"BM":h.push([n,normalizeBlendMode(i)]);break;case"SMask":if(isName(i,"None")){h.push([n,!1]);break}if(i instanceof Dict){c=!1;u=u.then(()=>this.handleSMask(i,e,a,s,r,o,l));h.push([n,!0])}else warn("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(i);h.push([n,t]);break;case"OP":case"op":case"OPM":case"BG":case"BG2":case"UCR":case"UCR2":case"TR2":case"HT":case"SM":case"SA":case"AIS":case"TK":info("graphic state operator "+n);break;default:info("Unknown graphic state operator "+n)}await u;h.length>0&&a.addOp(je,[h]);c&&i.set(n,f,h)}loadFont(e,t,a,n,s=null,r=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new ErrorFont(`Font "${e}" is not available.`),dict:t});let i;if(t)t instanceof Ref&&(i=t);else{const t=a.get("Font");t&&(i=t.getRaw(e))}if(i){if(this.type3FontRefs?.has(i))return errorFont();if(this.fontCache.has(i))return this.fontCache.get(i);try{t=this.xref.fetchIfRef(i)}catch(e){warn(`loadFont - lookup failed: "${e}".`)}}if(!(t instanceof Dict)){if(!this.options.ignoreErrors&&!this.parsingType3Font){warn(`Font "${e}" is not available.`);return errorFont()}warn(`Font "${e}" is not available -- attempting to fallback to a default font.`);t=s||PartialEvaluator.fallbackFontDict}if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const{promise:o,resolve:l}=Promise.withResolvers();let f;try{f=this.preEvaluateFont(t);f.cssFontInfo=r}catch(e){warn(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:c,hash:h}=f,u=i instanceof Ref;let m;if(h&&c instanceof Dict){const e=c.fontAliases||=Object.create(null);if(e[h]){const t=e[h].aliasRef;if(u&&t&&this.fontCache.has(t)){this.fontCache.putAlias(i,t);return this.fontCache.get(i)}}else e[h]={fontID:this.idFactory.createFontId()};u&&(e[h].aliasRef=i);m=e[h].fontID}else m=this.idFactory.createFontId();assert(m?.startsWith("f"),'The "fontID" must be (correctly) defined.');if(u)this.fontCache.put(i,o);else{t.cacheKey=`cacheKey_${m}`;this.fontCache.put(t.cacheKey,o)}t.loadedName=`${this.idFactory.getDocId()}_${m}`;this.translateFont(f).then(async e=>{const s=new TranslatedFont({loadedName:t.loadedName,font:e,dict:t});if(e.isType3Font)try{await s.loadType3Data(this,a,n)}catch(e){throw new Error(`Type3 font load error: ${e}`)}l(s)}).catch(e=>{warn(`loadFont - translateFont failed: "${e}".`);l(new TranslatedFont({loadedName:t.loadedName,font:new ErrorFont(e?.message),dict:t}))});return o}buildPath(e,t,a){const{pathMinMax:n,pathBuffer:s}=a;switch(0|e){case Fe:{const e=a.currentPointX=t[0],r=a.currentPointY=t[1],i=t[2],o=t[3],l=e+i,f=r+o;0===i||0===o?s.push(Vt,e,r,$t,l,f,Qt):s.push(Vt,e,r,$t,l,r,$t,l,f,$t,e,f,Qt);Util.rectBoundingBox(e,r,l,f,n);break}case ve:{const e=a.currentPointX=t[0],r=a.currentPointY=t[1];s.push(Vt,e,r);Util.pointBoundingBox(e,r,n);break}case Se:{const e=a.currentPointX=t[0],r=a.currentPointY=t[1];s.push($t,e,r);Util.pointBoundingBox(e,r,n);break}case Ae:{const e=a.currentPointX,r=a.currentPointY,[i,o,l,f,c,h]=t;a.currentPointX=c;a.currentPointY=h;s.push(Yt,i,o,l,f,c,h);Util.bezierBoundingBox(e,r,i,o,l,f,c,h,n);break}case xe:{const e=a.currentPointX,r=a.currentPointY,[i,o,l,f]=t;a.currentPointX=l;a.currentPointY=f;s.push(Yt,e,r,i,o,l,f);Util.bezierBoundingBox(e,r,e,r,i,o,l,f,n);break}case Ce:{const e=a.currentPointX,r=a.currentPointY,[i,o,l,f]=t;a.currentPointX=l;a.currentPointY=f;s.push(Yt,i,o,l,f,l,f);Util.bezierBoundingBox(e,r,i,o,l,f,l,f,n);break}case Ie:s.push(Qt)}}_getColorSpace(e,t,a){return ColorSpaceUtils.parse({cs:e,xref:this.xref,resources:t,pdfFunctionFactory:this._pdfFunctionFactory,globalColorSpaceCache:this.globalColorSpaceCache,localColorSpaceCache:a,asyncIfNotCached:!0})}async _handleColorSpace(e){try{return await e}catch(e){if(e instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`_handleColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}}parseShading({shading:e,resources:t,localColorSpaceCache:a,localShadingPatternCache:n}){let s,r=n.get(e);if(r)return r;try{s=Pattern.parseShading(e,this.xref,t,this._pdfFunctionFactory,this.globalColorSpaceCache,a).getIR()}catch(t){if(t instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`parseShading - ignoring shading: "${t}".`);n.set(e,null);return null}throw t}r=`pattern_${this.idFactory.createObjId()}`;this.parsingType3Font&&(r=`${this.idFactory.getDocId()}_type3_${r}`);n.set(e,r);if(this.parsingType3Font){const e=function compilePatternInfo(e){let t,a=null,n=[],s=[],r=[],i=null,o=null;switch(e[0]){case"RadialAxial":t="axial"===e[1]?1:2;a=e[2];r=e[3];1===t?n.push(...e[4],...e[5]):n.push(e[4][0],e[4][1],e[6],e[5][0],e[5][1],e[7]);break;case"Mesh":t=3;i=e[1];n=e[2];s=e[3];a=e[6];o=e[7];break;default:throw new Error(`Unsupported pattern type: ${e[0]}`)}const l=Math.floor(n.length/2),f=Math.floor(s.length/4),c=r.length,h=new ArrayBuffer(20+8*l+4*f+8*c+(a?16:0)+(o?3:0)),u=new DataView(h),m=new Uint8Array(h);u.setUint8(PATTERN_INFO.KIND,t);u.setUint8(PATTERN_INFO.HAS_BBOX,a?1:0);u.setUint8(PATTERN_INFO.HAS_BACKGROUND,o?1:0);u.setUint8(PATTERN_INFO.SHADING_TYPE,i);u.setUint32(PATTERN_INFO.N_COORD,l,!0);u.setUint32(PATTERN_INFO.N_COLOR,f,!0);u.setUint32(PATTERN_INFO.N_STOP,c,!0);u.setUint32(PATTERN_INFO.N_FIGURES,0,!0);let p=20;new Float32Array(h,p,2*l).set(n);p+=8*l;m.set(s,p);p+=4*f;for(const[e,t]of r){u.setFloat32(p,e,!0);p+=4;u.setUint32(p,parseInt(t.slice(1),16),!0);p+=4}if(a)for(const e of a){u.setFloat32(p,e,!0);p+=4}o&&m.set(o,p);return h}(s);this.handler.send("commonobj",[r,"Pattern",e],[e])}else this.handler.send("obj",[r,this.pageIndex,"Pattern",s]);return r}handleColorN(e,t,a,n,s,r,i,o,l,f){const c=a.pop();if(c instanceof Name){const h=s.getRaw(c.name),u=h instanceof Ref&&l.getByRef(h);if(u)try{const s=n.base?n.base.getRgbHex(a,0):null,r=getTilingPatternIR(u.operatorListIR,u.dict,s,u.needsIsolation);e.addOp(t,r);return}catch{}const m=this.xref.fetchIfRef(h);if(m){const s=m instanceof BaseStream?m.dict:m,c=s.get("PatternType");if(c===Fi){const o=n.base?n.base.getRgbHex(a,0):null;return this.handleTilingType(t,o,r,m,s,e,i,l)}if(c===Ti){const a=s.get("Shading"),n=this.parseShading({shading:a,resources:r,localColorSpaceCache:o,localShadingPatternCache:f});if(n){const a=lookupMatrix(s.getArray("Matrix"),null);e.addOp(t,["Shading",n,a])}return}throw new FormatError(`Unknown PatternType: ${c}`)}}throw new FormatError(`Unknown PatternName: ${c}`)}_parseVisibilityExpression(e,t,a){if(++t>10){warn("Visibility expression is too deeply nested");return}const n=e.length,s=this.xref.fetchIfRef(e[0]);if(!(n<2)&&s instanceof Name){switch(s.name){case"And":case"Or":case"Not":a.push(s.name);break;default:warn(`Invalid operator ${s.name} in visibility expression`);return}for(let s=1;s0)return{type:"OCMD",expression:t}}const t=a.get("OCGs");if(Array.isArray(t)||t instanceof Dict){const e=[];if(Array.isArray(t))for(const a of t)e.push(a.toString());else e.push(t.objId);return{type:n,ids:e,policy:a.get("P")instanceof Name?a.get("P").name:null,expression:null}}if(t instanceof Ref)return{type:n,id:t.toString()}}return null}async getOperatorList({stream:e,task:a,resources:n,operatorList:s,initialState:r=null,fallbackFontDict:i=null,prevRefs:o=null}){if(e.isAsync){const t=await e.asyncGetBytes();t&&(e=new Stream(t,0,t.length,e.dict))}const l=e.dict?.objId,f=new RefSet(o);if(l){if(o?.has(l))throw new Error(`getOperatorList - ignoring circular reference: ${l}`);f.put(l)}n||=Dict.empty;r||=new EvalState;if(!s)throw new Error('getOperatorList: missing "operatorList" parameter');const c=this,h=this.xref,u=new LocalImageCache,m=new LocalColorSpaceCache,p=new LocalGStateCache,d=new LocalTilingPatternCache,g=new Map,b=n.get("XObject")||Dict.empty,w=n.get("Pattern")||Dict.empty,j=new StateManager(r),k=new EvaluatorPreprocessor(e,h,j),y=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=k.savedStatesDepth;e{j.state.fillColorSpace=e||ColorSpaceUtils.gray}));return}case it:{const t=c._getColorSpace(e[0],n,m);if(t instanceof ColorSpace){j.state.strokeColorSpace=t;continue}next(c._handleColorSpace(t).then(e=>{j.state.strokeColorSpace=e||ColorSpaceUtils.gray}));return}case ct:S=j.state.fillColorSpace;e=[S.getRgbHex(e,0)];r=dt;break;case lt:S=j.state.strokeColorSpace;e=[S.getRgbHex(e,0)];r=pt;break;case mt:j.state.fillColorSpace=ColorSpaceUtils.gray;e=[ColorSpaceUtils.gray.getRgbHex(e,0)];r=dt;break;case ut:j.state.strokeColorSpace=ColorSpaceUtils.gray;e=[ColorSpaceUtils.gray.getRgbHex(e,0)];r=pt;break;case bt:j.state.fillColorSpace=ColorSpaceUtils.cmyk;e=[ColorSpaceUtils.cmyk.getRgbHex(e,0)];r=dt;break;case gt:j.state.strokeColorSpace=ColorSpaceUtils.cmyk;e=[ColorSpaceUtils.cmyk.getRgbHex(e,0)];r=pt;break;case dt:j.state.fillColorSpace=ColorSpaceUtils.rgb;e=[ColorSpaceUtils.rgb.getRgbHex(e,0)];break;case pt:j.state.strokeColorSpace=ColorSpaceUtils.rgb;e=[ColorSpaceUtils.rgb.getRgbHex(e,0)];break;case ht:S=j.state.patternFillColorSpace;if(!S){if(isNumberArray(e,null)){e=[ColorSpaceUtils.gray.getRgbHex(e,0)];r=dt;break}e=[];r=Kt;break}if("Pattern"===S.name){next(c.handleColorN(s,ht,e,S,w,n,a,m,d,g));return}e=[S.getRgbHex(e,0)];r=dt;break;case ft:S=j.state.patternStrokeColorSpace;if(!S){if(isNumberArray(e,null)){e=[ColorSpaceUtils.gray.getRgbHex(e,0)];r=pt;break}e=[];r=Wt;break}if("Pattern"===S.name){next(c.handleColorN(s,ft,e,S,w,n,a,m,d,g));return}e=[S.getRgbHex(e,0)];r=pt;break;case wt:let F;try{const t=n.get("Shading");if(!t)throw new FormatError("No shading resource found");F=t.get(e[0].name);if(!F)throw new FormatError("No shading object found")}catch(e){if(e instanceof AbortException)continue;if(c.options.ignoreErrors){warn(`getOperatorList - ignoring Shading: "${e}".`);continue}throw e}const T=c.parseShading({shading:F,resources:n,localColorSpaceCache:m,localShadingPatternCache:g});if(!T)continue;e=[T];r=wt;break;case je:C=e[0]instanceof Name;x=e[0].name;if(C){const t=p.getByName(x);if(t){t.length>0&&s.addOp(je,[t]);e=null;continue}}next(new Promise(function(e,t){if(!C)throw new FormatError("GState must be referred to by name.");const r=n.get("ExtGState");if(!(r instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const i=r.get(x);if(!(i instanceof Dict))throw new FormatError("GState should be a dictionary.");c.setGState({resources:n,gState:i,operatorList:s,cacheKey:x,task:a,stateManager:j,localGStateCache:p,localColorSpaceCache:m,seenRefs:f}).then(e,t)}).catch(function(e){if(!(e instanceof AbortException)){if(!c.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring ExtGState: "${e}".`)}}));return;case ue:{const[t]=e;if("number"!=typeof t){warn(`Invalid setLineWidth: ${t}`);continue}e[0]=Math.abs(t);break}case ge:{const t=e[1];if("number"!=typeof t){warn(`Invalid setDash: ${t}`);continue}const a=e[0];if(!Array.isArray(a)){warn(`Invalid setDash: ${a}`);continue}a.some(e=>"number"!=typeof e)&&(e[0]=a.filter(e=>"number"==typeof e));break}case ve:case Se:case Ae:case xe:case Ce:case Ie:case Fe:c.buildPath(r,e,j.state);continue;case Te:case Oe:case Re:case He:case Be:case De:case Me:case Ne:case Pe:{const{state:{pathBuffer:e,pathMinMax:a}}=j;r!==Oe&&r!==Me&&r!==Ne||e.push(Qt);if(0===e.length)s.addOp(Xt,[r,[null],null]);else{s.addOp(Xt,[r,[new Float32Array(e)],a.slice()]);e.length=0;a.set(t,0)}continue}case Qe:s.addOp(r,[new Float32Array(e)]);continue;case vt:case St:case It:case Ft:continue;case xt:if(!(e[0]instanceof Name)){warn(`Expected name for beginMarkedContentProps arg0=${e[0]}`);s.addOp(xt,["OC",null]);continue}if("OC"===e[0].name){next(c.parseMarkedContentProps(e[1],n).then(e=>{s.addOp(xt,["OC",e])}).catch(e=>{if(!(e instanceof AbortException)){if(!c.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`);s.addOp(xt,["OC",null])}}));return}e=[e[0].name,e[1]instanceof Dict?e[1].get("MCID"):null];break;default:if(null!==e){for(q=0,v=e.length;q{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring errors during "${a.name}" task: "${e}".`);closePendingRestoreOPS()}})}async getTextContent({stream:e,task:t,resources:a,stateManager:s=null,includeMarkedContent:r=!1,sink:i,seenStyles:o=new Set,viewBox:l,lang:f=null,markedContentData:c=null,disableNormalization:h=!1,keepWhiteSpace:u=!1,prevRefs:m=null,intersector:p=null}){if(e.isAsync){const t=await e.asyncGetBytes();t&&(e=new Stream(t,0,t.length,e.dict))}const d=e.dict?.objId,g=new RefSet(m);if(d){if(m?.has(d))throw new Error(`getTextContent - ignoring circular reference: ${d}`);g.put(d)}a||=Dict.empty;s||=new StateManager(new TextState);r&&(c||={level:0});const b={items:[],styles:Object.create(null),lang:f},w={initialized:!1,str:[],totalWidth:0,totalHeight:0,width:0,height:0,vertical:!1,prevTransform:null,prevTextRise:0,textAdvanceScale:0,spaceInFlowMin:0,spaceInFlowMax:0,trackingSpaceMin:1/0,negativeSpaceMax:-1/0,notASpace:-1/0,transform:null,fontName:null,hasEOL:!1},j=[" "," "];let k=0;function saveLastChar(e){const t=(k+1)%2,a=" "!==j[k]&&" "===j[t];j[k]=e;k=t;return!u&&a}function shouldAddWhitepsace(){return!u&&" "!==j[k]&&" "===j[(k+1)%2]}function resetLastChars(){j[0]=j[1]=" ";k=0}const y=this,q=this.xref,v=[];let S=null;const x=new LocalImageCache,C=new LocalGStateCache,F=new EvaluatorPreprocessor(e,q,s);let T,O;function pushWhitespace({width:e=0,height:t=0,transform:a=w.prevTransform,fontName:n=w.fontName}){p?.addExtraChar(" ");b.items.push({str:" ",dir:"ltr",width:e,height:t,transform:a,fontName:n,hasEOL:!1})}function getCurrentTextTransform(){const e=T.font,t=[T.fontSize*T.textHScale,0,0,T.fontSize,0,T.textRise];if(e.isType3Font&&(T.fontSize<=1||e.isCharBBox)&&!isArrayEqual(T.fontMatrix,n)){const a=e.bbox[3]-e.bbox[1];a>0&&(t[3]*=a*T.fontMatrix[3])}return Util.transform(T.ctm,Util.transform(T.textMatrix,t))}function ensureTextContentItem(){if(w.initialized)return w;const{font:e,loadedName:t}=T;if(!o.has(t)){o.add(t);b.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical};if(y.options.fontExtraProperties&&e.systemFontInfo){const a=b.styles[t];a.fontSubstitution=e.systemFontInfo.css;a.fontSubstitutionLoadedName=e.systemFontInfo.loadedName}}w.fontName=t;const a=w.transform=getCurrentTextTransform();if(e.vertical){w.width=w.totalWidth=Math.hypot(a[0],a[1]);w.height=w.totalHeight=0;w.vertical=!0}else{w.width=w.totalWidth=0;w.height=w.totalHeight=Math.hypot(a[2],a[3]);w.vertical=!1}const n=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),s=Math.hypot(T.ctm[0],T.ctm[1]);w.textAdvanceScale=s*n;const{fontSize:r}=T;w.trackingSpaceMin=.102*r;w.notASpace=.03*r;w.negativeSpaceMax=-.2*r;w.spaceInFlowMin=.102*r;w.spaceInFlowMax=.6*r;w.hasEOL=!1;w.initialized=!0;return w}function updateAdvanceScale(){if(!w.initialized)return;const e=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),t=Math.hypot(T.ctm[0],T.ctm[1])*e;if(t!==w.textAdvanceScale){if(w.vertical){w.totalHeight+=w.height*w.textAdvanceScale;w.height=0}else{w.totalWidth+=w.width*w.textAdvanceScale;w.width=0}w.textAdvanceScale=t}}function runBidiTransform(e){let t=e.str.join("");h||(t=function normalizeUnicode(e){if(!sa){sa=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu;ra=new Map([["ſt","ſt"]])}return e.replaceAll(sa,(e,t,a)=>t?t.normalize("NFKC"):ra.get(a))}(t));const a=bidi(t,-1,e.vertical);return{str:a.str,dir:a.dir,width:Math.abs(e.totalWidth),height:Math.abs(e.totalHeight),transform:e.transform,fontName:e.fontName,hasEOL:e.hasEOL}}async function handleSetFont(e,s){const r=await y.loadFont(e,s,a,t);T.loadedName=r.loadedName;T.font=r.font;T.fontMatrix=r.font.fontMatrix||n}function applyInverseRotation(e,t,a){const n=Math.hypot(a[0],a[1]);return[(a[0]*e+a[1]*t)/n,(a[2]*e+a[3]*t)/n]}function compareWithLastPosition(e){const t=getCurrentTextTransform();let a=t[4],n=t[5];if(T.font?.vertical){if(al[2]||n+el[3])return!1}else if(a+el[2]||nl[3])return!1;if(!T.font||!w.prevTransform)return!0;let s=w.prevTransform[4],r=w.prevTransform[5];if(s===a&&r===n)return!0;let i=-1;t[0]&&0===t[1]&&0===t[2]?i=t[0]>0?0:180:t[1]&&0===t[0]&&0===t[3]&&(i=t[1]>0?90:270);switch(i){case 0:break;case 90:[a,n]=[n,a];[s,r]=[r,s];break;case 180:[a,n,s,r]=[-a,-n,-s,-r];break;case 270:[a,n]=[-n,-a];[s,r]=[-r,-s];break;default:[a,n]=applyInverseRotation(a,n,t);[s,r]=applyInverseRotation(s,r,w.prevTransform)}if(T.font.vertical){const e=(r-n)/w.textAdvanceScale,t=a-s,i=Math.sign(w.height||w.totalHeight);if(e.5*w.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(t)>w.width){appendEOL();return!0}e<=i*w.notASpace&&resetLastChars();if(e<=i*w.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({height:Math.abs(e)})}else w.height+=e;else if(!addFakeSpaces(e,w.prevTransform,i))if(0===w.str.length){resetLastChars();pushWhitespace({height:Math.abs(e)})}else w.height+=e;Math.abs(t)>.25*w.width&&flushTextContentItem();return!0}const o=(a-s)/w.textAdvanceScale,f=n-r,c=Math.sign(w.width||w.totalWidth);if(o.5*w.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}const h=T.textRise-w.prevTextRise,u=0===h?f:f-t[3]/T.fontSize*h;if(Math.abs(u)>w.height){appendEOL();return!0}o<=c*w.notASpace&&resetLastChars();if(o<=c*w.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({width:Math.abs(o)})}else w.width+=o;else if(!addFakeSpaces(o,w.prevTransform,c))if(0===w.str.length){resetLastChars();pushWhitespace({width:Math.abs(o)})}else w.width+=o;Math.abs(f)>.25*w.height&&flushTextContentItem();return!0}function buildTextContentItem({chars:e,extraSpacing:t}){if(O!==T&&(O.fontSize!==T.fontSize||O.fontName!==T.fontName&&(O.font.name!==T.font.name||O.font.vertical!==T.font.vertical))){flushTextContentItem();O=T.clone()}const a=T.font,n=a.vertical?-T.charSpacing:T.charSpacing;if(!e){const e=n+t;e&&(a.vertical?T.translateTextMatrix(0,-e):T.translateTextMatrix(e*T.textHScale,0));u&&compareWithLastPosition(0);return}const s=a.charsToGlyphs(e),r=T.fontMatrix[0]*T.fontSize;for(let e=0,i=s.length;e0){const e=v.join("");v.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case et:if(!s.state.font){y.ensureStateFont(s.state);continue}buildTextContentItem({chars:j[0],extraSpacing:0});break;case at:if(!s.state.font){y.ensureStateFont(s.state);continue}T.carriageReturn();buildTextContentItem({chars:j[0],extraSpacing:0});break;case nt:if(!s.state.font){y.ensureStateFont(s.state);continue}T.wordSpacing=j[0];T.charSpacing=j[1];T.carriageReturn();buildTextContentItem({chars:j[2],extraSpacing:0});break;case qt:flushTextContentItem();S??=a.get("XObject")||Dict.empty;w=j[0]instanceof Name;d=j[0].name;if(w&&x.getByName(d))break;next(new Promise(function(e,n){if(!w)throw new FormatError("XObject must be referred to by name.");let m=S.getRaw(d);if(m instanceof Ref){if(x.getByRef(m)){e();return}if(y.globalImageCache.getData(m,y.pageIndex)){e();return}m=q.fetch(m)}if(!(m instanceof BaseStream))throw new FormatError("XObject should be a stream");const{dict:p}=m,b=p.get("Subtype");if(!(b instanceof Name))throw new FormatError("XObject should have a Name subtype");if("Form"!==b.name){x.set(d,p.objId,!0);e();return}const j=s.state.clone(),k=new StateManager(j),v=lookupMatrix(p.getArray("Matrix"),null);v&&k.transform(v);const C=p.get("Resources");enqueueChunk();const F={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;i.enqueue(e,t)},get desiredSize(){return i.desiredSize??0},get ready(){return i.ready}};y.getTextContent({stream:m,task:t,resources:C instanceof Dict?C:a,stateManager:k,includeMarkedContent:r,sink:i&&F,seenStyles:o,viewBox:l,lang:f,markedContentData:c,disableNormalization:h,keepWhiteSpace:u,prevRefs:g}).then(function(){F.enqueueInvoked||x.set(d,p.objId,!0);e()},n)}).catch(function(e){if(!(e instanceof AbortException)){if(!y.options.ignoreErrors)throw e;warn(`getTextContent - ignoring XObject: "${e}".`)}}));return;case je:w=j[0]instanceof Name;d=j[0].name;if(w&&C.getByName(d))break;next(new Promise(function(e,t){if(!w)throw new FormatError("GState must be referred to by name.");const n=a.get("ExtGState");if(!(n instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const s=n.get(d);if(!(s instanceof Dict))throw new FormatError("GState should be a dictionary.");const r=s.get("Font");if(r){flushTextContentItem();T.fontName=null;T.fontSize=r[1];handleSetFont(null,r[0]).then(e,t)}else{C.set(d,s.objId,!0);e()}}).catch(function(e){if(!(e instanceof AbortException)){if(!y.options.ignoreErrors)throw e;warn(`getTextContent - ignoring ExtGState: "${e}".`)}}));return;case At:flushTextContentItem();if(r){c.level++;b.items.push({type:"beginMarkedContent",tag:j[0]instanceof Name?j[0].name:null})}break;case xt:flushTextContentItem();if(r){c.level++;let e=null;j[1]instanceof Dict&&(e=j[1].get("MCID"));b.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${y.idFactory.getPageObjId()}_mc${e}`:null,tag:j[0]instanceof Name?j[0].name:null})}break;case Ct:flushTextContentItem();if(r){if(0===c.level)break;c.level--;b.items.push({type:"endMarkedContent"})}}if(b.items.length>=(i?.desiredSize??1)){p=!0;break}}if(p)next(Oi);else{flushTextContentItem();enqueueChunk();e()}}).catch(e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getTextContent - ignoring errors during "${t.name}" task: "${e}".`);flushTextContentItem();enqueueChunk()}})}async extractDataStructures(e,t){const a=this.xref;let n;const s=this.readToUnicode(t.toUnicode);if(t.composite){const a=e.get("CIDSystemInfo");a instanceof Dict&&!t.cidSystemInfo&&(t.cidSystemInfo={registry:stringToPDFString(a.get("Registry")),ordering:stringToPDFString(a.get("Ordering")),supplement:a.get("Supplement")});try{const t=e.get("CIDToGIDMap");t instanceof BaseStream&&(n=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;warn(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const r=[];let i,o=null;if(e.has("Encoding")){i=e.get("Encoding");if(i instanceof Dict){o=i.get("BaseEncoding");o=o instanceof Name?o.name:null;if(i.has("Differences")){const e=i.get("Differences");let t=0;for(const n of e){const e=a.fetchIfRef(n);if("number"==typeof e)t=e;else{if(!(e instanceof Name))throw new FormatError(`Invalid entry in 'Differences' array: ${e}`);r[t++]=e.name}}}}else if(i instanceof Name)o=i.name;else{const e="Encoding is not a Name nor a Dict";if(!this.options.ignoreErrors)throw new FormatError(e);warn(e)}"MacRomanEncoding"!==o&&"MacExpertEncoding"!==o&&"WinAnsiEncoding"!==o&&(o=null)}const l=!t.file||t.isInternalFont,f=_n()[t.name];o&&l&&f&&(o=null);if("WinAnsiEncoding"===o&&l&&t.name?.charCodeAt(0)>=183){const e=t.name;if(["ËÎÌå","ºÚÌå","¿¬Ìå","·ÂËÎ","¿¬Ìå_GB2312","·ÂËÎ_GB2312","Á¥Êé","ÐÂËÎ","·ÂËÎÌå","С±êËÎ"].includes(e)){o=null;t.defaultEncoding="Adobe-GB1-UCS2";t.composite=!0;t.cidEncoding=Name.get("GBK-EUC-H");const e=await CMapFactory.create({encoding:t.cidEncoding,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null});t.cMap=e;t.vertical=t.cMap.vertical;t.cidSystemInfo={registry:"Adobe",ordering:"GB1",supplement:0}}}if(o)t.defaultEncoding=getEncoding(o);else{let e=!!(t.flags&qn);const a=!!(t.flags&vn);if("TrueType"===t.type&&e&&a&&0!==r.length){t.flags&=~qn;e=!1}i=fn;"TrueType"!==t.type||a||(i=cn);if(e||f){i=ln;l&&(/Symbol/i.test(t.name)?i=hn:/Dingbats/i.test(t.name)?i=un:/Wingdings/i.test(t.name)&&(i=cn))}t.defaultEncoding=i}t.differences=r;t.baseEncodingName=o;t.hasEncoding=!!o||r.length>0;t.dict=e;t.toUnicode=await s;const c=await this.buildToUnicode(t);t.toUnicode=c;n&&(t.cidToGidMap=this.readCidToGidMap(n,c));return t}_simpleFontToUnicode(e,t=!1){assert(!e.composite,"Must be a simple font.");const a=[],n=e.defaultEncoding.slice(),s=e.baseEncodingName,r=e.differences;for(const e in r){const t=r[e];".notdef"!==t&&(n[e]=t)}const i=mn();for(const r in n){let o=n[r];if(""===o)continue;let l=i[o];if(void 0!==l){a[r]=String.fromCharCode(l);continue}let f=0;switch(o[0]){case"G":3===o.length&&(f=parseInt(o.substring(1),16));break;case"g":5===o.length&&(f=parseInt(o.substring(1),16));break;case"C":case"c":if(o.length>=3&&o.length<=4){const a=o.substring(1);if(t){f=parseInt(a,16);break}f=+a;if(Number.isNaN(f)&&Number.isInteger(parseInt(a,16)))return this._simpleFontToUnicode(e,!0)}break;case"u":l=getUnicodeForGlyph(o,i);-1!==l&&(f=l);break;default:switch(o){case"f_h":case"f_t":case"T_h":a[r]=o.replaceAll("_","");continue}}if(f>0&&f<=1114111&&Number.isInteger(f)){if(s&&f===+r){const e=getEncoding(s);if(e&&(o=e[r])){a[r]=String.fromCharCode(i[o]);continue}}a[r]=String.fromCodePoint(f)}}return a}async buildToUnicode(e){e.hasIncludedToUnicodeMap=e.toUnicode?.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._simpleFontToUnicode(e));return e.toUnicode}if(!e.composite)return new ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof IdentityCMap)||"Adobe"===e.cidSystemInfo?.registry&&("GB1"===e.cidSystemInfo.ordering||"CNS1"===e.cidSystemInfo.ordering||"Japan1"===e.cidSystemInfo.ordering||"Korea1"===e.cidSystemInfo.ordering))){const{registry:t,ordering:a}=e.cidSystemInfo,n=Name.get(`${t}-${a}-UCS2`),s=await CMapFactory.create({encoding:n,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),r=[],i=[];e.cMap.forEach(function(e,t){if(t>65535)throw new FormatError("Max size of CID is 65,535");const a=s.lookup(t);if(a){i.length=0;for(let e=0,t=a.length;e>1;(0!==s||t.has(r))&&(a[r]=s)}return a}extractWidths(e,t,a){const n=this.xref;let s=[],r=0;const i=[];let o;if(a.composite){const t=e.get("DW");r="number"==typeof t?Math.ceil(t):1e3;const l=e.get("W");if(Array.isArray(l))for(let e=0,t=l.length;e{const t=l.get(e),n=new OperatorList;return r.getOperatorList({stream:t,task:a,resources:f,operatorList:n}).then(()=>{switch(n.fnArray[0]){case rt:this.#Ee(n,b);break;case st:b||this.#_e(n)}c[e]=n.getIR();for(const e of n.dependencies)s.add(e)}).catch(function(t){warn(`Type3 font resource "${e}" is not available.`);const a=new OperatorList;c[e]=a.getIR()})});this.#Pe=o.then(()=>{n.charProcOperatorList=c;if(this._bbox){n.isCharBBox=!0;n.bbox=this._bbox}});return this.#Pe}#Ee(e,a=NaN){const n=Util.normalizeRect(e.argsArray[0].slice(2)),s=n[2]-n[0],r=n[3]-n[1],i=Math.hypot(s,r);if(0===s||0===r){e.fnArray.splice(0,1);e.argsArray.splice(0,1)}else if(0===a||Math.round(i/a)>=10){this._bbox??=t.slice();Util.rectBoundingBox(...n,this._bbox)}let o=0,l=e.length;for(;o=ve&&r<=Pe;if(s.variableArgs)o>i&&info(`Command ${n}: expected [0, ${i}] args, but received ${o} args.`);else{if(o!==i){const e=this.nonProcessedArgs;for(;o>i;){e.push(t.shift());o--}for(;oEvaluatorPreprocessor.MAX_INVALID_PATH_OPS)throw new FormatError(`Invalid ${e}`);warn(`Skipping ${e}`);null!==t&&(t.length=0);continue}}this.preprocessCommand(r,t);e.fn=r;e.args=t;return!0}if(a===oa)return!1;if(null!==a){null===t&&(t=[]);t.push(a);if(t.length>33)throw new FormatError("Too many arguments")}}}preprocessCommand(e,t){switch(0|e){case ke:this.stateManager.save();break;case ye:this.stateManager.restore();break;case qe:this.stateManager.transform(t)}}}class DefaultAppearanceEvaluator extends EvaluatorPreprocessor{constructor(e){super(new StringStream(e))}parse(){const e={fn:0,args:[]},t={fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3)};try{for(;;){e.args.length=0;if(!this.read(e))break;if(0!==this.savedStatesDepth)continue;const{fn:a,args:n}=e;switch(0|a){case Ge:const[e,a]=n;e instanceof Name&&(t.fontName=e.name);"number"==typeof a&&a>0&&(t.fontSize=a);break;case dt:ColorSpaceUtils.rgb.getRgbItem(n,0,t.fontColor,0);break;case mt:ColorSpaceUtils.gray.getRgbItem(n,0,t.fontColor,0);break;case bt:ColorSpaceUtils.cmyk.getRgbItem(n,0,t.fontColor,0)}}}catch(e){warn(`parseDefaultAppearance - ignoring errors: "${e}".`)}return t}}function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()}class AppearanceStreamEvaluator extends EvaluatorPreprocessor{constructor(e,t,a){super(e);this.stream=e;this.xref=t;this.globalColorSpaceCache=a;this.resources=e.dict?.get("Resources")}parse(){const e={fn:0,args:[]};let t={scaleFactor:1,fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3),fillColorSpace:ColorSpaceUtils.gray},a=!1;const n=[];try{for(;;){e.args.length=0;if(a||!this.read(e))break;const{fn:s,args:r}=e;switch(0|s){case ke:n.push({scaleFactor:t.scaleFactor,fontSize:t.fontSize,fontName:t.fontName,fontColor:t.fontColor.slice(),fillColorSpace:t.fillColorSpace});break;case ye:t=n.pop()||t;break;case Qe:t.scaleFactor*=Math.hypot(r[0],r[1]);break;case Ge:const[e,s]=r;e instanceof Name&&(t.fontName=e.name);"number"==typeof s&&s>0&&(t.fontSize=s*t.scaleFactor);break;case ot:t.fillColorSpace=ColorSpaceUtils.parse({cs:r[0],xref:this.xref,resources:this.resources,pdfFunctionFactory:this._pdfFunctionFactory,globalColorSpaceCache:this.globalColorSpaceCache,localColorSpaceCache:this._localColorSpaceCache});break;case ct:t.fillColorSpace.getRgbItem(r,0,t.fontColor,0);break;case dt:ColorSpaceUtils.rgb.getRgbItem(r,0,t.fontColor,0);break;case mt:ColorSpaceUtils.gray.getRgbItem(r,0,t.fontColor,0);break;case bt:ColorSpaceUtils.cmyk.getRgbItem(r,0,t.fontColor,0);break;case et:case tt:case at:case nt:a=!0}}}catch(e){warn(`parseAppearanceStream - ignoring errors: "${e}".`)}this.stream.reset();delete t.scaleFactor;delete t.fillColorSpace;return t}get _localColorSpaceCache(){return shadow(this,"_localColorSpaceCache",new LocalColorSpaceCache)}get _pdfFunctionFactory(){return shadow(this,"_pdfFunctionFactory",new PDFFunctionFactory({xref:this.xref}))}}function getPdfColor(e,t){if(e[0]===e[1]&&e[1]===e[2]){return`${numberToString(e[0]/255)} ${t?"g":"G"}`}return Array.from(e,e=>numberToString(e/255)).join(" ")+" "+(t?"rg":"RG")}class FakeUnicodeFont{static#ze=1;constructor(e,t){this.xref=e;this.widths=null;this.firstChar=1/0;this.lastChar=-1/0;this.fontFamily=t;const a=new OffscreenCanvas(1,1);this.ctxMeasure=a.getContext("2d",{willReadFrequently:!0});this.fontName=Name.get(`InvalidPDFjsFont_${t}_${FakeUnicodeFont.#ze++}`)}get fontDescriptorRef(){if(!FakeUnicodeFont._fontDescriptorRef){const e=new Dict(this.xref);e.setIfName("Type","FontDescriptor");e.set("FontName",this.fontName);e.set("FontFamily","MyriadPro Regular");e.set("FontBBox",[0,0,0,0]);e.setIfName("FontStretch","Normal");e.set("FontWeight",400);e.set("ItalicAngle",0);FakeUnicodeFont._fontDescriptorRef=this.xref.getNewPersistentRef(e)}return FakeUnicodeFont._fontDescriptorRef}get descendantFontRef(){const e=new Dict(this.xref);e.set("BaseFont",this.fontName);e.setIfName("Type","Font");e.setIfName("Subtype","CIDFontType0");e.setIfName("CIDToGIDMap","Identity");e.set("FirstChar",this.firstChar);e.set("LastChar",this.lastChar);e.set("FontDescriptor",this.fontDescriptorRef);e.set("DW",1e3);const t=[],a=[...this.widths].sort();let n=null,s=null;for(const[e,r]of a)if(n)if(e===n+s.length)s.push(r);else{t.push(n,s);n=e;s=[r]}else{n=e;s=[r]}n&&t.push(n,s);e.set("W",t);const r=new Dict(this.xref);r.set("Ordering","Identity");r.set("Registry","Adobe");r.set("Supplement",0);e.set("CIDSystemInfo",r);return this.xref.getNewPersistentRef(e)}get baseFontRef(){const e=new Dict(this.xref);e.set("BaseFont",this.fontName);e.setIfName("Type","Font");e.setIfName("Subtype","Type0");e.setIfName("Encoding","Identity-H");e.set("DescendantFonts",[this.descendantFontRef]);e.setIfName("ToUnicode","Identity-H");return this.xref.getNewPersistentRef(e)}get resources(){const e=new Dict(this.xref),t=new Dict(this.xref);t.set(this.fontName.name,this.baseFontRef);e.set("Font",t);return e}_createContext(){this.widths=new Map;this.ctxMeasure.font=`1000px ${this.fontFamily}`;return this.ctxMeasure}createFontResources(e){const t=this._createContext();for(const a of e.split(/\r\n?|\n/))for(const e of a.split("")){const a=e.charCodeAt(0);if(this.widths.has(a))continue;const n=t.measureText(e),s=Math.ceil(n.width);this.widths.set(a,s);this.firstChar=Math.min(a,this.firstChar);this.lastChar=Math.max(a,this.lastChar)}return this.resources}static getFirstPositionInfo(e,t,a){const[n,i,o,l]=e;let f=o-n,c=l-i;t%180!=0&&([f,c]=[c,f]);const h=s*a;return{coords:[0,c+r*a-h],bbox:[0,0,f,c],matrix:0!==t?getRotationMatrix(t,c,h):void 0}}createAppearance(e,t,a,n,i,o){const l=this._createContext(),f=[];let c=-1/0;for(const t of e.split(/\r\n?|\n/)){f.push(t);const e=l.measureText(t).width;c=Math.max(c,e);for(const e of codePointIter(t)){const t=String.fromCodePoint(e);let a=this.widths.get(e);if(void 0===a){const n=l.measureText(t);a=Math.ceil(n.width);this.widths.set(e,a);this.firstChar=Math.min(e,this.firstChar);this.lastChar=Math.max(e,this.lastChar)}}}c*=n/1e3;const[h,u,m,p]=t;let d=m-h,g=p-u;a%180!=0&&([d,g]=[g,d]);let b=1;c>d&&(b=d/c);let w=1;const j=s*n,k=r*n,y=j*f.length;y>g&&(w=g/y);const q=n*Math.min(b,w),v=["q",`0 0 ${numberToString(d)} ${numberToString(g)} re W n`,"BT",`1 0 0 1 0 ${numberToString(g+k)} Tm 0 Tc ${getPdfColor(i,!0)}`,`/${this.fontName.name} ${numberToString(q)} Tf`],{resources:S}=this;if(1!==(o="number"==typeof o&&o>=0&&o<=1?o:1)){v.push("/R0 gs");const e=new Dict(this.xref),t=new Dict(this.xref);t.set("ca",o);t.set("CA",o);t.setIfName("Type","ExtGState");e.set("R0",t);S.set("ExtGState",e)}const x=numberToString(j);for(const e of f)v.push(`0 -${x} Td <${stringToUTF16HexString(e)}> Tj`);v.push("ET","Q");const C=v.join("\n"),F=new Dict(this.xref);F.setIfName("Subtype","Form");F.setIfName("Type","XObject");F.set("BBox",[0,0,d,g]);F.set("Length",C.length);F.set("Resources",S);if(a){const e=getRotationMatrix(a,d,g);F.set("Matrix",e)}const T=new StringStream(C);T.dict=F;return T}}const Ri=["m/d","m/d/yy","mm/dd/yy","mm/yy","d-mmm","d-mmm-yy","dd-mmm-yy","yy-mm-dd","mmm-yy","mmmm-yy","mmm d, yyyy","mmmm d, yyyy","m/d/yy h:MM tt","m/d/yy HH:MM"],Hi=["HH:MM","h:MM tt","HH:MM:ss","h:MM:ss tt"];class NameOrNumberTree{constructor(e,t,a){this.root=e;this.xref=t;this._type=a}getAll(e=!1){const t=new Map;if(!this.root)return t;const a=this.xref,n=new RefSet;this.root instanceof Ref&&n.put(this.root);const s=[this.root];for(;s.length>0;){const r=a.fetchIfRef(s.shift());if(!(r instanceof Dict))continue;if(r.has("Kids")){const e=r.get("Kids");if(!Array.isArray(e))continue;for(const t of e){if(t instanceof Ref){if(n.has(t))throw new FormatError(`Duplicate entry in "${this._type}" tree.`);n.put(t)}s.push(t)}continue}const i=r.get(this._type);if(Array.isArray(i))for(let n=0,s=i.length;n10){warn(`Search depth limit reached for "${this._type}" tree.`);return null}const s=a.get("Kids");if(!Array.isArray(s))return null;let r=0,i=s.length-1;for(;r<=i;){const n=r+i>>1,o=t.fetchIfRef(s[n]),l=o.get("Limits");if(et.fetchIfRef(l[1]))){a=o;break}r=n+1}}if(r>i)return null}const s=a.get(this._type);if(Array.isArray(s)){let a=0,n=s.length-2;for(;a<=n;){const r=a+n>>1,i=r+(1&r),o=t.fetchIfRef(s[i]);if(eo))return s[i+1];a=i+2}}}return null}get(e){return this.xref.fetchIfRef(this.getRaw(e))}}class NameTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Names")}}class NumberTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Nums")}}function clearGlobalCaches(){!function clearPatternCaches(){Va=Object.create(null)}();!function clearPrimitiveCaches(){la=Object.create(null);fa=Object.create(null);ca=Object.create(null)}();!function clearUnicodeCaches(){wn.clear()}();JBig2CCITTFaxImage.cleanup();JpxImage.cleanup()}function pickPlatformItem(e){if(e instanceof Dict)for(const t of["UF","F","Unix","Mac","DOS"])if(e.has(t))return e.get(t);return null}class FileSpec{#Le=!1;constructor(e,t=!1){if(e instanceof Dict){this.root=e;e.has("FS")&&(this.fs=e.get("FS"));e.has("RF")&&warn("Related file specifications are not supported");t||(e.has("EF")?this.#Le=!0:warn("Non-embedded file specifications are not supported"))}}get filename(){const e=pickPlatformItem(this.root);return e&&"string"==typeof e?stringToPDFString(e,!0).replaceAll("\\\\","\\").replaceAll("\\/","/").replaceAll("\\","/"):""}get content(){if(!this.#Le)return null;const e=pickPlatformItem(this.root?.get("EF"));if(e instanceof BaseStream)return e.getBytes();warn("Embedded file specification points to non-existing/invalid content");return null}get description(){const e=this.root?.get("Desc");return e&&"string"==typeof e?stringToPDFString(e):""}get serializable(){const{filename:e,content:t,description:a}=this;return{rawFilename:e,filename:(n=e,n.substring(n.lastIndexOf("/")+1))||"unnamed",content:t,description:a};var n}}const Bi=0,Di=-2,Mi=-3,Ni=-4,Pi=-5,Ei=-6,_i=-9;function isWhitespace(e,t){const a=e[t];return" "===a||"\n"===a||"\r"===a||"\t"===a}class XMLParserBase{_resolveEntities(e){return e.replaceAll(/&([^;]+);/g,(e,t)=>{if("#x"===t.substring(0,2))return String.fromCodePoint(parseInt(t.substring(2),16));if("#"===t.substring(0,1))return String.fromCodePoint(parseInt(t.substring(1),10));switch(t){case"lt":return"<";case"gt":return">";case"amp":return"&";case"quot":return'"';case"apos":return"'"}return this.onResolveEntity(t)})}_parseContent(e,t){const a=[];let n=t;function skipWs(){for(;n"!==e[n]&&"/"!==e[n];)++n;const s=e.substring(t,n);skipWs();for(;n"!==e[n]&&"/"!==e[n]&&"?"!==e[n];){skipWs();let t="",s="";for(;n"!==e[a]&&"?"!==e[a]&&"/"!==e[a];)++a;const n=e.substring(t,a);!function skipWs(){for(;a"!==e[a+1]);)++a;return{name:n,value:e.substring(s,a),parsed:a-t}}parseXml(e){let t=0;for(;t",a);if(t<0){this.onError(_i);return}this.onEndElement(e.substring(a,t));a=t+1;break;case"?":++a;const n=this._parseProcessingInstruction(e,a);if("?>"!==e.substring(a+n.parsed,a+n.parsed+2)){this.onError(Mi);return}this.onPi(n.name,n.value);a+=n.parsed+2;break;case"!":if("--"===e.substring(a+1,a+3)){t=e.indexOf("--\x3e",a+3);if(t<0){this.onError(Pi);return}this.onComment(e.substring(a+3,t));a=t+3}else if("[CDATA["===e.substring(a+1,a+8)){t=e.indexOf("]]>",a+8);if(t<0){this.onError(Di);return}this.onCdata(e.substring(a+8,t));a=t+3}else{if("DOCTYPE"!==e.substring(a+1,a+8)){this.onError(Ei);return}{const n=e.indexOf("[",a+8);let s=!1;t=e.indexOf(">",a+8);if(t<0){this.onError(Ni);return}if(n>0&&t>n){t=e.indexOf("]>",a+8);if(t<0){this.onError(Ni);return}s=!0}const r=e.substring(a+8,t+(s?1:0));this.onDoctype(r);a=t+(s?2:1)}}break;default:const s=this._parseContent(e,a);if(null===s){this.onError(Ei);return}let r=!1;if("/>"===e.substring(a+s.parsed,a+s.parsed+2))r=!0;else if(">"!==e.substring(a+s.parsed,a+s.parsed+1)){this.onError(_i);return}this.onBeginElement(s.name,s.attributes,r);a+=s.parsed+(r?2:1)}}else{for(;ae.textContent).join(""):this.nodeValue||""}get children(){return this.childNodes||[]}hasChildNodes(){return this.childNodes?.length>0}searchNode(e,t){if(t>=e.length)return this;const a=e[t];if(a.name.startsWith("#")&&t0){n.push([s,0]);s=s.childNodes[0]}else{if(0===n.length)return null;for(;0!==n.length;){const[e,t]=n.pop(),a=t+1;if(a");for(const t of this.childNodes)t.dump(e);e.push(``)}else this.nodeValue?e.push(`>${encodeToXmlString(this.nodeValue)}`):e.push("/>")}else e.push(encodeToXmlString(this.nodeValue))}}class SimpleXMLParser extends XMLParserBase{constructor({hasAttributes:e=!1,lowerCaseName:t=!1}){super();this._currentFragment=null;this._stack=null;this._errorCode=Bi;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=Bi;this.parseXml(e);if(this._errorCode!==Bi)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onText(e){if(function isWhitespaceString(e){for(let t=0,a=e.length;t\\376\\377([^<]+)/g,function(e,t){const a=t.replaceAll(/\\([0-3])([0-7])([0-7])/g,function(e,t,a,n){return String.fromCharCode(64*t+8*a+1*n)}).replaceAll(/&(amp|apos|gt|lt|quot);/g,function(e,t){switch(t){case"amp":return"&";case"apos":return"'";case"gt":return">";case"lt":return"<";case"quot":return'"'}throw new Error(`_repair: ${t} isn't defined.`)}),n=[">"];for(let e=0,t=a.length;e=32&&t<127&&60!==t&&62!==t&&38!==t?n.push(String.fromCharCode(t)):n.push("&#x"+(65536+t).toString(16).substring(1)+";")}return n.join("")})}_getSequence(e){const t=e.nodeName;return"rdf:bag"!==t&&"rdf:seq"!==t&&"rdf:alt"!==t?null:e.childNodes.filter(e=>"rdf:li"===e.nodeName)}_parseArray(e){if(!e.hasChildNodes())return;const[t]=e.childNodes,a=this._getSequence(t)||[];this._metadataMap.set(e.nodeName,a.map(e=>e.textContent.trim()))}_parse(e){let t=e.documentElement;if("rdf:rdf"!==t.nodeName){t=t.firstChild;for(;t&&"rdf:rdf"!==t.nodeName;)t=t.nextSibling}if(t&&"rdf:rdf"===t.nodeName&&t.hasChildNodes())for(const e of t.childNodes)if("rdf:description"===e.nodeName)for(const t of e.childNodes){const e=t.nodeName;switch(e){case"#text":continue;case"dc:creator":case"dc:subject":this._parseArray(t);continue}this._metadataMap.set(e,t.textContent.trim())}}get serializable(){return{parsedData:this._metadataMap,rawData:this._data}}}const zi=1,Xi=2,Wi=3,Ki=4,Gi=5;class StructTreeRoot{constructor(e,t,a){this.xref=e;this.dict=t;this.ref=a instanceof Ref?a:null;this.roleMap=new Map;this.structParentIds=null;this.kidRefToPosition=void 0;this.parentTree=null}getKidPosition(e){if(void 0===this.kidRefToPosition){const e=this.dict.get("K");if(Array.isArray(e)){const t=this.kidRefToPosition=new Map;for(let a=0,n=e.length;a=0||(e.parentTreeId=a++);i=!1}}if(i){for(const e of t.values())for(const t of e){delete t.parentTreeId;delete t.structTreeParent}return!1}return!0}async updateStructureTree({newAnnotationsByPage:e,pdfManager:t,changes:a}){const{ref:n,xref:s}=this,r=this.dict.clone(),i=new RefSetCache;i.put(n,r);let o,l=r.getRaw("ParentTree");if(l instanceof Ref)o=s.fetch(l);else{o=l;l=s.getNewTemporaryRef();r.set("ParentTree",l)}o=o.clone();i.put(l,o);let f=o.getRaw("Nums"),c=null;if(f instanceof Ref){c=f;f=s.fetch(c)}f=f.slice();c||o.set("Nums",f);const h=await StructTreeRoot.#Xe({newAnnotationsByPage:e,structTreeRootRef:n,structTreeRoot:this,kids:null,nums:f,xref:s,pdfManager:t,changes:a,cache:i});if(-1!==h){r.set("ParentTreeNextKey",h);c&&i.put(c,f);for(const[e,t]of i.items())a.put(e,{data:t})}}static async#Xe({newAnnotationsByPage:e,structTreeRootRef:t,structTreeRoot:a,kids:n,nums:s,xref:r,pdfManager:i,changes:o,cache:l}){const f=Name.get("OBJR");let c,h=-1;for(const[u,m]of e){const e=await i.getPage(u),{ref:p}=e,d=p instanceof Ref;for(const{accessibilityData:i,ref:g,parentTreeId:b,structTreeParent:w}of m){if(!i?.type)continue;const{structParent:m}=i;if(a&&Number.isInteger(m)&&m>=0){let t=(c||=new Map).get(u);if(void 0===t){t=new StructTreePage(a,e.pageDict).collectObjects(p);c.set(u,t)}const n=t?.get(m);if(n){const e=r.fetch(n).clone();StructTreeRoot.#Ke(e,i);o.put(n,{data:e});continue}}h=Math.max(h,b);const j=r.getNewTemporaryRef(),k=new Dict(r);StructTreeRoot.#Ke(k,i);await this.#Ge({structTreeParent:w,tagDict:k,newTagRef:j,structTreeRootRef:t,fallbackKids:n,xref:r,cache:l});const y=new Dict(r);k.set("K",y);y.set("Type",f);d&&y.set("Pg",p);y.set("Obj",g);l.put(j,k);s.push(b,j)}}return h+1}static#Ke(e,{type:t,title:a,lang:n,alt:s,expanded:r,actualText:i}){e.set("S",Name.get(t));a&&e.set("T",stringToAsciiOrUTF16BE(a));n&&e.set("Lang",stringToAsciiOrUTF16BE(n));s&&e.set("Alt",stringToAsciiOrUTF16BE(s));r&&e.set("E",stringToAsciiOrUTF16BE(r));i&&e.set("ActualText",stringToAsciiOrUTF16BE(i))}static#We({elements:e,xref:t,pageDict:a,numberTree:n}){const s=new Map;for(const t of e)if(t.structTreeParentId){const e=parseInt(t.structTreeParentId.split("_mc")[1],10);s.getOrInsertComputed(e,makeArr).push(t)}const r=a.get("StructParents");if(!Number.isInteger(r))return;const i=n.get(r),updateElement=(e,a,n)=>{const r=s.get(e);if(r){const e=a.getRaw("P"),s=t.fetchIfRef(e);if(e instanceof Ref&&s instanceof Dict){const e={ref:n,dict:a};for(const t of r)t.structTreeParent=e}return!0}return!1};for(const e of i){if(!(e instanceof Ref))continue;const a=t.fetch(e),n=a.get("K");if(Number.isInteger(n))updateElement(n,a,e);else if(Array.isArray(n))for(let s of n){s=t.fetchIfRef(s);if(Number.isInteger(s)&&updateElement(s,a,e))break;if(!(s instanceof Dict))continue;if(!isName(s.get("Type"),"MCR"))break;const n=s.get("MCID");if(Number.isInteger(n)&&updateElement(n,a,e))break}}}static async#Ge({structTreeParent:e,tagDict:t,newTagRef:a,structTreeRootRef:n,fallbackKids:s,xref:r,cache:i}){let o,l=null;if(e){({ref:l}=e);o=e.dict.getRaw("P")||n}else o=n;t.set("P",o);const f=r.fetchIfRef(o);if(!f){s.push(a);return}let c=i.get(o);if(!c){c=f.clone();i.put(o,c)}const h=c.getRaw("K");let u=h instanceof Ref?i.get(h):null;if(!u){u=r.fetchIfRef(h);u=Array.isArray(u)?u.slice():[h];const e=r.getNewTemporaryRef();c.set("K",e);i.put(e,u)}const m=u.indexOf(l);u.splice(m>=0?m+1:u.length,0,a)}}class StructElementNode{constructor(e,t){this.tree=e;this.xref=e.xref;this.dict=t;this.kids=[];this.parseKids()}get role(){const e=this.dict.get("S"),t=e instanceof Name?e.name:"",{root:a}=this.tree;return a.roleMap.get(t)??t}get mathML(){let e=this.dict.get("AF")||[];Array.isArray(e)||(e=[e]);for(let t of e){t=this.xref.fetchIfRef(t);if(!(t instanceof Dict))continue;if(!isName(t.get("Type"),"Filespec"))continue;if(!isName(t.get("AFRelationship"),"Supplement"))continue;const e=t.get("EF");if(!(e instanceof Dict))continue;const a=e.get("UF")||e.get("F");if(a instanceof BaseStream&&(isName(a.dict.get("Type"),"EmbeddedFile")&&isName(a.dict.get("Subtype"),"application/mathml+xml")))return stringToUTF8String(a.getString())}const t=this.dict.get("A");if(t instanceof Dict){if(isName(t.get("O"),"MSFT_Office")){const e=t.get("MSFT_MathML");return e?stringToPDFString(e):null}}return null}parseKids(){let e=null;const t=this.dict.getRaw("Pg");t instanceof Ref&&(e=t.toString());const a=this.dict.get("K");if(Array.isArray(a))for(const t of a){const a=this.parseKid(e,this.xref.fetchIfRef(t));a&&this.kids.push(a)}else{const t=this.parseKid(e,a);t&&this.kids.push(t)}}parseKid(e,t){if(Number.isInteger(t))return this.tree.pageDict.objId!==e?null:new StructElement({type:zi,mcid:t,pageObjId:e});if(!(t instanceof Dict))return null;const a=t.getRaw("Pg");a instanceof Ref&&(e=a.toString());const n=t.get("Type")instanceof Name?t.get("Type").name:null;if("MCR"===n){if(this.tree.pageDict.objId!==e)return null;const a=t.getRaw("Stm");return new StructElement({type:Xi,refObjId:a instanceof Ref?a.toString():null,pageObjId:e,mcid:t.get("MCID")})}if("OBJR"===n){if(this.tree.pageDict.objId!==e)return null;const a=t.getRaw("Obj");return new StructElement({type:Wi,refObjId:a instanceof Ref?a.toString():null,pageObjId:e})}return new StructElement({type:Gi,dict:t})}}class StructElement{constructor({type:e,dict:t=null,mcid:a=null,pageObjId:n=null,refObjId:s=null}){this.type=e;this.dict=t;this.mcid=a;this.pageObjId=n;this.refObjId=s;this.parentNode=null}}class StructTreePage{constructor(e,t){this.root=e;this.xref=e?.xref??null;this.rootDict=e?.dict??null;this.pageDict=t;this.nodes=[]}collectObjects(e){if(!(this.root&&this.rootDict&&e instanceof Ref))return null;const t=this.rootDict.get("ParentTree");if(!t)return null;const a=this.root.structParentIds?.get(e);if(!a)return null;const n=new Map,s=new NumberTree(t,this.xref);for(const[e]of a){const t=s.getRaw(e);t instanceof Ref&&n.set(e,t)}return n}parse(e){if(!(this.root&&this.rootDict&&e instanceof Ref))return;const{parentTree:t}=this.root;if(!t)return;const a=this.pageDict.get("StructParents"),n=this.root.structParentIds?.get(e);if(!Number.isInteger(a)&&!n)return;const s=new Map;if(Number.isInteger(a)){const e=t.get(a);if(Array.isArray(e))for(const t of e)t instanceof Ref&&this.addNode(this.xref.fetch(t),s)}if(n)for(const[e,a]of n){const n=t.get(e);if(n){const e=this.addNode(this.xref.fetchIfRef(n),s);1===e?.kids?.length&&e.kids[0].type===Wi&&(e.kids[0].type=a)}}}addNode(e,t,a=0){if(a>40){warn("StructTree MAX_DEPTH reached.");return null}if(!(e instanceof Dict))return null;if(t.has(e))return t.get(e);const n=new StructElementNode(this,e);t.set(e,n);switch(n.role){case"L":case"LBody":case"LI":case"Table":case"THead":case"TBody":case"TFoot":case"TR":for(const e of n.kids)e.type===Gi&&this.addNode(e.dict,t,a-1)}const s=e.get("P");if(!(s instanceof Dict)||isName(s.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,n)||t.delete(e);return n}const r=this.addNode(s,t,a+1);if(!r)return n;let i=!1;for(const t of r.kids)if(t.type===Gi&&t.dict===e){t.parentNode=n;i=!0}i||t.delete(e);return n}addTopLevelNode(e,t){const a=this.root.getKidPosition(e.objId);if(isNaN(a))return!1;-1!==a&&(this.nodes[a]=t);return!0}get serializable(){function nodeToSerializable(e,t,a=0){if(a>40){warn("StructTree too deep to be fully serialized.");return}const n=Object.create(null);n.role=e.role;n.children=[];t.children.push(n);let s=e.dict.get("Alt");"string"!=typeof s&&(s=e.dict.get("ActualText"));"string"==typeof s&&(n.alt=stringToPDFString(s));if("Formula"===n.role){const{mathML:t}=e;t&&(n.mathML=t)}const r=e.dict.get("A");if(r instanceof Dict){const e=lookupNormalRect(r.getArray("BBox"),null);if(e)n.bbox=e;else{const e=r.get("Width"),t=r.get("Height");"number"==typeof e&&e>0&&"number"==typeof t&&t>0&&(n.bbox=[0,0,e,t])}}const i=e.dict.get("Lang");"string"==typeof i&&(n.lang=stringToPDFString(i));for(const t of e.kids){const e=t.type===Gi?t.parentNode:null;e?nodeToSerializable(e,n,a+1):t.type===zi||t.type===Xi?n.children.push({type:"content",id:`p${t.pageObjId}_mc${t.mcid}`}):t.type===Wi?n.children.push({type:"object",id:t.refObjId}):t.type===Ki&&n.children.push({type:"annotation",id:`pdfjs_internal_id_${t.refObjId}`})}}const e=Object.create(null);e.children=[];e.role="Root";for(const t of this.nodes)t&&nodeToSerializable(t,e);return e}}const Vi=function _isValidExplicitDest(e,t,a){if(!Array.isArray(a)||a.length<2)return!1;const[n,s,...r]=a;if(!e(n)&&!Number.isInteger(n))return!1;if(!t(s))return!1;const i=r.length;let o=!0;switch(s.name){case"XYZ":if(i<2||i>3)return!1;break;case"Fit":case"FitB":return 0===i;case"FitH":case"FitBH":case"FitV":case"FitBV":if(i>1)return!1;break;case"FitR":if(4!==i)return!1;o=!1;break;default:return!1}for(const e of r)if(!("number"==typeof e||o&&null===e))return!1;return!0}.bind(null,e=>e instanceof Ref,isName);function fetchDest(e){e instanceof Dict&&(e=e.get("D"));return Vi(e)?e:null}function fetchRemoteDest(e){let t=e.get("D");if(t){t instanceof Name&&(t=t.name);if("string"==typeof t)return stringToPDFString(t,!0);if(Vi(t))return JSON.stringify(t)}return null}class Catalog{#Ve=null;#$e=null;builtInCMapCache=new Map;fontCache=new RefSetCache;globalColorSpaceCache=new GlobalColorSpaceCache;globalImageCache=new GlobalImageCache;nonBlendModesSet=new RefSet;pageDictCache=new RefSetCache;pageIndexCache=new RefSetCache;pageKidsCountCache=new RefSetCache;standardFontDataCache=new Map;systemFontCache=new Map;constructor(e,t){this.pdfManager=e;this.xref=t;this.#$e=t.getCatalogObj();if(!(this.#$e instanceof Dict))throw new FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict}cloneDict(){return this.#$e.clone()}get version(){const e=this.#$e.get("Version");if(e instanceof Name){if(ua.test(e.name))return shadow(this,"version",e.name);warn(`Invalid PDF catalog version: ${e.name}`)}return shadow(this,"version",null)}get lang(){const e=this.#$e.get("Lang");return shadow(this,"lang",e&&"string"==typeof e?stringToPDFString(e):null)}get needsRendering(){const e=this.#$e.get("NeedsRendering");return shadow(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this.#$e.get("Collection");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch Collection entry; assuming no collection is present.")}return shadow(this,"collection",e)}get acroForm(){let e=null;try{const t=this.#$e.get("AcroForm");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch AcroForm entry; assuming no forms are present.")}return shadow(this,"acroForm",e)}get acroFormRef(){const e=this.#$e.getRaw("AcroForm");return shadow(this,"acroFormRef",e instanceof Ref?e:null)}get metadata(){const e=this.#$e.getRaw("Metadata");if(!(e instanceof Ref))return shadow(this,"metadata",null);let t=null;try{const a=this.xref.fetch(e,!this.xref.encrypt?.encryptMetadata);if(a instanceof BaseStream&&a.dict instanceof Dict){const e=a.dict.get("Type"),n=a.dict.get("Subtype");if(isName(e,"Metadata")&&isName(n,"XML")){const e=stringToUTF8String(a.getString());e&&(t=new MetadataParser(e).serializable)}}}catch(e){if(e instanceof MissingDataException)throw e;info(`Skipping invalid Metadata: "${e}".`)}return shadow(this,"metadata",t)}get markInfo(){let e=null;try{e=this.#Ye()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read mark info.")}return shadow(this,"markInfo",e)}#Ye(){const e=this.#$e.get("MarkInfo");if(!(e instanceof Dict))return null;const t={Marked:!1,UserProperties:!1,Suspects:!1};for(const a in t){const n=e.get(a);"boolean"==typeof n&&(t[a]=n)}return t}get hasStructTree(){return this.#$e.has("StructTreeRoot")}get structTreeRoot(){let e=null;try{e=this.#Je()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable read to structTreeRoot info.")}return shadow(this,"structTreeRoot",e)}#Je(){const e=this.#$e.getRaw("StructTreeRoot"),t=this.xref.fetchIfRef(e);if(!(t instanceof Dict))return null;const a=new StructTreeRoot(this.xref,t,e);a.init();return a}get toplevelPagesDict(){const e=this.#$e.get("Pages");if(!(e instanceof Dict))throw new FormatError("Invalid top-level pages dictionary.");return shadow(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this.#Qe()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read document outline.")}return shadow(this,"documentOutline",e)}#Qe(e={}){let t=this.#$e.get("Outlines");if(!(t instanceof Dict))return null;t=t.getRaw("First");if(!(t instanceof Ref))return null;const a={items:[]},n=[{obj:t,parent:a}],s=new RefSet;s.put(t);const r=this.xref,i=new Uint8ClampedArray(3);for(;n.length>0;){const a=n.shift(),o=r.fetchIfRef(a.obj);if(null===o)continue;o.has("Title")||warn("Invalid outline item encountered.");const l={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:o,resultObj:l,docBaseUrl:this.baseUrl,docAttachments:this.attachments});const f=o.get("Title"),c=o.get("F")||0,h=o.getArray("C"),u=o.get("Count");let m=i;!isNumberArray(h,3)||0===h[0]&&0===h[1]&&0===h[2]||(m=ColorSpaceUtils.rgb.getRgb(h,0));const p={action:l.action,attachment:l.attachment,dest:l.dest,url:l.url,unsafeUrl:l.unsafeUrl,newWindow:l.newWindow,setOCGState:l.setOCGState,title:"string"==typeof f?stringToPDFString(f):"",color:m,count:Number.isInteger(u)?u:void 0,bold:!!(2&c),italic:!!(1&c),items:[]};e.keepRawDict&&(p.rawDict=o);a.parent.items.push(p);t=o.getRaw("First");if(t instanceof Ref&&!s.has(t)){n.push({obj:t,parent:p});s.put(t)}t=o.getRaw("Next");if(t instanceof Ref&&!s.has(t)){n.push({obj:t,parent:a.parent});s.put(t)}}return a.items.length>0?a.items:null}get documentOutlineForEditor(){let e=null;try{e=this.#Qe({keepRawDict:!0})}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read document outline.")}return shadow(this,"documentOutlineForEditor",e)}get permissions(){let e=null;try{e=this.#Ze()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read permissions.")}return shadow(this,"permissions",e)}#Ze(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const a=[];for(const e in y){const n=y[e];t&n&&a.push(n)}return a}get optionalContentConfig(){let e=null;try{const t=this.#$e.get("OCProperties");if(!t)return shadow(this,"optionalContentConfig",null);const a=t.get("D");if(!a)return shadow(this,"optionalContentConfig",null);const n=t.get("OCGs");if(!Array.isArray(n))return shadow(this,"optionalContentConfig",null);const s=new RefSetCache;for(const e of n)e instanceof Ref&&!s.has(e)&&s.put(e,this.#et(e));e=this.#tt(a,s)}catch(e){if(e instanceof MissingDataException)throw e;warn(`Unable to read optional content config: ${e}`)}return shadow(this,"optionalContentConfig",e)}#et(e){const t=this.xref.fetch(e),a={id:e.toString(),name:null,intent:null,usage:{print:null,view:null},rbGroups:[]},n=t.get("Name");"string"==typeof n&&(a.name=stringToPDFString(n));let s=t.getArray("Intent");Array.isArray(s)||(s=[s]);s.every(e=>e instanceof Name)&&(a.intent=s.map(e=>e.name));const r=t.get("Usage");if(!(r instanceof Dict))return a;const i=a.usage,o=r.get("Print");if(o instanceof Dict){const e=o.get("PrintState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":i.print={printState:e.name}}}const l=r.get("View");if(l instanceof Dict){const e=l.get("ViewState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":i.view={viewState:e.name}}}return a}#tt(e,t){function parseOnOff(e){const a=[];if(Array.isArray(e))for(const n of e)n instanceof Ref&&t.has(n)&&a.push(n.toString());return a}function parseOrder(e,a=0){if(!Array.isArray(e))return null;const s=[];for(const r of e){if(r instanceof Ref&&t.has(r)){n.put(r);s.push(r.toString());continue}const e=parseNestedOrder(r,a);e&&s.push(e)}if(a>0)return s;const r=[];for(const[e]of t.items())n.has(e)||r.push(e.toString());r.length&&s.push({name:null,order:r});return s}function parseNestedOrder(e,t){if(++t>s){warn("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const n=a.fetchIfRef(e);if(!Array.isArray(n))return null;const r=a.fetchIfRef(n[0]);if("string"!=typeof r)return null;const i=parseOrder(n.slice(1),t);return i?.length?{name:stringToPDFString(r),order:i}:null}const a=this.xref,n=new RefSet,s=10;!function parseRBGroups(e){if(Array.isArray(e))for(const n of e){const e=a.fetchIfRef(n);if(!Array.isArray(e)||!e.length)continue;const s=new Set;for(const a of e)if(a instanceof Ref&&t.has(a)&&!s.has(a.toString())){s.add(a.toString());t.get(a).rbGroups.push(s)}}}(e.get("RBGroups"));return{name:"string"==typeof e.get("Name")?stringToPDFString(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?stringToPDFString(e.get("Creator")):null,baseState:e.get("BaseState")instanceof Name?e.get("BaseState").name:null,on:parseOnOff(e.get("ON")),off:parseOnOff(e.get("OFF")),order:parseOrder(e.get("Order")),groups:[...t]}}setActualNumPages(e=null){this.#Ve=e}get hasActualNumPages(){return null!==this.#Ve}get _pagesCount(){const e=this.toplevelPagesDict.get("Count");if(!Number.isInteger(e))throw new FormatError("Page count in top-level pages dictionary is not an integer.");return shadow(this,"_pagesCount",e)}get numPages(){return this.#Ve??this._pagesCount}get destinations(){const e=this.#at(),t=Object.create(null);for(const a of e)if(a instanceof NameTree)for(const[e,n]of a.getAll()){const a=fetchDest(n);a&&(t[stringToPDFString(e,!0)]=a)}else if(a instanceof Dict)for(const[e,n]of a){const a=fetchDest(n);a&&(t[stringToPDFString(e,!0)]||=a)}return shadow(this,"destinations",t)}getDestination(e){if(Object.hasOwn(this,"destinations"))return this.destinations[e]??null;const t=this.#at();for(const a of t)if(a instanceof NameTree||a instanceof Dict){const t=fetchDest(a.get(e));if(t)return t}if(t.length){const t=this.destinations[e];if(t)return t}return null}#at(){const e=this.#$e.get("Names"),t=[];e?.has("Dests")&&t.push(new NameTree(e.getRaw("Dests"),this.xref));this.#$e.has("Dests")&&t.push(this.#$e.get("Dests"));return t}get rawPageLabels(){const e=this.#$e.getRaw("PageLabels");if(!e)return null;return new NumberTree(e,this.xref).getAll()}get pageLabels(){let e=null;try{e=this.#nt()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read page labels.")}return shadow(this,"pageLabels",e)}#nt(){const e=this.rawPageLabels;if(!e)return null;const t=new Array(this.numPages);let a=null,n="",s="",r=1;for(let i=0,o=this.numPages;i=1))throw new FormatError("Invalid start in PageLabel dictionary.");r=e}else r=1}switch(a){case"D":s=r;break;case"R":case"r":s=toRomanNumerals(r,"r"===a);break;case"A":case"a":const e=26,t="a"===a?97:65,n=r-1;s=String.fromCharCode(t+n%e).repeat(Math.floor(n/e)+1);break;default:if(a)throw new FormatError(`Invalid style "${a}" in PageLabel dictionary.`);s=""}t[i]=n+s;r++}return t}get pageLayout(){const e=this.#$e.get("PageLayout");let t="";if(e instanceof Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return shadow(this,"pageLayout",t)}get pageMode(){const e=this.#$e.get("PageMode");let t="UseNone";if(e instanceof Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return shadow(this,"pageMode",t)}get viewerPreferences(){const e=this.#$e.get("ViewerPreferences");if(!(e instanceof Dict))return shadow(this,"viewerPreferences",null);let t=null;for(const[a,n]of e){let e;switch(a){case"HideToolbar":case"HideMenubar":case"HideWindowUI":case"FitWindow":case"CenterWindow":case"DisplayDocTitle":case"PickTrayByPDFSize":"boolean"==typeof n&&(e=n);break;case"NonFullScreenPageMode":if(n instanceof Name)switch(n.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"UseOC":e=n.name;break;default:e="UseNone"}break;case"Direction":if(n instanceof Name)switch(n.name){case"L2R":case"R2L":e=n.name;break;default:e="L2R"}break;case"ViewArea":case"ViewClip":case"PrintArea":case"PrintClip":if(n instanceof Name)switch(n.name){case"MediaBox":case"CropBox":case"BleedBox":case"TrimBox":case"ArtBox":e=n.name;break;default:e="CropBox"}break;case"PrintScaling":if(n instanceof Name)switch(n.name){case"None":case"AppDefault":e=n.name;break;default:e="AppDefault"}break;case"Duplex":if(n instanceof Name)switch(n.name){case"Simplex":case"DuplexFlipShortEdge":case"DuplexFlipLongEdge":e=n.name;break;default:e="None"}break;case"PrintPageRange":if(Array.isArray(n)&&n.length%2==0){n.every((e,t,a)=>Number.isInteger(e)&&e>0&&(0===t||e>=a[t-1])&&e<=this.numPages)&&(e=n)}break;case"NumCopies":Number.isInteger(n)&&n>0&&(e=n);break;default:warn(`Ignoring non-standard key in ViewerPreferences: ${a}.`);continue}if(void 0!==e){t??=Object.create(null);t[a]=e}else warn(`Bad value, for key "${a}", in ViewerPreferences: ${n}.`)}return shadow(this,"viewerPreferences",t)}get openAction(){const e=this.#$e.get("OpenAction"),t=Object.create(null);if(e instanceof Dict){const a=new Dict(this.xref);a.set("A",e);const n={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:a,resultObj:n});Array.isArray(n.dest)?t.dest=n.dest:n.action&&(t.action=n.action)}else Vi(e)&&(t.dest=e);return shadow(this,"openAction",objectSize(t)>0?t:null)}get attachments(){const e=this.#$e.get("Names");let t=null;if(e instanceof Dict&&e.has("EmbeddedFiles")){const a=new NameTree(e.getRaw("EmbeddedFiles"),this.xref);for(const[e,n]of a.getAll()){const a=new FileSpec(n);t??=Object.create(null);t[stringToPDFString(e,!0)]=a.serializable}}return shadow(this,"attachments",t)}get rawEmbeddedFiles(){const e=this.#$e.get("Names");if(!(e instanceof Dict&&e.has("EmbeddedFiles")))return null;return new NameTree(e.getRaw("EmbeddedFiles"),this.xref).getAll(!0)}get xfaImages(){const e=this.#$e.get("Names");let t=null;if(e instanceof Dict&&e.has("XFAImages")){const a=new NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,n]of a.getAll())if(n instanceof BaseStream){t??=new Map;t.set(stringToPDFString(e,!0),n.getBytes())}}return shadow(this,"xfaImages",t)}#st(){const e=this.#$e.get("Names");let t=null;function appendIfJavaScriptDict(e,a){if(!(a instanceof Dict))return;if(!isName(a.get("S"),"JavaScript"))return;let n=a.get("JS");if(n instanceof BaseStream)n=n.getString();else if("string"!=typeof n)return;n=stringToPDFString(n,!0).replaceAll("\0","");n&&(t||=new Map).set(e,n)}if(e instanceof Dict&&e.has("JavaScript")){const t=new NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,a]of t.getAll())appendIfJavaScriptDict(stringToPDFString(e,!0),a)}const a=this.#$e.get("OpenAction");a&&appendIfJavaScriptDict("OpenAction",a);return t}get jsActions(){const e=this.#st();let t=collectActions(this.xref,this.#$e,oe);if(e){t||=Object.create(null);for(const[a,n]of e)a in t?t[a].push(n):t[a]=[n]}return shadow(this,"jsActions",t)}async cleanup(e=!1){clearGlobalCaches();this.globalColorSpaceCache.clear();this.globalImageCache.clear(e);this.pageKidsCountCache.clear();this.pageIndexCache.clear();this.pageDictCache.clear();this.nonBlendModesSet.clear();for(const{dict:e}of await Promise.all(this.fontCache))delete e.cacheKey;this.fontCache.clear();this.builtInCMapCache.clear();this.standardFontDataCache.clear();this.systemFontCache.clear()}async getPageDict(e){const t=[this.toplevelPagesDict],a=new RefSet,n=this.#$e.getRaw("Pages");n instanceof Ref&&a.put(n);const s=this.xref,r=this.pageKidsCountCache,i=this.pageIndexCache,o=this.pageDictCache;let l=0;for(;t.length;){const n=t.pop();if(n instanceof Ref){const f=r.get(n);if(f>=0&&l+f<=e){l+=f;continue}if(a.has(n))throw new FormatError("Pages tree contains circular reference.");a.put(n);const c=await(o.get(n)||s.fetchAsync(n));if(c instanceof Dict){let t=c.getRaw("Type");t instanceof Ref&&(t=await s.fetchAsync(t));if(isName(t,"Page")||!c.has("Kids")){r.has(n)||r.put(n,1);i.has(n)||i.put(n,l);if(l===e)return[c,n];l++;continue}}t.push(c);continue}if(!(n instanceof Dict))throw new FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:f}=n;let c=n.getRaw("Count");c instanceof Ref&&(c=await s.fetchAsync(c));if(Number.isInteger(c)&&c>=0){f&&!r.has(f)&&r.put(f,c);if(l+c<=e){l+=c;continue}}let h=n.getRaw("Kids");h instanceof Ref&&(h=await s.fetchAsync(h));if(!Array.isArray(h)){let t=n.getRaw("Type");t instanceof Ref&&(t=await s.fetchAsync(t));if(isName(t,"Page")||!n.has("Kids")){if(l===e)return[n,null];l++;continue}throw new FormatError("Page dictionary kids object is not an array.")}for(let e=h.length-1;e>=0;e--){const a=h[e];t.push(a);n===this.toplevelPagesDict&&a instanceof Ref&&!o.has(a)&&o.put(a,s.fetchAsync(a))}}throw new Error(`Page index ${e} not found.`)}async getAllPageDicts(e=!1){const{ignoreErrors:t}=this.pdfManager.evaluatorOptions,a=[{currentNode:this.toplevelPagesDict,posInKids:0}],n=new RefSet,s=this.#$e.getRaw("Pages");s instanceof Ref&&n.put(s);const r=new Map,i=this.xref,o=this.pageIndexCache;let l=0;function addPageDict(e,t){t&&!o.has(t)&&o.put(t,l);r.set(l++,[e,t])}function addPageError(a){if(a instanceof XRefEntryException&&!e)throw a;if(e&&t&&0===l){warn(`getAllPageDicts - Skipping invalid first page: "${a}".`);a=Dict.empty}r.set(l++,[a,null])}for(;a.length>0;){const e=a.at(-1),{currentNode:t,posInKids:s}=e;let r=t.getRaw("Kids");if(r instanceof Ref)try{r=await i.fetchAsync(r)}catch(e){addPageError(e);break}if(!Array.isArray(r)){addPageError(new FormatError("Page dictionary kids object is not an array."));break}if(s>=r.length){a.pop();continue}const o=r[s];let l;if(o instanceof Ref){if(n.has(o)){addPageError(new FormatError("Pages tree contains circular reference."));break}n.put(o);try{l=await i.fetchAsync(o)}catch(e){addPageError(e);break}}else l=o;if(!(l instanceof Dict)){addPageError(new FormatError("Page dictionary kid reference points to wrong type of object."));break}let f=l.getRaw("Type");if(f instanceof Ref)try{f=await i.fetchAsync(f)}catch(e){addPageError(e);break}isName(f,"Page")||!l.has("Kids")?addPageDict(l,o instanceof Ref?o:null):a.push({currentNode:l,posInKids:0});e.posInKids++}return r}getPageIndex(e){const t=this.pageIndexCache.get(e);if(void 0!==t)return Promise.resolve(t);const a=this.xref;let n=0;const next=t=>function pagesBeforeRef(t){let n,s=0;return a.fetchAsync(t).then(function(a){if(isRefsEqual(t,e)&&!isDict(a,"Page")&&!(a instanceof Dict&&!a.has("Type")&&a.has("Contents")))throw new FormatError("The reference does not point to a /Page dictionary.");if(!a)return null;if(!(a instanceof Dict))throw new FormatError("Node must be a dictionary.");n=a.getRaw("Parent");return a.getAsync("Parent")}).then(function(e){if(!e)return null;if(!(e instanceof Dict))throw new FormatError("Parent must be a dictionary.");return e.getAsync("Kids")}).then(function(e){if(!e)return null;const r=[];let i=!1;for(const n of e){if(!(n instanceof Ref))throw new FormatError("Kid must be a reference.");if(isRefsEqual(n,t)){i=!0;break}r.push(a.fetchAsync(n).then(function(e){if(!(e instanceof Dict))throw new FormatError("Kid node must be a dictionary.");e.has("Count")?s+=e.get("Count"):s++}))}if(!i)throw new FormatError("Kid reference not found in parent's kids.");return Promise.all(r).then(()=>[s,n])})}(t).then(t=>{if(!t){this.pageIndexCache.put(e,n);return n}const[a,s]=t;n+=a;return next(s)});return next(e)}get baseUrl(){const e=this.#$e.get("URI");if(e instanceof Dict){const t=e.get("Base");if("string"==typeof t){const e=createValidAbsoluteUrl(t,null,{tryConvertEncoding:!0});if(e)return shadow(this,"baseUrl",e.href)}}return shadow(this,"baseUrl",this.pdfManager.docBaseUrl)}static#rt(e,t){const a=e.fetchIfRef(t);if(!(a instanceof Dict))return null;let n=null;const s=a.getRaw("Pg");s instanceof Ref&&(n=s);if(!n){const t=[a];for(;t.length>0&&!n;){const a=t.shift().get("K");let s;if(Array.isArray(a))s=a;else{if(!a)continue;s=[a]}for(const a of s){const s=e.fetchIfRef(a);if(!(s instanceof Dict))continue;const r=s.getRaw("Pg");if(r instanceof Ref){n=r;break}t.push(s)}}}if(!n){const t=40;let s=a;for(let a=0;ae.startsWith("http://www.xfa.org/schema/xci/")},connectionSet:{id:1,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-connection-set/")},datasets:{id:2,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-data/")},form:{id:3,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-form/")},localeSet:{id:4,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-locale-set/")},pdf:{id:5,check:e=>"http://ns.adobe.com/xdp/pdf/"===e},signature:{id:6,check:e=>"http://www.w3.org/2000/09/xmldsig#"===e},sourceSet:{id:7,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-source-set/")},stylesheet:{id:8,check:e=>"http://www.w3.org/1999/XSL/Transform"===e},template:{id:9,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-template/")},xdc:{id:10,check:e=>e.startsWith("http://www.xfa.org/schema/xdc/")},xdp:{id:11,check:e=>"http://ns.adobe.com/xdp/"===e},xfdf:{id:12,check:e=>"http://ns.adobe.com/xfdf/"===e},xhtml:{id:13,check:e=>"http://www.w3.org/1999/xhtml"===e},xmpmeta:{id:14,check:e=>"http://ns.adobe.com/xmpmeta/"===e}},ml={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},pl=/([+-]?\d+\.?\d*)(.*)/;function stripQuotes(e){return e.startsWith("'")||e.startsWith('"')?e.slice(1,-1):e}function getInteger({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const n=parseInt(e,10);return!isNaN(n)&&a(n)?n:t}function getFloat({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const n=parseFloat(e);return!isNaN(n)&&a(n)?n:t}function getKeyword({data:e,defaultValue:t,validate:a}){return e&&a(e=e.trim())?e:t}function getStringOption(e,t){return getKeyword({data:e,defaultValue:t[0],validate:e=>t.includes(e)})}function getMeasurement(e,t="0"){t||="0";if(!e)return getMeasurement(t);const a=e.trim().match(pl);if(!a)return getMeasurement(t);const[,n,s]=a,r=parseFloat(n);if(isNaN(r))return getMeasurement(t);if(0===r)return 0;const i=ml[s];return i?i(r):r}function getRatio(e){if(!e)return{num:1,den:1};const t=e.split(":",2).map(e=>parseFloat(e.trim())).filter(e=>!isNaN(e));1===t.length&&t.push(1);if(0===t.length)return{num:1,den:1};const[a,n]=t;return{num:a,den:n}}function getRelevant(e){return e?e.trim().split(/\s+/).map(e=>({excluded:"-"===e[0],viewname:e.substring(1)})):[]}class HTMLResult{static get FAILURE(){return shadow(this,"FAILURE",new HTMLResult(!1,null,null,null))}static get EMPTY(){return shadow(this,"EMPTY",new HTMLResult(!0,null,null,null))}constructor(e,t,a,n){this.success=e;this.html=t;this.bbox=a;this.breakNode=n}isBreak(){return!!this.breakNode}static breakNode(e){return new HTMLResult(!1,null,null,e)}static success(e,t=null){return new HTMLResult(!0,e,t,null)}}class FontFinder{constructor(e){this.fonts=new Map;this.cache=new Map;this.warned=new Set;this.defaultFont=null;this.add(e)}add(e,t=null){for(const t of e)this.addPdfFont(t);for(const e of this.fonts.values())e.regular||(e.regular=e.italic||e.bold||e.bolditalic);if(!t||0===t.size)return;const a=this.fonts.get("PdfJS-Fallback-PdfJS-XFA");for(const e of t)this.fonts.set(e,a)}addPdfFont(e){const t=e.cssFontInfo,a=t.fontFamily,n=this.fonts.getOrInsertComputed(a,makeObj);this.defaultFont??=n;let s="";const r=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?s=r>=700?"bolditalic":"italic":r>=700&&(s="bold");if(!s){(e.name.includes("Bold")||e.psName?.includes("Bold"))&&(s="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName?.includes("Italic")||e.psName?.endsWith("It"))&&(s+="italic")}s||(s="regular");n[s]=e}getDefault(){return this.defaultFont}find(e,t=!0){let a=this.fonts.get(e)||this.cache.get(e);if(a)return a;const n=/,|-|_| |bolditalic|bold|italic|regular|it/gi;let s=e.replaceAll(n,"");a=this.fonts.get(s);if(a){this.cache.set(e,a);return a}s=s.toLowerCase();const r=[];for(const[e,t]of this.fonts)e.replaceAll(n,"").toLowerCase().startsWith(s)&&r.push(t);if(0===r.length)for(const e of this.fonts.values())e.regular.name?.replaceAll(n,"").toLowerCase().startsWith(s)&&r.push(e);if(0===r.length){s=s.replaceAll(/psmt|mt/gi,"");for(const[e,t]of this.fonts)e.replaceAll(n,"").toLowerCase().startsWith(s)&&r.push(t)}if(0===r.length)for(const e of this.fonts.values())e.regular.name?.replaceAll(n,"").toLowerCase().startsWith(s)&&r.push(e);if(r.length>=1){1!==r.length&&t&&warn(`XFA - Too many choices to guess the correct font: ${e}`);this.cache.set(e,r[0]);return r[0]}if(t&&!this.warned.has(e)){this.warned.add(e);warn(`XFA - Cannot find the font: ${e}`)}return null}}function selectFont(e,t){return"italic"===e.posture?"bold"===e.weight?t.bolditalic:t.italic:"bold"===e.weight?t.bold:t.regular}class FontInfo{constructor(e,t,a,n){this.lineHeight=a;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(n);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const s=n.find(e.typeface);if(s){this.pdfFont=selectFont(e,s);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(n))}else[this.pdfFont,this.xfaFont]=this.defaultFont(n)}defaultFont(e){const t=e.find("Helvetica",!1)||e.find("Myriad Pro",!1)||e.find("Arial",!1)||e.getDefault();if(t?.regular){const e=t.regular;return[e,{typeface:e.cssFontInfo.fontFamily,posture:"normal",weight:"normal",size:10,letterSpacing:0}]}return[null,{typeface:"Courier",posture:"normal",weight:"normal",size:10,letterSpacing:0}]}}class FontSelector{constructor(e,t,a,n){this.fontFinder=n;this.stack=[new FontInfo(e,t,a,n)]}pushData(e,t,a){const n=this.stack.at(-1);for(const t of["typeface","posture","weight","size","letterSpacing"])e[t]||=n.xfaFont[t];for(const e of["top","bottom","left","right"])isNaN(t[e])&&(t[e]=n.paraMargin[e]);const s=new FontInfo(e,t,a||n.lineHeight,this.fontFinder);s.pdfFont||=n.pdfFont;this.stack.push(s)}popFont(){this.stack.pop()}topFont(){return this.stack.at(-1)}}class TextMeasure{constructor(e,t,a,n){this.glyphs=[];this.fontSelector=new FontSelector(e,t,a,n);this.extraHeight=0}pushData(e,t,a){this.fontSelector.pushData(e,t,a)}popFont(e){return this.fontSelector.popFont()}addPara(){const e=this.fontSelector.topFont();this.extraHeight+=e.paraMargin.top+e.paraMargin.bottom}addString(e){if(!e)return;const t=this.fontSelector.topFont(),a=t.xfaFont.size;if(t.pdfFont){const n=t.xfaFont.letterSpacing,s=t.pdfFont,r=s.lineHeight||1.2,i=t.lineHeight||Math.max(1.2,r)*a,o=r-(void 0===s.lineGap?.2:s.lineGap),l=Math.max(1,o)*a,f=a/1e3,c=s.defaultWidth||s.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=s.encodeString(t).join(""),a=s.charsToGlyphs(e);for(const e of a){const t=e.width||c;this.glyphs.push([t*f+n,i,l,e.unicode,!1])}this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop();return}for(const t of e.split(/[\u2029\n]/)){for(const e of t.split(""))this.glyphs.push([a,1.2*a,a,e,!1]);this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}compute(e){let t=-1,a=0,n=0,s=0,r=0,i=0,o=!1,l=!0;for(let f=0,c=this.glyphs.length;fe){n=Math.max(n,r);r=0;s+=i;i=g;t=-1;a=0;o=!0;l=!1}else{i=Math.max(g,i);a=r;r+=c;t=f}else if(r+c>e){s+=i;i=g;if(-1!==t){f=t;n=Math.max(n,a);r=0;t=-1;a=0}else{n=Math.max(n,r);r=c}o=!0;l=!1}else{r+=c;i=Math.max(g,i)}}n=Math.max(n,r);s+=i+this.extraHeight;return{width:1.02*n,height:s,isBroken:o}}}const dl=/^[^.[]+/,gl=/^[^\]]+/,bl=0,wl=1,jl=2,kl=3,yl=4,ql=new Map([["$data",(e,t)=>e.datasets?e.datasets.data:e],["$record",(e,t)=>(e.datasets?e.datasets.data:e)[ko]()[0]],["$template",(e,t)=>e.template],["$connectionSet",(e,t)=>e.connectionSet],["$form",(e,t)=>e.form],["$layout",(e,t)=>e.layout],["$host",(e,t)=>e.host],["$dataWindow",(e,t)=>e.dataWindow],["$event",(e,t)=>e.event],["!",(e,t)=>e.datasets],["$xfa",(e,t)=>e],["xfa",(e,t)=>e],["$",(e,t)=>t]]),vl=new WeakMap;function parseIndex(e){return"*"===(e=e.trim())?1/0:parseInt(e,10)||0}function parseExpression(e,t,a=!0){let n=e.match(dl);if(!n)return null;let[s]=n;const r=[{name:s,cacheName:"."+s,index:0,js:null,formCalc:null,operator:bl}];let i=s.length;for(;i0&&c.push(e)}if(0===c.length&&!o&&0===l){const a=t[So]();if(!(t=a))return null;l=-1;e=[t];continue}e=isFinite(f)?c.filter(e=>fe[f]):c.flat()}return 0===e.length?null:e}function createDataNode(e,t,a){const n=parseExpression(a);if(!n)return null;if(n.some(e=>e.operator===wl))return null;const s=ql.get(n[0].name);let r=0;if(s){e=s(e,t);r=1}else e=t||e;for(let t=n.length;re[rl]()).join("")}get[xl](){const e=Object.getPrototypeOf(this);if(!e._attributes){const t=e._attributes=new Set;for(const e of Object.getOwnPropertyNames(this)){if(null===this[e]||this[e]instanceof XFAObject||this[e]instanceof XFAObjectArray)break;t.add(e)}}return shadow(this,xl,e._attributes)}[Do](e){let t=this;for(;t;){if(t===e)return!0;t=t[So]()}return!1}[So](){return this[Pl]}[vo](){return this[So]()}[ko](e=null){return e?this[e]:this[Cl]}[io](){const e=Object.create(null);this[so]&&(e.$content=this[so]);for(const t of Object.getOwnPropertyNames(this)){const a=this[t];null!==a&&(a instanceof XFAObject?e[t]=a[io]():a instanceof XFAObjectArray?a.isEmpty()||(e[t]=a.dump()):e[t]=a)}return e}[fl](){return null}[ol](){return HTMLResult.EMPTY}*[yo](){for(const e of this[ko]())yield e}*[Rl](e,t){for(const a of this[yo]())if(!e||t===e.has(a[Uo])){const e=this[uo](),t=a[ol](e);t.success||(this[oo].failingNode=a);yield t}}[fo](){return null}[Yi](e,t){this[oo].children.push(e)}[uo](){}[Qi]({filter:e=null,include:t=!0}){if(this[oo].generator){const e=this[uo](),t=this[oo].failingNode[ol](e);if(!t.success)return t;t.html&&this[Yi](t.html,t.bbox);delete this[oo].failingNode}else this[oo].generator=this[Rl](e,t);for(;;){const e=this[oo].generator.next();if(e.done)break;const t=e.value;if(!t.success)return t;t.html&&this[Yi](t.html,t.bbox)}this[oo].generator=null;return HTMLResult.EMPTY}[al](e){this[_l]=new Set(Object.keys(e))}[Bl](e){const t=this[xl],a=this[_l];return[...e].filter(e=>t.has(e)&&!a.has(e))}[Zo](e,t=new Set){for(const a of this[Cl])a[El](e,t)}[El](e,t){const a=this[Hl](e,t);a?this[Sl](a,e,t):this[Zo](e,t)}[Hl](e,t){const{use:a,usehref:n}=this;if(!a&&!n)return null;let s=null,r=null,i=null,o=a;if(n){o=n;n.startsWith("#som(")&&n.endsWith(")")?r=n.slice(5,-1):n.startsWith(".#som(")&&n.endsWith(")")?r=n.slice(6,-1):n.startsWith("#")?i=n.slice(1):n.startsWith(".#")&&(i=n.slice(2))}else a.startsWith("#")?i=a.slice(1):r=a;this.use=this.usehref="";if(i)s=e.get(i);else{s=searchNode(e.get(Qo),this,r,!0,!1);s&&(s=s[0])}if(!s){warn(`XFA - Invalid prototype reference: ${o}.`);return null}if(s[Uo]!==this[Uo]){warn(`XFA - Incompatible prototype: ${s[Uo]} !== ${this[Uo]}.`);return null}if(t.has(s)){warn("XFA - Cycle detected in prototypes use.");return null}t.add(s);const l=s[Hl](e,t);l&&s[Sl](l,e,t);s[Zo](e,t);t.delete(s);return s}[Sl](e,t,a){if(a.has(e)){warn("XFA - Cycle detected in prototypes use.");return}!this[so]&&e[so]&&(this[so]=e[so]);new Set(a).add(e);for(const t of this[Bl](e[_l])){this[t]=e[t];this[_l]&&this[_l].add(t)}for(const n of Object.getOwnPropertyNames(this)){if(this[xl].has(n))continue;const s=this[n],r=e[n];if(s instanceof XFAObjectArray){for(const e of s[Cl])e[El](t,a);for(let n=s[Cl].length,i=r[Cl].length;nXFAObject[Il](e)):"object"==typeof e&&null!==e?Object.assign({},e):e}[ao](){const e=Object.create(Object.getPrototypeOf(this));for(const t of Object.getOwnPropertySymbols(this))try{e[t]=this[t]}catch{shadow(e,t,this[t])}e[cl]=`${e[Uo]}${Ll++}`;e[Cl]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[xl].has(t)){e[t]=XFAObject[Il](this[t]);continue}const a=this[t];e[t]=a instanceof XFAObjectArray?new XFAObjectArray(a[Ml]):null}for(const t of this[Cl]){const a=t[Uo],n=t[ao]();e[Cl].push(n);n[Pl]=e;null===e[a]?e[a]=n:e[a][Cl].push(n)}return e}[ko](e=null){return e?this[Cl].filter(t=>t[Uo]===e):this[Cl]}[mo](e){return this[e]}[po](e,t,a=!0){return Array.from(this[go](e,t,a))}*[go](e,t,a=!0){if("parent"!==e){for(const a of this[Cl]){a[Uo]===e&&(yield a);a.name===e&&(yield a);(t||a[Eo]())&&(yield*a[go](e,t,!1))}a&&this[xl].has(e)&&(yield new XFAAttribute(this,e,this[e]))}else yield this[Pl]}}class XFAObjectArray{constructor(e=1/0){this[Ml]=e;this[Cl]=[]}get isXFAObject(){return!1}get isXFAObjectArray(){return!0}push(e){if(this[Cl].length<=this[Ml]){this[Cl].push(e);return!0}warn(`XFA - node "${e[Uo]}" accepts no more than ${this[Ml]} children`);return!1}isEmpty(){return 0===this[Cl].length}dump(){return 1===this[Cl].length?this[Cl][0][io]():this[Cl].map(e=>e[io]())}[ao](){const e=new XFAObjectArray(this[Ml]);e[Cl]=this[Cl].map(e=>e[ao]());return e}get children(){return this[Cl]}clear(){this[Cl].length=0}}class XFAAttribute{constructor(e,t,a){this[Pl]=e;this[Uo]=t;this[so]=a;this[no]=!1;this[cl]="attribute"+Ll++}[So](){return this[Pl]}[Bo](){return!0}[bo](){return this[so].trim()}[nl](e){e=e.value||"";this[so]=e.toString()}[rl](){return this[so]}[Do](e){return this[Pl]===e||this[Pl][Do](e)}}class XmlObject extends XFAObject{constructor(e,t,a={}){super(e,t);this[so]="";this[Fl]=null;if("#text"!==t){const e=new Map;this[Al]=e;for(const[t,n]of Object.entries(a))e.set(t,new XFAAttribute(this,t,n));if(Object.hasOwn(a,Xo)){const e=a[Xo].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[Fl]=!1:"dataValue"===e&&(this[Fl]=!0))}}this[no]=!1}[ll](e){const t=this[Uo];if("#text"===t){e.push(encodeToXmlString(this[so]));return}const a=utf8StringToString(t),n=this[Lo]===Xl?"xfa:":"";e.push(`<${n}${a}`);for(const[t,a]of this[Al]){const n=utf8StringToString(t);e.push(` ${n}="${encodeToXmlString(a[so])}"`)}null!==this[Fl]&&(this[Fl]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[so]||0!==this[Cl].length){e.push(">");if(this[so])"string"==typeof this[so]?e.push(encodeToXmlString(this[so])):this[so][ll](e);else for(const t of this[Cl])t[ll](e);e.push(``)}else e.push("/>")}[Wo](e){if(this[so]){const e=new XmlObject(this[Lo],"#text");this[Ji](e);e[so]=this[so];this[so]=""}this[Ji](e);return!0}[Go](e){this[so]+=e}[lo](){if(this[so]&&this[Cl].length>0){const e=new XmlObject(this[Lo],"#text");this[Ji](e);e[so]=this[so];delete this[so]}}[ol](){return"#text"===this[Uo]?HTMLResult.success({name:"#text",value:this[so]}):HTMLResult.EMPTY}[ko](e=null){return e?this[Cl].filter(t=>t[Uo]===e):this[Cl]}[ho](){return this[Al]}[mo](e){const t=this[Al].get(e);return void 0!==t?t:this[ko](e)}*[go](e,t){const a=this[Al].get(e);a&&(yield a);for(const a of this[Cl]){a[Uo]===e&&(yield a);t&&(yield*a[go](e,t))}}*[co](e,t){const a=this[Al].get(e);!a||t&&a[no]||(yield a);for(const a of this[Cl])yield*a[co](e,t)}*[jo](e,t,a){for(const n of this[Cl]){n[Uo]!==e||a&&n[no]||(yield n);t&&(yield*n[jo](e,t,a))}}[Bo](){return null===this[Fl]?0===this[Cl].length||this[Cl][0][Lo]===ul.xhtml.id:this[Fl]}[bo](){return null===this[Fl]?0===this[Cl].length?this[so].trim():this[Cl][0][Lo]===ul.xhtml.id?this[Cl][0][rl]().trim():null:this[so].trim()}[nl](e){e=e.value||"";this[so]=e.toString()}[io](e=!1){const t=Object.create(null);e&&(t.$ns=this[Lo]);this[so]&&(t.$content=this[so]);t.$name=this[Uo];t.children=[];for(const a of this[Cl])t.children.push(a[io](e));t.attributes=Object.create(null);for(const[e,a]of this[Al])t.attributes[e]=a[so];return t}}class ContentObject extends XFAObject{constructor(e,t){super(e,t);this[so]=""}[Go](e){this[so]+=e}[lo](){}}class OptionObject extends ContentObject{constructor(e,t,a){super(e,t);this[Nl]=a}[lo](){this[so]=getKeyword({data:this[so],defaultValue:this[Nl][0],validate:e=>this[Nl].includes(e)})}[Zi](e){super[Zi](e);delete this[Nl]}}class StringObject extends ContentObject{[lo](){this[so]=this[so].trim()}}class IntegerObject extends ContentObject{constructor(e,t,a,n){super(e,t);this[Tl]=a;this[zl]=n}[lo](){this[so]=getInteger({data:this[so],defaultValue:this[Tl],validate:this[zl]})}[Zi](e){super[Zi](e);delete this[Tl];delete this[zl]}}class Option01 extends IntegerObject{constructor(e,t){super(e,t,0,e=>1===e)}}class Option10 extends IntegerObject{constructor(e,t){super(e,t,1,e=>0===e)}}function measureToString(e){return"string"==typeof e?"0px":Number.isInteger(e)?`${e}px`:`${e.toFixed(2)}px`}const Wl={anchorType(e,t){const a=e[vo]();if(a&&(!a.layout||"position"===a.layout)){"transform"in t||(t.transform="");switch(e.anchorType){case"bottomCenter":t.transform+="translate(-50%, -100%)";break;case"bottomLeft":t.transform+="translate(0,-100%)";break;case"bottomRight":t.transform+="translate(-100%,-100%)";break;case"middleCenter":t.transform+="translate(-50%,-50%)";break;case"middleLeft":t.transform+="translate(0,-50%)";break;case"middleRight":t.transform+="translate(-100%,-50%)";break;case"topCenter":t.transform+="translate(-50%,0)";break;case"topRight":t.transform+="translate(-100%,0)"}}},dimensions(e,t){const a=e[vo]();let n=e.w;const s=e.h;if(a.layout?.includes("row")){const t=a[oo],s=e.colSpan;let r;if(-1===s){r=Math.sumPrecise(t.columnWidths.slice(t.currentColumn));t.currentColumn=0}else{r=Math.sumPrecise(t.columnWidths.slice(t.currentColumn,t.currentColumn+s));t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(r)||(n=e.w=r)}t.width=""!==n?measureToString(n):"auto";t.height=""!==s?measureToString(s):"auto"},position(e,t){const a=e[vo]();if(!a?.layout||"position"===a.layout){t.position="absolute";t.left=measureToString(e.x);t.top=measureToString(e.y)}},rotate(e,t){if(e.rotate){"transform"in t||(t.transform="");t.transform+=`rotate(-${e.rotate}deg)`;t.transformOrigin="top left"}},presence(e,t){switch(e.presence){case"invisible":t.visibility="hidden";break;case"hidden":case"inactive":t.display="none"}},hAlign(e,t){if("para"===e[Uo])switch(e.hAlign){case"justifyAll":t.textAlign="justify-all";break;case"radix":t.textAlign="left";break;default:t.textAlign=e.hAlign}else switch(e.hAlign){case"left":t.alignSelf="start";break;case"center":t.alignSelf="center";break;case"right":t.alignSelf="end"}},margin(e,t){e.margin&&(t.margin=e.margin[fl]().margin)}};function setMinMaxDimensions(e,t){if("position"===e[vo]().layout){e.minW>0&&(t.minWidth=measureToString(e.minW));e.maxW>0&&(t.maxWidth=measureToString(e.maxW));e.minH>0&&(t.minHeight=measureToString(e.minH));e.maxH>0&&(t.maxHeight=measureToString(e.maxH))}}function layoutText(e,t,a,n,s,r){const i=new TextMeasure(t,a,n,s);"string"==typeof e?i.addString(e):e[Vo](i);return i.compute(r)}function layoutNode(e,t){let a=null,n=null,s=!1;if((!e.w||!e.h)&&e.value){let r=0,i=0;if(e.margin){r=e.margin.leftInset+e.margin.rightInset;i=e.margin.topInset+e.margin.bottomInset}let o=null,l=null;if(e.para){l=Object.create(null);o=""===e.para.lineHeight?null:e.para.lineHeight;l.top=""===e.para.spaceAbove?0:e.para.spaceAbove;l.bottom=""===e.para.spaceBelow?0:e.para.spaceBelow;l.left=""===e.para.marginLeft?0:e.para.marginLeft;l.right=""===e.para.marginRight?0:e.para.marginRight}let f=e.font;if(!f){const t=e[Ao]();let a=e[So]();for(;a&&a!==t;){if(a.font){f=a.font;break}a=a[So]()}}const c=(e.w||t.width)-r,h=e[xo].fontFinder;if(e.value.exData&&e.value.exData[so]&&"text/html"===e.value.exData.contentType){const t=layoutText(e.value.exData[so],f,l,o,h,c);n=t.width;a=t.height;s=t.isBroken}else{const t=e.value[rl]();if(t){const e=layoutText(t,f,l,o,h,c);n=e.width;a=e.height;s=e.isBroken}}null===n||e.w||(n+=r);null===a||e.h||(a+=i)}return{w:n,h:a,isBroken:s}}function computeBbox(e,t,a){let n;if(""!==e.w&&""!==e.h)n=[e.x,e.y,e.w,e.h];else{if(!a)return null;let s=e.w;if(""===s){if(0===e.maxW){const t=e[vo]();s="position"===t.layout&&""!==t.w?0:e.minW}else s=Math.min(e.maxW,a.width);t.attributes.style.width=measureToString(s)}let r=e.h;if(""===r){if(0===e.maxH){const t=e[vo]();r="position"===t.layout&&""!==t.h?0:e.minH}else r=Math.min(e.maxH,a.height);t.attributes.style.height=measureToString(r)}n=[e.x,e.y,s,r]}return n}function fixDimensions(e){const t=e[vo]();if(t.layout?.includes("row")){const a=t[oo],n=e.colSpan;let s;s=-1===n?Math.sumPrecise(a.columnWidths.slice(a.currentColumn)):Math.sumPrecise(a.columnWidths.slice(a.currentColumn,a.currentColumn+n));isNaN(s)||(e.w=s)}t.layout&&"position"!==t.layout&&(e.x=e.y=0);"table"===e.layout&&""===e.w&&Array.isArray(e.columnWidths)&&(e.w=Math.sumPrecise(e.columnWidths))}function layoutClass(e){switch(e.layout){case"position":default:return"xfaPosition";case"lr-tb":return"xfaLrTb";case"rl-row":return"xfaRlRow";case"rl-tb":return"xfaRlTb";case"row":return"xfaRow";case"table":return"xfaTable";case"tb":return"xfaTb"}}function toStyle(e,...t){const a=Object.create(null);for(const n of t){const t=e[n];if(null!==t)if(Object.hasOwn(Wl,n))Wl[n](e,a);else if(t instanceof XFAObject){const e=t[fl]();e?Object.assign(a,e):warn(`(DEBUG) - XFA - style for ${n} not implemented yet`)}}return a}function createWrapper(e,t){const{attributes:a}=t,{style:n}=a,s={name:"div",attributes:{class:["xfaWrapper"],style:Object.create(null)},children:[]};a.class.push("xfaWrapped");if(e.border){const{widths:a,insets:r}=e.border[oo];let i,o,l=r[0],f=r[3];const c=r[0]+r[2],h=r[1]+r[3];switch(e.border.hand){case"even":l-=a[0]/2;f-=a[3]/2;i=`calc(100% + ${(a[1]+a[3])/2-h}px)`;o=`calc(100% + ${(a[0]+a[2])/2-c}px)`;break;case"left":l-=a[0];f-=a[3];i=`calc(100% + ${a[1]+a[3]-h}px)`;o=`calc(100% + ${a[0]+a[2]-c}px)`;break;case"right":i=h?`calc(100% - ${h}px)`:"100%";o=c?`calc(100% - ${c}px)`:"100%"}const u=["xfaBorder"];isPrintOnly(e.border)&&u.push("xfaPrintOnly");const m={name:"div",attributes:{class:u,style:{top:`${l}px`,left:`${f}px`,width:i,height:o}},children:[]};for(const e of["border","borderWidth","borderColor","borderRadius","borderStyle"])if(void 0!==n[e]){m.attributes.style[e]=n[e];delete n[e]}s.children.push(m,t)}else s.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==n[e]){s.attributes.style[e]=n[e];delete n[e]}s.attributes.style.position="absolute"===n.position?"absolute":"relative";delete n.position;if(n.alignSelf){s.attributes.style.alignSelf=n.alignSelf;delete n.alignSelf}return s}function fixTextIndent(e){const t=getMeasurement(e.textIndent,"0px");if(t>=0)return;const a="padding"+("left"===("right"===e.textAlign?"right":"left")?"Left":"Right"),n=getMeasurement(e[a],"0px");e[a]=n-t+"px"}function setAccess(e,t){switch(e.access){case"nonInteractive":t.push("xfaNonInteractive");break;case"readOnly":t.push("xfaReadOnly");break;case"protected":t.push("xfaDisabled")}}function isPrintOnly(e){return e.relevant.length>0&&!e.relevant[0].excluded&&"print"===e.relevant[0].viewname}function getCurrentPara(e){const t=e[Ao]()[oo].paraStack;return t.length?t.at(-1):null}function setPara(e,t,a){if(a.attributes.class?.includes("xfaRich")){if(t){""===e.h&&(t.height="auto");""===e.w&&(t.width="auto")}const n=getCurrentPara(e);if(n){const e=a.attributes.style;e.display="flex";e.flexDirection="column";switch(n.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=n[fl]();for(const[a,n]of Object.entries(t))a in e||(e[a]=n)}}}function setFontFamily(e,t,a,n){if(!a){delete n.fontFamily;return}const s=stripQuotes(e.typeface);n.fontFamily=`"${s}"`;const r=a.find(s);if(r){const{fontFamily:a}=r.regular.cssFontInfo;a!==s&&(n.fontFamily=`"${a}"`);const i=getCurrentPara(t);if(i&&""!==i.lineHeight)return;if(n.lineHeight)return;const o=selectFont(e,r);o&&(n.lineHeight=Math.max(1.2,o.lineHeight))}}function fixURL(e){const t=createValidAbsoluteUrl(e,null,{addDefaultProtocol:!0,tryConvertEncoding:!0});return t?t.href:null}function createLine(e,t){return{name:"div",attributes:{class:["lr-tb"===e.layout?"xfaLr":"xfaRl"]},children:t}}function flushHTML(e){if(!e[oo])return null;const t={name:"div",attributes:e[oo].attributes,children:e[oo].children};if(e[oo].failingNode){const a=e[oo].failingNode[fo]();a&&(e.layout.endsWith("-tb")?t.children.push(createLine(e,[a])):t.children.push(a))}return 0===t.children.length?null:t}function addHTML(e,t,a){const n=e[oo],s=n.availableSpace,[r,i,o,l]=a;switch(e.layout){case"position":n.width=Math.max(n.width,r+o);n.height=Math.max(n.height,i+l);n.children.push(t);break;case"lr-tb":case"rl-tb":if(!n.line||1===n.attempt){n.line=createLine(e,[]);n.children.push(n.line);n.numberInLine=0}n.numberInLine+=1;n.line.children.push(t);if(0===n.attempt){n.currentWidth+=o;n.height=Math.max(n.height,n.prevHeight+l)}else{n.currentWidth=o;n.prevHeight=n.height;n.height+=l;n.attempt=0}n.width=Math.max(n.width,n.currentWidth);break;case"rl-row":case"row":{n.children.push(t);n.width+=o;n.height=Math.max(n.height,l);const e=measureToString(n.height);for(const t of n.children)t.attributes.style.height=e;break}case"table":case"tb":n.width=MathClamp(o,n.width,s.width);n.height+=l;n.children.push(t)}}function getAvailableSpace(e){const t=e[oo].availableSpace,a=e.margin?e.margin.topInset+e.margin.bottomInset:0,n=e.margin?e.margin.leftInset+e.margin.rightInset:0;switch(e.layout){case"lr-tb":case"rl-tb":return 0===e[oo].attempt?{width:t.width-n-e[oo].currentWidth,height:t.height-a-e[oo].prevHeight}:{width:t.width-n,height:t.height-a-e[oo].height};case"rl-row":case"row":return{width:Math.sumPrecise(e[oo].columnWidths.slice(e[oo].currentColumn)),height:t.height-n};case"table":case"tb":return{width:t.width-n,height:t.height-a-e[oo].height};default:return t}}function checkDimensions(e,t){if(null===e[Ao]()[oo].firstUnsplittable)return!0;if(0===e.w||0===e.h)return!0;const a=e[vo](),n=a[oo]?.attempt||0,[,s,r,i]=function getTransformedBBox(e){let t,a,n=""===e.w?NaN:e.w,s=""===e.h?NaN:e.h,[r,i]=[0,0];switch(e.anchorType||""){case"bottomCenter":[r,i]=[n/2,s];break;case"bottomLeft":[r,i]=[0,s];break;case"bottomRight":[r,i]=[n,s];break;case"middleCenter":[r,i]=[n/2,s/2];break;case"middleLeft":[r,i]=[0,s/2];break;case"middleRight":[r,i]=[n,s/2];break;case"topCenter":[r,i]=[n/2,0];break;case"topRight":[r,i]=[n,0]}switch(e.rotate||0){case 0:[t,a]=[-r,-i];break;case 90:[t,a]=[-i,r];[n,s]=[s,-n];break;case 180:[t,a]=[r,i];[n,s]=[-n,-s];break;case 270:[t,a]=[i,-r];[n,s]=[-s,n]}return[e.x+t+Math.min(0,n),e.y+a+Math.min(0,s),Math.abs(n),Math.abs(s)]}(e);switch(a.layout){case"lr-tb":case"rl-tb":return 0===n?e[Ao]()[oo].noLayoutFailure?""!==e.w?Math.round(r-t.width)<=2:t.width>2:!(""!==e.h&&Math.round(i-t.height)>2)&&(""!==e.w?Math.round(r-t.width)<=2||0===a[oo].numberInLine&&t.height>2:t.width>2):!!e[Ao]()[oo].noLayoutFailure||!(""!==e.h&&Math.round(i-t.height)>2)&&((""===e.w||Math.round(r-t.width)<=2||!a[Po]())&&t.height>2);case"table":case"tb":return!!e[Ao]()[oo].noLayoutFailure||(""===e.h||e[No]()?(""===e.w||Math.round(r-t.width)<=2||!a[Po]())&&t.height>2:Math.round(i-t.height)<=2);case"position":if(e[Ao]()[oo].noLayoutFailure)return!0;if(""===e.h||Math.round(i+s-t.height)<=2)return!0;return i+s>e[Ao]()[oo].currentContentArea.h;case"rl-row":case"row":return!!e[Ao]()[oo].noLayoutFailure||(""===e.h||Math.round(i-t.height)<=2);default:return!0}}const Kl=ul.template.id,Gl="http://www.w3.org/2000/svg",Vl=/^H(\d+)$/,$l=new Set(["image/gif","image/jpeg","image/jpg","image/pjpeg","image/png","image/apng","image/x-png","image/bmp","image/x-ms-bmp","image/tiff","image/tif","application/octet-stream"]),Yl=[[[66,77],"image/bmp"],[[255,216,255],"image/jpeg"],[[73,73,42,0],"image/tiff"],[[77,77,0,42],"image/tiff"],[[71,73,70,56,57,97],"image/gif"],[[137,80,78,71,13,10,26,10],"image/png"]];function getBorderDims(e){if(!e||!e.border)return{w:0,h:0};const t=e.border[wo]();return t?{w:t.widths[0]+t.widths[2]+t.insets[0]+t.insets[2],h:t.widths[1]+t.widths[3]+t.insets[1]+t.insets[3]}:{w:0,h:0}}function hasMargin(e){return e.margin&&(e.margin.topInset||e.margin.rightInset||e.margin.bottomInset||e.margin.leftInset)}function _setValue(e,t){if(!e.value){const t=new Value({});e[Ji](t);e.value=t}e.value[nl](t)}function*getContainedChildren(e){for(const t of e[ko]())t instanceof SubformSet?yield*t[yo]():yield t}function isRequired(e){return"error"===e.validate?.nullTest}function setTabIndex(e){for(;e;){if(!e.traversal){e[sl]=e[So]()[sl];return}if(e[sl])return;let t=null;for(const a of e.traversal[ko]())if("next"===a.operation){t=a;break}if(!t||!t.ref){e[sl]=e[So]()[sl];return}const a=e[Ao]();e[sl]=++a[sl];const n=a[el](t.ref,e);if(!n)return;e=n[0]}}function applyAssist(e,t){const a=e.assist;if(a){const e=a[ol]();e&&(t.title=e);const n=a.role.match(Vl);if(n){const e="heading",a=n[1];t.role=e;t["aria-level"]=a}}if("table"===e.layout)t.role="table";else if("row"===e.layout)t.role="row";else{const a=e[So]();"row"===a.layout&&(t.role="TH"===a.assist?.role?"columnheader":"cell")}}function ariaLabel(e){if(!e.assist)return null;const t=e.assist;return t.speak&&""!==t.speak[so]?t.speak[so]:t.toolTip?t.toolTip[so]:null}function valueToHtml(e){return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:Object.create(null)},children:[{name:"span",attributes:{style:Object.create(null)},value:e}]})}function setFirstUnsplittable(e){const t=e[Ao]();if(null===t[oo].firstUnsplittable){t[oo].firstUnsplittable=e;t[oo].noLayoutFailure=!0}}function unsetFirstUnsplittable(e){const t=e[Ao]();t[oo].firstUnsplittable===e&&(t[oo].noLayoutFailure=!1)}function handleBreak(e){if(e[oo])return!1;e[oo]=Object.create(null);if("auto"===e.targetType)return!1;const t=e[Ao]();let a=null;if(e.target){a=t[el](e.target,e[So]());if(!a)return!1;a=a[0]}const{currentPageArea:n,currentContentArea:s}=t[oo];if("pageArea"===e.targetType){a instanceof PageArea||(a=null);if(e.startNew){e[oo].target=a||n;return!0}if(a&&a!==n){e[oo].target=a;return!0}return!1}a instanceof ContentArea||(a=null);const r=a&&a[So]();let i,o=r;if(e.startNew)if(a){const e=r.contentArea.children,t=e.indexOf(s),n=e.indexOf(a);-1!==t&&te;n[oo].noLayoutFailure=!0;const i=t[ol](a);e[Yi](i.html,i.bbox);n[oo].noLayoutFailure=s;t[vo]=r}class AppearanceFilter extends StringObject{constructor(e){super(Kl,"appearanceFilter");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Arc extends XFAObject{constructor(e){super(Kl,"arc",!0);this.circular=getInteger({data:e.circular,defaultValue:0,validate:e=>1===e});this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.startAngle=getFloat({data:e.startAngle,defaultValue:0,validate:e=>!0});this.sweepAngle=getFloat({data:e.sweepAngle,defaultValue:360,validate:e=>!0});this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null;this.fill=null}[ol](){const e=this.edge||new Edge({}),t=e[fl](),a=Object.create(null);"visible"===this.fill?.presence?Object.assign(a,this.fill[fl]()):a.fill="transparent";a.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);a.stroke=t.color;let n;const s={xmlns:Gl,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)n={name:"ellipse",attributes:{xmlns:Gl,cx:"50%",cy:"50%",rx:"50%",ry:"50%",style:a}};else{const e=this.startAngle*Math.PI/180,t=this.sweepAngle*Math.PI/180,r=this.sweepAngle>180?1:0,[i,o,l,f]=[50*(1+Math.cos(e)),50*(1-Math.sin(e)),50*(1+Math.cos(e+t)),50*(1-Math.sin(e+t))];n={name:"path",attributes:{xmlns:Gl,d:`M ${i} ${o} A 50 50 0 ${r} 0 ${l} ${f}`,vectorEffect:"non-scaling-stroke",style:a}};Object.assign(s,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const r={name:"svg",children:[n],attributes:s};if(hasMargin(this[So]()[So]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[r]});r.attributes.style.position="absolute";return HTMLResult.success(r)}}class Area extends XFAObject{constructor(e){super(Kl,"area",!0);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null;this.area=new XFAObjectArray;this.draw=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[yo](){yield*getContainedChildren(this)}[Eo](){return!0}[Ho](){return!0}[Yi](e,t){const[a,n,s,r]=t;this[oo].width=Math.max(this[oo].width,a+s);this[oo].height=Math.max(this[oo].height,n+r);this[oo].children.push(e)}[uo](){return this[oo].availableSpace}[ol](e){const t=toStyle(this,"position"),a={style:t,id:this[cl],class:["xfaArea"]};isPrintOnly(this)&&a.class.push("xfaPrintOnly");this.name&&(a.xfaName=this.name);const n=[];this[oo]={children:n,width:0,height:0,availableSpace:e};const s=this[Qi]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!s.success){if(s.isBreak())return s;delete this[oo];return HTMLResult.FAILURE}t.width=measureToString(this[oo].width);t.height=measureToString(this[oo].height);const r={name:"div",attributes:a,children:n},i=[this.x,this.y,this[oo].width,this[oo].height];delete this[oo];return HTMLResult.success(r,i)}}class Assist extends XFAObject{constructor(e){super(Kl,"assist",!0);this.id=e.id||"";this.role=e.role||"";this.use=e.use||"";this.usehref=e.usehref||"";this.speak=null;this.toolTip=null}[ol](){return this.toolTip?.[so]||null}}class Barcode extends XFAObject{constructor(e){super(Kl,"barcode",!0);this.charEncoding=getKeyword({data:e.charEncoding?e.charEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.checksum=getStringOption(e.checksum,["none","1mod10","1mod10_1mod11","2mod10","auto"]);this.dataColumnCount=getInteger({data:e.dataColumnCount,defaultValue:-1,validate:e=>e>=0});this.dataLength=getInteger({data:e.dataLength,defaultValue:-1,validate:e=>e>=0});this.dataPrep=getStringOption(e.dataPrep,["none","flateCompress"]);this.dataRowCount=getInteger({data:e.dataRowCount,defaultValue:-1,validate:e=>e>=0});this.endChar=e.endChar||"";this.errorCorrectionLevel=getInteger({data:e.errorCorrectionLevel,defaultValue:-1,validate:e=>e>=0&&e<=8});this.id=e.id||"";this.moduleHeight=getMeasurement(e.moduleHeight,"5mm");this.moduleWidth=getMeasurement(e.moduleWidth,"0.25mm");this.printCheckDigit=getInteger({data:e.printCheckDigit,defaultValue:0,validate:e=>1===e});this.rowColumnRatio=getRatio(e.rowColumnRatio);this.startChar=e.startChar||"";this.textLocation=getStringOption(e.textLocation,["below","above","aboveEmbedded","belowEmbedded","none"]);this.truncate=getInteger({data:e.truncate,defaultValue:0,validate:e=>1===e});this.type=getStringOption(e.type?e.type.toLowerCase():"",["aztec","codabar","code2of5industrial","code2of5interleaved","code2of5matrix","code2of5standard","code3of9","code3of9extended","code11","code49","code93","code128","code128a","code128b","code128c","code128sscc","datamatrix","ean8","ean8add2","ean8add5","ean13","ean13add2","ean13add5","ean13pwcd","fim","logmars","maxicode","msi","pdf417","pdf417macro","plessey","postauscust2","postauscust3","postausreplypaid","postausstandard","postukrm4scc","postusdpbc","postusimb","postusstandard","postus5zip","qrcode","rfid","rss14","rss14expanded","rss14limited","rss14stacked","rss14stackedomni","rss14truncated","telepen","ucc128","ucc128random","ucc128sscc","upca","upcaadd2","upcaadd5","upcapwcd","upce","upceadd2","upceadd5","upcean2","upcean5","upsmaxicode"]);this.upsMode=getStringOption(e.upsMode,["usCarrier","internationalCarrier","secureSymbol","standardSymbol"]);this.use=e.use||"";this.usehref=e.usehref||"";this.wideNarrowRatio=getRatio(e.wideNarrowRatio);this.encrypt=null;this.extras=null}}class Bind extends XFAObject{constructor(e){super(Kl,"bind",!0);this.match=getStringOption(e.match,["once","dataRef","global","none"]);this.ref=e.ref||"";this.picture=null}}class BindItems extends XFAObject{constructor(e){super(Kl,"bindItems");this.connection=e.connection||"";this.labelRef=e.labelRef||"";this.ref=e.ref||"";this.valueRef=e.valueRef||""}}class Bookend extends XFAObject{constructor(e){super(Kl,"bookend");this.id=e.id||"";this.leader=e.leader||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}}class BooleanElement extends Option01{constructor(e){super(Kl,"boolean");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ol](e){return valueToHtml(1===this[so]?"1":"0")}}class Border extends XFAObject{constructor(e){super(Kl,"border",!0);this.break=getStringOption(e.break,["close","open"]);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.extras=null;this.fill=null;this.margin=null}[wo](){if(!this[oo]){const e=this.edge.children.slice();if(e.length<4){const t=e.at(-1)||new Edge({});for(let a=e.length;a<4;a++)e.push(t)}const t=e.map(e=>e.thickness),a=[0,0,0,0];if(this.margin){a[0]=this.margin.topInset;a[1]=this.margin.rightInset;a[2]=this.margin.bottomInset;a[3]=this.margin.leftInset}this[oo]={widths:t,insets:a,edges:e}}return this[oo]}[fl](){const{edges:e}=this[wo](),t=e.map(e=>{const t=e[fl]();t.color||="#000000";return t}),a=Object.create(null);this.margin&&Object.assign(a,this.margin[fl]());"visible"===this.fill?.presence&&Object.assign(a,this.fill[fl]());if(this.corner.children.some(e=>0!==e.radius)){const e=this.corner.children.map(e=>e[fl]());if(2===e.length||3===e.length){const t=e.at(-1);for(let a=e.length;a<4;a++)e.push(t)}a.borderRadius=e.map(e=>e.radius).join(" ")}switch(this.presence){case"invisible":case"hidden":a.borderStyle="";break;case"inactive":a.borderStyle="none";break;default:a.borderStyle=t.map(e=>e.style).join(" ")}a.borderWidth=t.map(e=>e.width).join(" ");a.borderColor=t.map(e=>e.color).join(" ");return a}}class Break extends XFAObject{constructor(e){super(Kl,"break",!0);this.after=getStringOption(e.after,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.afterTarget=e.afterTarget||"";this.before=getStringOption(e.before,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.beforeTarget=e.beforeTarget||"";this.bookendLeader=e.bookendLeader||"";this.bookendTrailer=e.bookendTrailer||"";this.id=e.id||"";this.overflowLeader=e.overflowLeader||"";this.overflowTarget=e.overflowTarget||"";this.overflowTrailer=e.overflowTrailer||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class BreakAfter extends XFAObject{constructor(e){super(Kl,"breakAfter",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}}class BreakBefore extends XFAObject{constructor(e){super(Kl,"breakBefore",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}[ol](e){this[oo]={};return HTMLResult.FAILURE}}class Button extends XFAObject{constructor(e){super(Kl,"button",!0);this.highlight=getStringOption(e.highlight,["inverted","none","outline","push"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[ol](e){const t=this[So]()[So](),a={name:"button",attributes:{id:this[cl],class:["xfaButton"],style:{}},children:[]};for(const e of t.event.children){if("click"!==e.activity||!e.script)continue;const t=recoverJsURL(e.script[so]);if(!t)continue;const n=fixURL(t.url);n&&a.children.push({name:"a",attributes:{id:"link"+this[cl],href:n,newWindow:t.newWindow,class:["xfaLink"],style:{}},children:[]})}return HTMLResult.success(a)}}class Calculate extends XFAObject{constructor(e){super(Kl,"calculate",!0);this.id=e.id||"";this.override=getStringOption(e.override,["disabled","error","ignore","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.script=null}}class Caption extends XFAObject{constructor(e){super(Kl,"caption",!0);this.id=e.id||"";this.placement=getStringOption(e.placement,["left","bottom","inline","right","top"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.reserve=Math.ceil(getMeasurement(e.reserve));this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.font=null;this.margin=null;this.para=null;this.value=null}[nl](e){_setValue(this,e)}[wo](e){if(!this[oo]){let{width:t,height:a}=e;switch(this.placement){case"left":case"right":case"inline":t=this.reserve<=0?t:this.reserve;break;case"top":case"bottom":a=this.reserve<=0?a:this.reserve}this[oo]=layoutNode(this,{width:t,height:a})}return this[oo]}[ol](e){if(!this.value)return HTMLResult.EMPTY;this[Yo]();const t=this.value[ol](e).html;if(!t){this[$o]();return HTMLResult.EMPTY}const a=this.reserve;if(this.reserve<=0){const{w:t,h:a}=this[wo](e);switch(this.placement){case"left":case"right":case"inline":this.reserve=t;break;case"top":case"bottom":this.reserve=a}}const n=[];"string"==typeof t?n.push({name:"#text",value:t}):n.push(t);const s=toStyle(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(s.width=measureToString(this.reserve));break;case"top":case"bottom":this.reserve>0&&(s.height=measureToString(this.reserve))}setPara(this,null,t);this[$o]();this.reserve=a;return HTMLResult.success({name:"div",attributes:{style:s,class:["xfaCaption"]},children:n})}}class Certificate extends StringObject{constructor(e){super(Kl,"certificate");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Certificates extends XFAObject{constructor(e){super(Kl,"certificates",!0);this.credentialServerPolicy=getStringOption(e.credentialServerPolicy,["optional","required"]);this.id=e.id||"";this.url=e.url||"";this.urlPolicy=e.urlPolicy||"";this.use=e.use||"";this.usehref=e.usehref||"";this.encryption=null;this.issuers=null;this.keyUsage=null;this.oids=null;this.signing=null;this.subjectDNs=null}}class CheckButton extends XFAObject{constructor(e){super(Kl,"checkButton",!0);this.id=e.id||"";this.mark=getStringOption(e.mark,["default","check","circle","cross","diamond","square","star"]);this.shape=getStringOption(e.shape,["square","round"]);this.size=getMeasurement(e.size,"10pt");this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[ol](e){const t=toStyle(this,"margin"),a=measureToString(this.size);t.width=t.height=a;let n,s,r;const i=this[So]()[So](),o=i.items.children.length&&i.items.children[0][ol]().html||[],l={on:(void 0!==o[0]?o[0]:"on").toString(),off:(void 0!==o[1]?o[1]:"off").toString()},f=(i.value?.[rl]()||"off")===l.on||void 0,c=i[vo](),h=i[cl];let u;if(c instanceof ExclGroup){r=c[cl];n="radio";s="xfaRadio";u=c[ro]?.[cl]||c[cl]}else{n="checkbox";s="xfaCheckbox";u=i[ro]?.[cl]||i[cl]}const m={name:"input",attributes:{class:[s],style:t,fieldId:h,dataId:u,type:n,checked:f,xfaOn:l.on,xfaOff:l.off,"aria-label":ariaLabel(i),"aria-required":!1}};r&&(m.attributes.name=r);if(isRequired(i)){m.attributes["aria-required"]=!0;m.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[m]})}}class ChoiceList extends XFAObject{constructor(e){super(Kl,"choiceList",!0);this.commitOn=getStringOption(e.commitOn,["select","exit"]);this.id=e.id||"";this.open=getStringOption(e.open,["userControl","always","multiSelect","onEntry"]);this.textEntry=getInteger({data:e.textEntry,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[ol](e){const t=toStyle(this,"border","margin"),a=this[So]()[So](),n={fontSize:`calc(${a.font?.size||10}px * var(--total-scale-factor))`},s=[];if(a.items.children.length>0){const e=a.items;let t=0,r=0;if(2===e.children.length){t=e.children[0].save;r=1-t}const i=e.children[t][ol]().html,o=e.children[r][ol]().html;let l=!1;const f=a.value?.[rl]()||"";for(let e=0,t=i.length;eMathClamp(parseInt(e.trim(),10),0,255)).map(e=>isNaN(e)?0:e);if(r.length<3)return{r:a,g:n,b:s};[a,n,s]=r;return{r:a,g:n,b:s}}(e.value):"";this.extras=null}[Co](){return!1}[fl](){return this.value?Util.makeHexColor(this.value.r,this.value.g,this.value.b):null}}class Comb extends XFAObject{constructor(e){super(Kl,"comb");this.id=e.id||"";this.numberOfCells=getInteger({data:e.numberOfCells,defaultValue:0,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||""}}class Connect extends XFAObject{constructor(e){super(Kl,"connect",!0);this.connection=e.connection||"";this.id=e.id||"";this.ref=e.ref||"";this.usage=getStringOption(e.usage,["exportAndImport","exportOnly","importOnly"]);this.use=e.use||"";this.usehref=e.usehref||"";this.picture=null}}class ContentArea extends XFAObject{constructor(e){super(Kl,"contentArea",!0);this.h=getMeasurement(e.h);this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=getMeasurement(e.w);this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null}[ol](e){const t={left:measureToString(this.x),top:measureToString(this.y),width:measureToString(this.w),height:measureToString(this.h)},a=["xfaContentarea"];isPrintOnly(this)&&a.push("xfaPrintOnly");return HTMLResult.success({name:"div",children:[],attributes:{style:t,class:a,id:this[cl]}})}}class Corner extends XFAObject{constructor(e){super(Kl,"corner",!0);this.id=e.id||"";this.inverted=getInteger({data:e.inverted,defaultValue:0,validate:e=>1===e});this.join=getStringOption(e.join,["square","round"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.radius=getMeasurement(e.radius);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](){const e=toStyle(this,"visibility");e.radius=measureToString("square"===this.join?0:this.radius);return e}}class DateElement extends ContentObject{constructor(e){super(Kl,"date");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=this[so].trim();this[so]=e?new Date(e):null}[ol](e){return valueToHtml(this[so]?this[so].toString():"")}}class DateTime extends ContentObject{constructor(e){super(Kl,"dateTime");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=this[so].trim();this[so]=e?new Date(e):null}[ol](e){return valueToHtml(this[so]?this[so].toString():"")}}class DateTimeEdit extends XFAObject{constructor(e){super(Kl,"dateTimeEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.picker=getStringOption(e.picker,["host","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[ol](e){const t=toStyle(this,"border","font","margin"),a=this[So]()[So](),n={name:"input",attributes:{type:"text",fieldId:a[cl],dataId:a[ro]?.[cl]||a[cl],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Decimal extends ContentObject{constructor(e){super(Kl,"decimal");this.fracDigits=getInteger({data:e.fracDigits,defaultValue:2,validate:e=>!0});this.id=e.id||"";this.leadDigits=getInteger({data:e.leadDigits,defaultValue:-1,validate:e=>!0});this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=parseFloat(this[so].trim());this[so]=isNaN(e)?null:e}[ol](e){return valueToHtml(null!==this[so]?this[so].toString():"")}}class DefaultUi extends XFAObject{constructor(e){super(Kl,"defaultUi",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class Desc extends XFAObject{constructor(e){super(Kl,"desc",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class DigestMethod extends OptionObject{constructor(e){super(Kl,"digestMethod",["","SHA1","SHA256","SHA512","RIPEMD160"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class DigestMethods extends XFAObject{constructor(e){super(Kl,"digestMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.digestMethod=new XFAObjectArray}}class Draw extends XFAObject{constructor(e){super(Kl,"draw",!0);this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.border=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.value=null;this.setProperty=new XFAObjectArray}[nl](e){_setValue(this,e)}[ol](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;fixDimensions(this);this[Yo]();const t=this.w,a=this.h,{w:n,h:s,isBroken:r}=layoutNode(this,e);if(n&&""===this.w){if(r&&this[vo]()[Po]()){this[$o]();return HTMLResult.FAILURE}this.w=n}s&&""===this.h&&(this.h=s);setFirstUnsplittable(this);if(!checkDimensions(this,e)){this.w=t;this.h=a;this[$o]();return HTMLResult.FAILURE}unsetFirstUnsplittable(this);const i=toStyle(this,"font","hAlign","dimensions","position","presence","rotate","anchorType","border","margin");setMinMaxDimensions(this,i);if(i.margin){i.padding=i.margin;delete i.margin}const o=["xfaDraw"];this.font&&o.push("xfaFont");isPrintOnly(this)&&o.push("xfaPrintOnly");const l={style:i,id:this[cl],class:o};this.name&&(l.xfaName=this.name);const f={name:"div",attributes:l,children:[]};applyAssist(this,l);const c=computeBbox(this,f,e),h=this.value?this.value[ol](e).html:null;if(null===h){this.w=t;this.h=a;this[$o]();return HTMLResult.success(createWrapper(this,f),c)}f.children.push(h);setPara(this,i,h);this.w=t;this.h=a;this[$o]();return HTMLResult.success(createWrapper(this,f),c)}}class Edge extends XFAObject{constructor(e){super(Kl,"edge",!0);this.cap=getStringOption(e.cap,["square","butt","round"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](){const e=toStyle(this,"visibility");Object.assign(e,{linecap:this.cap,width:measureToString(this.thickness),color:this.color?this.color[fl]():"#000000",style:""});if("visible"!==this.presence)e.style="none";else switch(this.stroke){case"solid":e.style="solid";break;case"dashDot":case"dashDotDot":case"dashed":e.style="dashed";break;case"dotted":e.style="dotted";break;case"embossed":e.style="ridge";break;case"etched":e.style="groove";break;case"lowered":e.style="inset";break;case"raised":e.style="outset"}return e}}class Encoding extends OptionObject{constructor(e){super(Kl,"encoding",["adbe.x509.rsa_sha1","adbe.pkcs7.detached","adbe.pkcs7.sha1"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Encodings extends XFAObject{constructor(e){super(Kl,"encodings",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encoding=new XFAObjectArray}}class Encrypt extends XFAObject{constructor(e){super(Kl,"encrypt",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=null}}class EncryptData extends XFAObject{constructor(e){super(Kl,"encryptData",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["encrypt","decrypt"]);this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Encryption extends XFAObject{constructor(e){super(Kl,"encryption",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class EncryptionMethod extends OptionObject{constructor(e){super(Kl,"encryptionMethod",["","AES256-CBC","TRIPLEDES-CBC","AES128-CBC","AES192-CBC"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EncryptionMethods extends XFAObject{constructor(e){super(Kl,"encryptionMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encryptionMethod=new XFAObjectArray}}class Event extends XFAObject{constructor(e){super(Kl,"event",!0);this.activity=getStringOption(e.activity,["click","change","docClose","docReady","enter","exit","full","indexChange","initialize","mouseDown","mouseEnter","mouseExit","mouseUp","postExecute","postOpen","postPrint","postSave","postSign","postSubmit","preExecute","preOpen","prePrint","preSave","preSign","preSubmit","ready","validationState"]);this.id=e.id||"";this.listen=getStringOption(e.listen,["refOnly","refAndDescendents"]);this.name=e.name||"";this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.encryptData=null;this.execute=null;this.script=null;this.signData=null;this.submit=null}}class ExData extends ContentObject{constructor(e){super(Kl,"exData");this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.maxLength=getInteger({data:e.maxLength,defaultValue:-1,validate:e=>e>=-1});this.name=e.name||"";this.rid=e.rid||"";this.transferEncoding=getStringOption(e.transferEncoding,["none","base64","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[Ro](){return"text/html"===this.contentType}[Wo](e){if("text/html"===this.contentType&&e[Lo]===ul.xhtml.id){this[so]=e;return!0}if("text/xml"===this.contentType){this[so]=e;return!0}return!1}[ol](e){return"text/html"===this.contentType&&this[so]?this[so][ol](e):HTMLResult.EMPTY}}class ExObject extends XFAObject{constructor(e){super(Kl,"exObject",!0);this.archive=e.archive||"";this.classId=e.classId||"";this.codeBase=e.codeBase||"";this.codeType=e.codeType||"";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class ExclGroup extends XFAObject{constructor(e){super(Kl,"exclGroup",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.margin=null;this.para=null;this.traversal=null;this.validate=null;this.connect=new XFAObjectArray;this.event=new XFAObjectArray;this.field=new XFAObjectArray;this.setProperty=new XFAObjectArray}[Ho](){return!0}[Co](){return!0}[nl](e){for(const t of this.field.children){if(!t.value){const e=new Value({});t[Ji](e);t.value=e}t.value[nl](e)}}[Po](){return this.layout.endsWith("-tb")&&0===this[oo].attempt&&this[oo].numberInLine>0||this[So]()[Po]()}[No](){const e=this[vo]();if(!e[No]())return!1;if(void 0!==this[oo]._isSplittable)return this[oo]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[oo]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[oo].numberInLine)return!1;this[oo]._isSplittable=!0;return!0}[fo](){return flushHTML(this)}[Yi](e,t){addHTML(this,e,t)}[uo](){return getAvailableSpace(this)}[ol](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;fixDimensions(this);const t=[],a={id:this[cl],class:[]};setAccess(this,a.class);this[oo]||=Object.create(null);Object.assign(this[oo],{children:t,attributes:a,attempt:0,line:null,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[No]();n||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const s=new Set(["field"]);if(this.layout.includes("row")){const e=this[vo]().columnWidths;if(Array.isArray(e)&&e.length>0){this[oo].columnWidths=e;this[oo].currentColumn=0}}const r=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),i=["xfaExclgroup"],o=layoutClass(this);o&&i.push(o);isPrintOnly(this)&&i.push("xfaPrintOnly");a.style=r;a.class=i;this.name&&(a.xfaName=this.name);this[Yo]();const l="lr-tb"===this.layout||"rl-tb"===this.layout,f=l?2:1;for(;this[oo].attempte>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.format=null;this.items=new XFAObjectArray(2);this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.validate=null;this.value=null;this.bindItems=new XFAObjectArray;this.connect=new XFAObjectArray;this.event=new XFAObjectArray;this.setProperty=new XFAObjectArray}[Ho](){return!0}[nl](e){_setValue(this,e)}[ol](e){setTabIndex(this);if(!this.ui){this.ui=new Ui({});this.ui[xo]=this[xo];this[Ji](this.ui);let e;switch(this.items.children.length){case 0:e=new TextEdit({});this.ui.textEdit=e;break;case 1:e=new CheckButton({});this.ui.checkButton=e;break;case 2:e=new ChoiceList({});this.ui.choiceList=e}this.ui[Ji](e)}if(!this.ui||"hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;this.caption&&delete this.caption[oo];this[Yo]();const t=this.caption?this.caption[ol](e).html:null,a=this.w,n=this.h;let s=0,r=0;if(this.margin){s=this.margin.leftInset+this.margin.rightInset;r=this.margin.topInset+this.margin.bottomInset}let i=null;if(""===this.w||""===this.h){let t=null,a=null,n=0,o=0;if(this.ui.checkButton)n=o=this.ui.checkButton.size;else{const{w:t,h:a}=layoutNode(this,e);if(null!==t){n=t;o=a}else o=function fonts_getMetrics(e,t=!1){let a=null;if(e){const t=stripQuotes(e.typeface),n=e[xo].fontFinder.find(t);a=selectFont(e,n)}if(!a)return{lineHeight:12,lineGap:2,lineNoGap:10};const n=e.size||10,s=a.lineHeight?Math.max(t?0:1.2,a.lineHeight):1.2,r=void 0===a.lineGap?.2:a.lineGap;return{lineHeight:s*n,lineGap:r*n,lineNoGap:Math.max(1,s-r)*n}}(this.font,!0).lineNoGap}i=getBorderDims(this.ui[wo]());n+=i.w;o+=i.h;if(this.caption){const{w:s,h:r,isBroken:i}=this.caption[wo](e);if(i&&this[vo]()[Po]()){this[$o]();return HTMLResult.FAILURE}t=s;a=r;switch(this.caption.placement){case"left":case"right":case"inline":t+=n;break;case"top":case"bottom":a+=o}}else{t=n;a=o}if(t&&""===this.w){t+=s;this.w=Math.min(this.maxW<=0?1/0:this.maxW,this.minW+1e>=1&&e<=5});this.appearanceFilter=null;this.certificates=null;this.digestMethods=null;this.encodings=null;this.encryptionMethods=null;this.handler=null;this.lockDocument=null;this.mdp=null;this.reasons=null;this.timeStamp=null}}class Float extends ContentObject{constructor(e){super(Kl,"float");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=parseFloat(this[so].trim());this[so]=isNaN(e)?null:e}[ol](e){return valueToHtml(null!==this[so]?this[so].toString():"")}}class template_Font extends XFAObject{constructor(e){super(Kl,"font",!0);this.baselineShift=getMeasurement(e.baselineShift);this.fontHorizontalScale=getFloat({data:e.fontHorizontalScale,defaultValue:100,validate:e=>e>=0});this.fontVerticalScale=getFloat({data:e.fontVerticalScale,defaultValue:100,validate:e=>e>=0});this.id=e.id||"";this.kerningMode=getStringOption(e.kerningMode,["none","pair"]);this.letterSpacing=getMeasurement(e.letterSpacing,"0");this.lineThrough=getInteger({data:e.lineThrough,defaultValue:0,validate:e=>1===e||2===e});this.lineThroughPeriod=getStringOption(e.lineThroughPeriod,["all","word"]);this.overline=getInteger({data:e.overline,defaultValue:0,validate:e=>1===e||2===e});this.overlinePeriod=getStringOption(e.overlinePeriod,["all","word"]);this.posture=getStringOption(e.posture,["normal","italic"]);this.size=getMeasurement(e.size,"10pt");this.typeface=e.typeface||"Courier";this.underline=getInteger({data:e.underline,defaultValue:0,validate:e=>1===e||2===e});this.underlinePeriod=getStringOption(e.underlinePeriod,["all","word"]);this.use=e.use||"";this.usehref=e.usehref||"";this.weight=getStringOption(e.weight,["normal","bold"]);this.extras=null;this.fill=null}[Zi](e){super[Zi](e);this[xo].usedTypefaces.add(this.typeface)}[fl](){const e=toStyle(this,"fill"),t=e.color;if(t)if("#000000"===t)delete e.color;else if(!t.startsWith("#")){e.background=t;e.backgroundClip="text";e.color="transparent"}this.baselineShift&&(e.verticalAlign=measureToString(this.baselineShift));e.fontKerning="none"===this.kerningMode?"none":"normal";e.letterSpacing=measureToString(this.letterSpacing);if(0!==this.lineThrough){e.textDecoration="line-through";2===this.lineThrough&&(e.textDecorationStyle="double")}if(0!==this.overline){e.textDecoration="overline";2===this.overline&&(e.textDecorationStyle="double")}e.fontStyle=this.posture;e.fontSize=measureToString(.99*this.size);setFontFamily(this,this,this[xo].fontFinder,e);if(0!==this.underline){e.textDecoration="underline";2===this.underline&&(e.textDecorationStyle="double")}e.fontWeight=this.weight;return e}}class Format extends XFAObject{constructor(e){super(Kl,"format",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null}}class Handler extends StringObject{constructor(e){super(Kl,"handler");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Hyphenation extends XFAObject{constructor(e){super(Kl,"hyphenation");this.excludeAllCaps=getInteger({data:e.excludeAllCaps,defaultValue:0,validate:e=>1===e});this.excludeInitialCap=getInteger({data:e.excludeInitialCap,defaultValue:0,validate:e=>1===e});this.hyphenate=getInteger({data:e.hyphenate,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.pushCharacterCount=getInteger({data:e.pushCharacterCount,defaultValue:3,validate:e=>e>=0});this.remainCharacterCount=getInteger({data:e.remainCharacterCount,defaultValue:3,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||"";this.wordCharacterCount=getInteger({data:e.wordCharacterCount,defaultValue:7,validate:e=>e>=0})}}class Image extends StringObject{constructor(e){super(Kl,"image");this.aspect=getStringOption(e.aspect,["fit","actual","height","none","width"]);this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.name=e.name||"";this.transferEncoding=getStringOption(e.transferEncoding,["base64","none","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[ol](){if(this.contentType&&!$l.has(this.contentType.toLowerCase()))return HTMLResult.EMPTY;let e=this[xo].images?.get(this.href);if(!e&&(this.href||!this[so]))return HTMLResult.EMPTY;e||"base64"!==this.transferEncoding||(e=Uint8Array.fromBase64(this[so]));if(!e)return HTMLResult.EMPTY;if(!this.contentType){for(const[t,a]of Yl)if(e.length>t.length&&t.every((t,a)=>t===e[a])){this.contentType=a;break}if(!this.contentType)return HTMLResult.EMPTY}const t=new Blob([e],{type:this.contentType});let a;switch(this.aspect){case"fit":case"actual":break;case"height":a={height:"100%",objectFit:"fill"};break;case"none":a={width:"100%",height:"100%",objectFit:"fill"};break;case"width":a={width:"100%",objectFit:"fill"}}const n=this[So]();return HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:a,src:URL.createObjectURL(t),alt:n?ariaLabel(n[So]()):null}})}}class ImageEdit extends XFAObject{constructor(e){super(Kl,"imageEdit",!0);this.data=getStringOption(e.data,["link","embed"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[ol](e){return"embed"===this.data?HTMLResult.success({name:"div",children:[],attributes:{}}):HTMLResult.EMPTY}}class Integer extends ContentObject{constructor(e){super(Kl,"integer");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=parseInt(this[so].trim(),10);this[so]=isNaN(e)?null:e}[ol](e){return valueToHtml(null!==this[so]?this[so].toString():"")}}class Issuers extends XFAObject{constructor(e){super(Kl,"issuers",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Items extends XFAObject{constructor(e){super(Kl,"items",!0);this.id=e.id||"";this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.ref=e.ref||"";this.save=getInteger({data:e.save,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[ol](){const e=[];for(const t of this[ko]())e.push(t[rl]());return HTMLResult.success(e)}}class Keep extends XFAObject{constructor(e){super(Kl,"keep",!0);this.id=e.id||"";const t=["none","contentArea","pageArea"];this.intact=getStringOption(e.intact,t);this.next=getStringOption(e.next,t);this.previous=getStringOption(e.previous,t);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class KeyUsage extends XFAObject{constructor(e){super(Kl,"keyUsage");const t=["","yes","no"];this.crlSign=getStringOption(e.crlSign,t);this.dataEncipherment=getStringOption(e.dataEncipherment,t);this.decipherOnly=getStringOption(e.decipherOnly,t);this.digitalSignature=getStringOption(e.digitalSignature,t);this.encipherOnly=getStringOption(e.encipherOnly,t);this.id=e.id||"";this.keyAgreement=getStringOption(e.keyAgreement,t);this.keyCertSign=getStringOption(e.keyCertSign,t);this.keyEncipherment=getStringOption(e.keyEncipherment,t);this.nonRepudiation=getStringOption(e.nonRepudiation,t);this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Line extends XFAObject{constructor(e){super(Kl,"line",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.slope=getStringOption(e.slope,["\\","/"]);this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null}[ol](){const e=this[So]()[So](),t=this.edge||new Edge({}),a=t[fl](),n=Object.create(null),s="visible"===t.presence?t.thickness:0;n.strokeWidth=measureToString(s);n.stroke=a.color;let r,i,o,l,f="100%",c="100%";if(e.w<=s){[r,i,o,l]=["50%",0,"50%","100%"];f=n.strokeWidth}else if(e.h<=s){[r,i,o,l]=[0,"50%","100%","50%"];c=n.strokeWidth}else"\\"===this.slope?[r,i,o,l]=[0,0,"100%","100%"]:[r,i,o,l]=[0,"100%","100%",0];const h={name:"svg",children:[{name:"line",attributes:{xmlns:Gl,x1:r,y1:i,x2:o,y2:l,style:n}}],attributes:{xmlns:Gl,width:f,height:c,style:{overflow:"visible"}}};if(hasMargin(e))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[h]});h.attributes.style.position="absolute";return HTMLResult.success(h)}}class Linear extends XFAObject{constructor(e){super(Kl,"linear",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toRight","toBottom","toLeft","toTop"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](e){e=e?e[fl]():"#FFFFFF";return`linear-gradient(${this.type.replace(/([RBLT])/," $1").toLowerCase()}, ${e}, ${this.color?this.color[fl]():"#000000"})`}}class LockDocument extends ContentObject{constructor(e){super(Kl,"lockDocument");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}[lo](){this[so]=getStringOption(this[so],["auto","0","1"])}}class Manifest extends XFAObject{constructor(e){super(Kl,"manifest",!0);this.action=getStringOption(e.action,["include","all","exclude"]);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.ref=new XFAObjectArray}}class Margin extends XFAObject{constructor(e){super(Kl,"margin",!0);this.bottomInset=getMeasurement(e.bottomInset,"0");this.id=e.id||"";this.leftInset=getMeasurement(e.leftInset,"0");this.rightInset=getMeasurement(e.rightInset,"0");this.topInset=getMeasurement(e.topInset,"0");this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[fl](){return{margin:measureToString(this.topInset)+" "+measureToString(this.rightInset)+" "+measureToString(this.bottomInset)+" "+measureToString(this.leftInset)}}}class Mdp extends XFAObject{constructor(e){super(Kl,"mdp");this.id=e.id||"";this.permissions=getInteger({data:e.permissions,defaultValue:2,validate:e=>1===e||3===e});this.signatureType=getStringOption(e.signatureType,["filler","author"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Medium extends XFAObject{constructor(e){super(Kl,"medium");this.id=e.id||"";this.imagingBBox=function getBBox(e){const t=-1;if(!e)return{x:t,y:t,width:t,height:t};const a=e.split(",",4).map(e=>getMeasurement(e.trim(),"-1"));if(a.length<4||a[2]<0||a[3]<0)return{x:t,y:t,width:t,height:t};const[n,s,r,i]=a;return{x:n,y:s,width:r,height:i}}(e.imagingBBox);this.long=getMeasurement(e.long);this.orientation=getStringOption(e.orientation,["portrait","landscape"]);this.short=getMeasurement(e.short);this.stock=e.stock||"";this.trayIn=getStringOption(e.trayIn,["auto","delegate","pageFront"]);this.trayOut=getStringOption(e.trayOut,["auto","delegate"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Message extends XFAObject{constructor(e){super(Kl,"message",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.text=new XFAObjectArray}}class NumericEdit extends XFAObject{constructor(e){super(Kl,"numericEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[ol](e){const t=toStyle(this,"border","font","margin"),a=this[So]()[So](),n={name:"input",attributes:{type:"text",fieldId:a[cl],dataId:a[ro]?.[cl]||a[cl],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Occur extends XFAObject{constructor(e){super(Kl,"occur",!0);this.id=e.id||"";this.initial=""!==e.initial?getInteger({data:e.initial,defaultValue:"",validate:e=>!0}):"";this.max=""!==e.max?getInteger({data:e.max,defaultValue:-1,validate:e=>!0}):"";this.min=""!==e.min?getInteger({data:e.min,defaultValue:1,validate:e=>!0}):"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[Zi](){const e=this[So](),t=this.min;""===this.min&&(this.min=e instanceof PageArea||e instanceof PageSet?0:1);""===this.max&&(this.max=""===t?e instanceof PageArea||e instanceof PageSet?-1:1:this.min);-1!==this.max&&this.max!0});this.name=e.name||"";this.numbered=getInteger({data:e.numbered,defaultValue:1,validate:e=>!0});this.oddOrEven=getStringOption(e.oddOrEven,["any","even","odd"]);this.pagePosition=getStringOption(e.pagePosition,["any","first","last","only","rest"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.desc=null;this.extras=null;this.medium=null;this.occur=null;this.area=new XFAObjectArray;this.contentArea=new XFAObjectArray;this.draw=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray}[_o](){if(!this[oo]){this[oo]={numberOfUse:0};return!0}return!this.occur||-1===this.occur.max||this[oo].numberOfUsee.oddOrEven===t&&e.pagePosition===a);if(n)return n;n=this.pageArea.children.find(e=>"any"===e.oddOrEven&&e.pagePosition===a);if(n)return n;n=this.pageArea.children.find(e=>"any"===e.oddOrEven&&"any"===e.pagePosition);return n||this.pageArea.children[0]}}class Para extends XFAObject{constructor(e){super(Kl,"para",!0);this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.lineHeight=e.lineHeight?getMeasurement(e.lineHeight,"0pt"):"";this.marginLeft=e.marginLeft?getMeasurement(e.marginLeft,"0pt"):"";this.marginRight=e.marginRight?getMeasurement(e.marginRight,"0pt"):"";this.orphans=getInteger({data:e.orphans,defaultValue:0,validate:e=>e>=0});this.preserve=e.preserve||"";this.radixOffset=e.radixOffset?getMeasurement(e.radixOffset,"0pt"):"";this.spaceAbove=e.spaceAbove?getMeasurement(e.spaceAbove,"0pt"):"";this.spaceBelow=e.spaceBelow?getMeasurement(e.spaceBelow,"0pt"):"";this.tabDefault=e.tabDefault?getMeasurement(this.tabDefault):"";this.tabStops=(e.tabStops||"").trim().split(/\s+/).map((e,t)=>t%2==1?getMeasurement(e):e);this.textIndent=e.textIndent?getMeasurement(e.textIndent,"0pt"):"";this.use=e.use||"";this.usehref=e.usehref||"";this.vAlign=getStringOption(e.vAlign,["top","bottom","middle"]);this.widows=getInteger({data:e.widows,defaultValue:0,validate:e=>e>=0});this.hyphenation=null}[fl](){const e=toStyle(this,"hAlign");""!==this.marginLeft&&(e.paddingLeft=measureToString(this.marginLeft));""!==this.marginRight&&(e.paddingRight=measureToString(this.marginRight));""!==this.spaceAbove&&(e.paddingTop=measureToString(this.spaceAbove));""!==this.spaceBelow&&(e.paddingBottom=measureToString(this.spaceBelow));if(""!==this.textIndent){e.textIndent=measureToString(this.textIndent);fixTextIndent(e)}this.lineHeight>0&&(e.lineHeight=measureToString(this.lineHeight));""!==this.tabDefault&&(e.tabSize=measureToString(this.tabDefault));this.tabStops.length;this.hyphenatation&&Object.assign(e,this.hyphenatation[fl]());return e}}class PasswordEdit extends XFAObject{constructor(e){super(Kl,"passwordEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.passwordChar=e.passwordChar||"*";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}}class template_Pattern extends XFAObject{constructor(e){super(Kl,"pattern",!0);this.id=e.id||"";this.type=getStringOption(e.type,["crossHatch","crossDiagonal","diagonalLeft","diagonalRight","horizontal","vertical"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](e){e=e?e[fl]():"#FFFFFF";const t=this.color?this.color[fl]():"#000000",a="repeating-linear-gradient",n=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${a}(to top,${n}) ${a}(to right,${n})`;case"crossDiagonal":return`${a}(45deg,${n}) ${a}(-45deg,${n})`;case"diagonalLeft":return`${a}(45deg,${n})`;case"diagonalRight":return`${a}(-45deg,${n})`;case"horizontal":return`${a}(to top,${n})`;case"vertical":return`${a}(to right,${n})`}return""}}class Picture extends StringObject{constructor(e){super(Kl,"picture");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Proto extends XFAObject{constructor(e){super(Kl,"proto",!0);this.appearanceFilter=new XFAObjectArray;this.arc=new XFAObjectArray;this.area=new XFAObjectArray;this.assist=new XFAObjectArray;this.barcode=new XFAObjectArray;this.bindItems=new XFAObjectArray;this.bookend=new XFAObjectArray;this.boolean=new XFAObjectArray;this.border=new XFAObjectArray;this.break=new XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.button=new XFAObjectArray;this.calculate=new XFAObjectArray;this.caption=new XFAObjectArray;this.certificate=new XFAObjectArray;this.certificates=new XFAObjectArray;this.checkButton=new XFAObjectArray;this.choiceList=new XFAObjectArray;this.color=new XFAObjectArray;this.comb=new XFAObjectArray;this.connect=new XFAObjectArray;this.contentArea=new XFAObjectArray;this.corner=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.dateTimeEdit=new XFAObjectArray;this.decimal=new XFAObjectArray;this.defaultUi=new XFAObjectArray;this.desc=new XFAObjectArray;this.digestMethod=new XFAObjectArray;this.digestMethods=new XFAObjectArray;this.draw=new XFAObjectArray;this.edge=new XFAObjectArray;this.encoding=new XFAObjectArray;this.encodings=new XFAObjectArray;this.encrypt=new XFAObjectArray;this.encryptData=new XFAObjectArray;this.encryption=new XFAObjectArray;this.encryptionMethod=new XFAObjectArray;this.encryptionMethods=new XFAObjectArray;this.event=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.execute=new XFAObjectArray;this.extras=new XFAObjectArray;this.field=new XFAObjectArray;this.fill=new XFAObjectArray;this.filter=new XFAObjectArray;this.float=new XFAObjectArray;this.font=new XFAObjectArray;this.format=new XFAObjectArray;this.handler=new XFAObjectArray;this.hyphenation=new XFAObjectArray;this.image=new XFAObjectArray;this.imageEdit=new XFAObjectArray;this.integer=new XFAObjectArray;this.issuers=new XFAObjectArray;this.items=new XFAObjectArray;this.keep=new XFAObjectArray;this.keyUsage=new XFAObjectArray;this.line=new XFAObjectArray;this.linear=new XFAObjectArray;this.lockDocument=new XFAObjectArray;this.manifest=new XFAObjectArray;this.margin=new XFAObjectArray;this.mdp=new XFAObjectArray;this.medium=new XFAObjectArray;this.message=new XFAObjectArray;this.numericEdit=new XFAObjectArray;this.occur=new XFAObjectArray;this.oid=new XFAObjectArray;this.oids=new XFAObjectArray;this.overflow=new XFAObjectArray;this.pageArea=new XFAObjectArray;this.pageSet=new XFAObjectArray;this.para=new XFAObjectArray;this.passwordEdit=new XFAObjectArray;this.pattern=new XFAObjectArray;this.picture=new XFAObjectArray;this.radial=new XFAObjectArray;this.reason=new XFAObjectArray;this.reasons=new XFAObjectArray;this.rectangle=new XFAObjectArray;this.ref=new XFAObjectArray;this.script=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.signData=new XFAObjectArray;this.signature=new XFAObjectArray;this.signing=new XFAObjectArray;this.solid=new XFAObjectArray;this.speak=new XFAObjectArray;this.stipple=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray;this.subjectDN=new XFAObjectArray;this.subjectDNs=new XFAObjectArray;this.submit=new XFAObjectArray;this.text=new XFAObjectArray;this.textEdit=new XFAObjectArray;this.time=new XFAObjectArray;this.timeStamp=new XFAObjectArray;this.toolTip=new XFAObjectArray;this.traversal=new XFAObjectArray;this.traverse=new XFAObjectArray;this.ui=new XFAObjectArray;this.validate=new XFAObjectArray;this.value=new XFAObjectArray;this.variables=new XFAObjectArray}}class Radial extends XFAObject{constructor(e){super(Kl,"radial",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toEdge","toCenter"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](e){e=e?e[fl]():"#FFFFFF";const t=this.color?this.color[fl]():"#000000";return`radial-gradient(circle at center, ${"toEdge"===this.type?`${e},${t}`:`${t},${e}`})`}}class Reason extends StringObject{constructor(e){super(Kl,"reason");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Reasons extends XFAObject{constructor(e){super(Kl,"reasons",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.reason=new XFAObjectArray}}class Rectangle extends XFAObject{constructor(e){super(Kl,"rectangle",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.fill=null}[ol](){const e=this.edge.children.length?this.edge.children[0]:new Edge({}),t=e[fl](),a=Object.create(null);"visible"===this.fill?.presence?Object.assign(a,this.fill[fl]()):a.fill="transparent";a.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);a.stroke=t.color;const n=(this.corner.children.length?this.corner.children[0]:new Corner({}))[fl](),s={name:"svg",children:[{name:"rect",attributes:{xmlns:Gl,width:"100%",height:"100%",x:0,y:0,rx:n.radius,ry:n.radius,style:a}}],attributes:{xmlns:Gl,style:{overflow:"visible"},width:"100%",height:"100%"}};if(hasMargin(this[So]()[So]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[s]});s.attributes.style.position="absolute";return HTMLResult.success(s)}}class RefElement extends StringObject{constructor(e){super(Kl,"ref");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Script extends StringObject{constructor(e){super(Kl,"script");this.binding=e.binding||"";this.contentType=e.contentType||"";this.id=e.id||"";this.name=e.name||"";this.runAt=getStringOption(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class SetProperty extends XFAObject{constructor(e){super(Kl,"setProperty");this.connection=e.connection||"";this.ref=e.ref||"";this.target=e.target||""}}class SignData extends XFAObject{constructor(e){super(Kl,"signData",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["sign","clear","verify"]);this.ref=e.ref||"";this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Signature extends XFAObject{constructor(e){super(Kl,"signature",!0);this.id=e.id||"";this.type=getStringOption(e.type,["PDF1.3","PDF1.6"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.filter=null;this.manifest=null;this.margin=null}}class Signing extends XFAObject{constructor(e){super(Kl,"signing",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Solid extends XFAObject{constructor(e){super(Kl,"solid",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[fl](e){return e?e[fl]():"#FFFFFF"}}class Speak extends StringObject{constructor(e){super(Kl,"speak");this.disable=getInteger({data:e.disable,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.priority=getStringOption(e.priority,["custom","caption","name","toolTip"]);this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Stipple extends XFAObject{constructor(e){super(Kl,"stipple",!0);this.id=e.id||"";this.rate=getInteger({data:e.rate,defaultValue:50,validate:e=>e>=0&&e<=100});this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[fl](e){const t=this.rate/100;return Util.makeHexColor(Math.round(e.value.r*(1-t)+this.value.r*t),Math.round(e.value.g*(1-t)+this.value.g*t),Math.round(e.value.b*(1-t)+this.value.b*t))}}class Subform extends XFAObject{constructor(e){super(Kl,"subform",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.allowMacro=getInteger({data:e.allowMacro,defaultValue:0,validate:e=>1===e});this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.columnWidths=(e.columnWidths||"").trim().split(/\s+/).map(e=>"-1"===e?-1:getMeasurement(e));this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.mergeMode=getStringOption(e.mergeMode,["consumeData","matchTemplate"]);this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.restoreState=getStringOption(e.restoreState,["manual","auto"]);this.scope=getStringOption(e.scope,["name","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.bookend=null;this.border=null;this.break=null;this.calculate=null;this.desc=null;this.extras=null;this.keep=null;this.margin=null;this.occur=null;this.overflow=null;this.pageSet=null;this.para=null;this.traversal=null;this.validate=null;this.variables=null;this.area=new XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.connect=new XFAObjectArray;this.draw=new XFAObjectArray;this.event=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.proto=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}[vo](){const e=this[So]();return e instanceof SubformSet?e[vo]():e}[Ho](){return!0}[Po](){return this.layout.endsWith("-tb")&&0===this[oo].attempt&&this[oo].numberInLine>0||this[So]()[Po]()}*[yo](){yield*getContainedChildren(this)}[fo](){return flushHTML(this)}[Yi](e,t){addHTML(this,e,t)}[uo](){return getAvailableSpace(this)}[No](){const e=this[vo]();if(!e[No]())return!1;if(void 0!==this[oo]._isSplittable)return this[oo]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[oo]._isSplittable=!1;return!1}if(this.keep&&"none"!==this.keep.intact){this[oo]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[oo].numberInLine)return!1;this[oo]._isSplittable=!0;return!0}[ol](e){setTabIndex(this);if(this.break){if("auto"!==this.break.after||""!==this.break.afterTarget){const e=new BreakAfter({targetType:this.break.after,target:this.break.afterTarget,startNew:this.break.startNew.toString()});e[xo]=this[xo];this[Ji](e);this.breakAfter.push(e)}if("auto"!==this.break.before||""!==this.break.beforeTarget){const e=new BreakBefore({targetType:this.break.before,target:this.break.beforeTarget,startNew:this.break.startNew.toString()});e[xo]=this[xo];this[Ji](e);this.breakBefore.push(e)}if(""!==this.break.overflowTarget){const e=new Overflow({target:this.break.overflowTarget,leader:this.break.overflowLeader,trailer:this.break.overflowTrailer});e[xo]=this[xo];this[Ji](e);this.overflow.push(e)}this[Jo](this.break);this.break=null}if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;(this.breakBefore.children.length>1||this.breakAfter.children.length>1)&&warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");if(this.breakBefore.children.length>=1){const e=this.breakBefore.children[0];if(handleBreak(e))return HTMLResult.breakNode(e)}if(this[oo]?.afterBreakAfter)return HTMLResult.EMPTY;fixDimensions(this);const t=[],a={id:this[cl],class:[]};setAccess(this,a.class);this[oo]||=Object.create(null);Object.assign(this[oo],{children:t,line:null,attributes:a,attempt:0,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[Ao](),s=n[oo].noLayoutFailure,r=this[No]();r||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const i=new Set(["area","draw","exclGroup","field","subform","subformSet"]);if(this.layout.includes("row")){const e=this[vo]().columnWidths;if(Array.isArray(e)&&e.length>0){this[oo].columnWidths=e;this[oo].currentColumn=0}}const o=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),l=["xfaSubform"],f=layoutClass(this);f&&l.push(f);a.style=o;a.class=l;this.name&&(a.xfaName=this.name);if(this.overflow){const t=this.overflow[wo]();if(t.addLeader){t.addLeader=!1;handleOverflow(this,t.leader,e)}}this[Yo]();const c="lr-tb"===this.layout||"rl-tb"===this.layout,h=c?2:1;for(;this[oo].attempt=1){const e=this.breakAfter.children[0];if(handleBreak(e)){this[oo].afterBreakAfter=w;return HTMLResult.breakNode(e)}}delete this[oo];return w}}class SubformSet extends XFAObject{constructor(e){super(Kl,"subformSet",!0);this.id=e.id||"";this.name=e.name||"";this.relation=getStringOption(e.relation,["ordered","choice","unordered"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.bookend=null;this.break=null;this.desc=null;this.extras=null;this.occur=null;this.overflow=null;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[yo](){yield*getContainedChildren(this)}[vo](){let e=this[So]();for(;!(e instanceof Subform);)e=e[So]();return e}[Ho](){return!0}}class SubjectDN extends ContentObject{constructor(e){super(Kl,"subjectDN");this.delimiter=e.delimiter||",";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){this[so]=new Map(this[so].split(this.delimiter).map(e=>{(e=e.split("=",2))[0]=e[0].trim();return e}))}}class SubjectDNs extends XFAObject{constructor(e){super(Kl,"subjectDNs",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.subjectDN=new XFAObjectArray}}class Submit extends XFAObject{constructor(e){super(Kl,"submit",!0);this.embedPDF=getInteger({data:e.embedPDF,defaultValue:0,validate:e=>1===e});this.format=getStringOption(e.format,["xdp","formdata","pdf","urlencoded","xfd","xml"]);this.id=e.id||"";this.target=e.target||"";this.textEncoding=getKeyword({data:e.textEncoding?e.textEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.use=e.use||"";this.usehref=e.usehref||"";this.xdpContent=e.xdpContent||"";this.encrypt=null;this.encryptData=new XFAObjectArray;this.signData=new XFAObjectArray}}class Template extends XFAObject{constructor(e){super(Kl,"template",!0);this.baseProfile=getStringOption(e.baseProfile,["full","interactiveForms"]);this.extras=null;this.subform=new XFAObjectArray}[lo](){0===this.subform.children.length&&warn("XFA - No subforms in template node.");this.subform.children.length>=2&&warn("XFA - Several subforms in template node: please file a bug.");this[sl]=5e3}[No](){return!0}[el](e,t){return e.startsWith("#")?[this[Io].get(e.slice(1))]:searchNode(this,t,e,!0,!0)}*[il](){if(!this.subform.children.length)return HTMLResult.success({name:"div",children:[]});this[oo]={overflowNode:null,firstUnsplittable:null,currentContentArea:null,currentPageArea:null,noLayoutFailure:!1,pageNumber:1,pagePosition:"first",oddOrEven:"odd",blankOrNotBlank:"nonBlank",paraStack:[]};const e=this.subform.children[0];e.pageSet[eo]();const t=e.pageSet.pageArea.children,a={name:"div",children:[]};let n=null,s=null,r=null;if(e.breakBefore.children.length>=1){s=e.breakBefore.children[0];r=s.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){s=e.subform.children[0].breakBefore.children[0];r=s.target}else if(e.break?.beforeTarget){s=e.break;r=s.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break?.beforeTarget){s=e.subform.children[0].break;r=s.beforeTarget}if(s){const e=this[el](r,s[So]());if(e instanceof PageArea){n=e;s[oo]={}}}n||=t[0];n[oo]={numberOfUse:1};const i=n[So]();i[oo]={numberOfUse:1,pageIndex:i.pageArea.children.indexOf(n),pageSetIndex:0};let o,l=null,f=null,c=!0,h=0,u=0;for(;;){if(c)h=0;else{a.children.pop();if(3===++h){warn("XFA - Something goes wrong: please file a bug.");return a}}o=null;this[oo].currentPageArea=n;const t=n[ol]().html;a.children.push(t);if(l){this[oo].noLayoutFailure=!0;t.children.push(l[ol](n[oo].space).html);l=null}if(f){this[oo].noLayoutFailure=!0;t.children.push(f[ol](n[oo].space).html);f=null}const s=n.contentArea.children,r=t.children.filter(e=>e.attributes.class.includes("xfaContentarea"));c=!1;this[oo].firstUnsplittable=null;this[oo].noLayoutFailure=!1;const flush=t=>{const a=e[fo]();if(a){c||=a.children?.length>0;r[t].children.push(a)}};for(let t=u,n=s.length;t0;r[t].children.push(h.html)}else!c&&a.children.length>1&&a.children.pop();return a}if(h.isBreak()){const e=h.breakNode;flush(t);if("auto"===e.targetType)continue;if(e.leader){l=this[el](e.leader,e[So]());l=l?l[0]:null}if(e.trailer){f=this[el](e.trailer,e[So]());f=f?f[0]:null}if("pageArea"===e.targetType){o=e[oo].target;t=1/0}else if(e[oo].target){o=e[oo].target;u=e[oo].index+1;t=1/0}else t=e[oo].index;continue}if(this[oo].overflowNode){const e=this[oo].overflowNode;this[oo].overflowNode=null;const a=e[wo](),n=a.target;a.addLeader=null!==a.leader;a.addTrailer=null!==a.trailer;flush(t);const r=t;t=1/0;if(n instanceof PageArea)o=n;else if(n instanceof ContentArea){const e=s.indexOf(n);if(-1!==e)e>r?t=e-1:u=e;else{o=n[So]();u=o.contentArea.children.indexOf(n)}}continue}flush(t)}this[oo].pageNumber+=1;o&&(o[_o]()?o[oo].numberOfUse+=1:o=null);n=o||n[qo]();yield null}}}class Text extends ContentObject{constructor(e){super(Kl,"text");this.id=e.id||"";this.maxChars=getInteger({data:e.maxChars,defaultValue:0,validate:e=>e>=0});this.name=e.name||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}[$i](){return!0}[Wo](e){if(e[Lo]===ul.xhtml.id){this[so]=e;return!0}warn(`XFA - Invalid content in Text: ${e[Uo]}.`);return!1}[Go](e){this[so]instanceof XFAObject||super[Go](e)}[lo](){"string"==typeof this[so]&&(this[so]=this[so].replaceAll("\r\n","\n"))}[wo](){return"string"==typeof this[so]?this[so].split(/[\u2029\u2028\n]/).filter(e=>!!e).join("\n"):this[so][rl]()}[ol](e){if("string"==typeof this[so]){const e=valueToHtml(this[so]).html;if(this[so].includes("\u2029")){e.name="div";e.children=[];this[so].split("\u2029").map(e=>e.split(/[\u2028\n]/).flatMap(e=>[{name:"span",value:e},{name:"br"}])).forEach(t=>{e.children.push({name:"p",children:t})})}else if(/[\u2028\n]/.test(this[so])){e.name="div";e.children=[];this[so].split(/[\u2028\n]/).forEach(t=>{e.children.push({name:"span",value:t},{name:"br"})})}return HTMLResult.success(e)}return this[so][ol](e)}}class TextEdit extends XFAObject{constructor(e){super(Kl,"textEdit",!0);this.allowRichText=getInteger({data:e.allowRichText,defaultValue:0,validate:e=>1===e});this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.multiLine=getInteger({data:e.multiLine,defaultValue:"",validate:e=>0===e||1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.vScrollPolicy=getStringOption(e.vScrollPolicy,["auto","off","on"]);this.border=null;this.comb=null;this.extras=null;this.margin=null}[ol](e){const t=toStyle(this,"border","font","margin");let a;const n=this[So]()[So]();""===this.multiLine&&(this.multiLine=n instanceof Draw?1:0);a=1===this.multiLine?{name:"textarea",attributes:{dataId:n[ro]?.[cl]||n[cl],fieldId:n[cl],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:n[ro]?.[cl]||n[cl],fieldId:n[cl],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}};if(isRequired(n)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Time extends StringObject{constructor(e){super(Kl,"time");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[lo](){const e=this[so].trim();this[so]=e?new Date(e):null}[ol](e){return valueToHtml(this[so]?this[so].toString():"")}}class TimeStamp extends XFAObject{constructor(e){super(Kl,"timeStamp");this.id=e.id||"";this.server=e.server||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class ToolTip extends StringObject{constructor(e){super(Kl,"toolTip");this.id=e.id||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Traversal extends XFAObject{constructor(e){super(Kl,"traversal",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.traverse=new XFAObjectArray}}class Traverse extends XFAObject{constructor(e){super(Kl,"traverse",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["next","back","down","first","left","right","up"]);this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.script=null}get name(){return this.operation}[Eo](){return!1}}class Ui extends XFAObject{constructor(e){super(Kl,"ui",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null;this.barcode=null;this.button=null;this.checkButton=null;this.choiceList=null;this.dateTimeEdit=null;this.defaultUi=null;this.imageEdit=null;this.numericEdit=null;this.passwordEdit=null;this.signature=null;this.textEdit=null}[wo](){if(void 0===this[oo]){for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"picture"===e)continue;const t=this[e];if(t instanceof XFAObject){this[oo]=t;return t}}this[oo]=null}return this[oo]}[ol](e){const t=this[wo]();return t?t[ol](e):HTMLResult.EMPTY}}class Validate extends XFAObject{constructor(e){super(Kl,"validate",!0);this.formatTest=getStringOption(e.formatTest,["warning","disabled","error"]);this.id=e.id||"";this.nullTest=getStringOption(e.nullTest,["disabled","error","warning"]);this.scriptTest=getStringOption(e.scriptTest,["error","disabled","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.picture=null;this.script=null}}class Value extends XFAObject{constructor(e){super(Kl,"value",!0);this.id=e.id||"";this.override=getInteger({data:e.override,defaultValue:0,validate:e=>1===e});this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.arc=null;this.boolean=null;this.date=null;this.dateTime=null;this.decimal=null;this.exData=null;this.float=null;this.image=null;this.integer=null;this.line=null;this.rectangle=null;this.text=null;this.time=null}[nl](e){const t=this[So]();if(t instanceof Field&&t.ui?.imageEdit){if(!this.image){this.image=new Image({});this[Ji](this.image)}this.image[so]=e[so];return}const a=e[Uo];if(null===this[a]){for(const e of Object.getOwnPropertyNames(this)){const t=this[e];if(t instanceof XFAObject){this[e]=null;this[Jo](t)}}this[e[Uo]]=e;this[Ji](e)}else this[a][so]=e[so]}[rl](){if(this.exData)return"string"==typeof this.exData[so]?this.exData[so].trim():this.exData[so][rl]().trim();for(const e of Object.getOwnPropertyNames(this)){if("image"===e)continue;const t=this[e];if(t instanceof XFAObject)return(t[so]||"").toString().trim()}return null}[ol](e){for(const t of Object.getOwnPropertyNames(this)){const a=this[t];if(a instanceof XFAObject)return a[ol](e)}return HTMLResult.EMPTY}}class Variables extends XFAObject{constructor(e){super(Kl,"variables",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.manifest=new XFAObjectArray;this.script=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[Eo](){return!0}}class TemplateNamespace{static[hl](e,t){if(Object.hasOwn(TemplateNamespace,e)){const a=TemplateNamespace[e](t);a[al](t);return a}}static appearanceFilter(e){return new AppearanceFilter(e)}static arc(e){return new Arc(e)}static area(e){return new Area(e)}static assist(e){return new Assist(e)}static barcode(e){return new Barcode(e)}static bind(e){return new Bind(e)}static bindItems(e){return new BindItems(e)}static bookend(e){return new Bookend(e)}static boolean(e){return new BooleanElement(e)}static border(e){return new Border(e)}static break(e){return new Break(e)}static breakAfter(e){return new BreakAfter(e)}static breakBefore(e){return new BreakBefore(e)}static button(e){return new Button(e)}static calculate(e){return new Calculate(e)}static caption(e){return new Caption(e)}static certificate(e){return new Certificate(e)}static certificates(e){return new Certificates(e)}static checkButton(e){return new CheckButton(e)}static choiceList(e){return new ChoiceList(e)}static color(e){return new Color(e)}static comb(e){return new Comb(e)}static connect(e){return new Connect(e)}static contentArea(e){return new ContentArea(e)}static corner(e){return new Corner(e)}static date(e){return new DateElement(e)}static dateTime(e){return new DateTime(e)}static dateTimeEdit(e){return new DateTimeEdit(e)}static decimal(e){return new Decimal(e)}static defaultUi(e){return new DefaultUi(e)}static desc(e){return new Desc(e)}static digestMethod(e){return new DigestMethod(e)}static digestMethods(e){return new DigestMethods(e)}static draw(e){return new Draw(e)}static edge(e){return new Edge(e)}static encoding(e){return new Encoding(e)}static encodings(e){return new Encodings(e)}static encrypt(e){return new Encrypt(e)}static encryptData(e){return new EncryptData(e)}static encryption(e){return new Encryption(e)}static encryptionMethod(e){return new EncryptionMethod(e)}static encryptionMethods(e){return new EncryptionMethods(e)}static event(e){return new Event(e)}static exData(e){return new ExData(e)}static exObject(e){return new ExObject(e)}static exclGroup(e){return new ExclGroup(e)}static execute(e){return new Execute(e)}static extras(e){return new Extras(e)}static field(e){return new Field(e)}static fill(e){return new Fill(e)}static filter(e){return new Filter(e)}static float(e){return new Float(e)}static font(e){return new template_Font(e)}static format(e){return new Format(e)}static handler(e){return new Handler(e)}static hyphenation(e){return new Hyphenation(e)}static image(e){return new Image(e)}static imageEdit(e){return new ImageEdit(e)}static integer(e){return new Integer(e)}static issuers(e){return new Issuers(e)}static items(e){return new Items(e)}static keep(e){return new Keep(e)}static keyUsage(e){return new KeyUsage(e)}static line(e){return new Line(e)}static linear(e){return new Linear(e)}static lockDocument(e){return new LockDocument(e)}static manifest(e){return new Manifest(e)}static margin(e){return new Margin(e)}static mdp(e){return new Mdp(e)}static medium(e){return new Medium(e)}static message(e){return new Message(e)}static numericEdit(e){return new NumericEdit(e)}static occur(e){return new Occur(e)}static oid(e){return new Oid(e)}static oids(e){return new Oids(e)}static overflow(e){return new Overflow(e)}static pageArea(e){return new PageArea(e)}static pageSet(e){return new PageSet(e)}static para(e){return new Para(e)}static passwordEdit(e){return new PasswordEdit(e)}static pattern(e){return new template_Pattern(e)}static picture(e){return new Picture(e)}static proto(e){return new Proto(e)}static radial(e){return new Radial(e)}static reason(e){return new Reason(e)}static reasons(e){return new Reasons(e)}static rectangle(e){return new Rectangle(e)}static ref(e){return new RefElement(e)}static script(e){return new Script(e)}static setProperty(e){return new SetProperty(e)}static signData(e){return new SignData(e)}static signature(e){return new Signature(e)}static signing(e){return new Signing(e)}static solid(e){return new Solid(e)}static speak(e){return new Speak(e)}static stipple(e){return new Stipple(e)}static subform(e){return new Subform(e)}static subformSet(e){return new SubformSet(e)}static subjectDN(e){return new SubjectDN(e)}static subjectDNs(e){return new SubjectDNs(e)}static submit(e){return new Submit(e)}static template(e){return new Template(e)}static text(e){return new Text(e)}static textEdit(e){return new TextEdit(e)}static time(e){return new Time(e)}static timeStamp(e){return new TimeStamp(e)}static toolTip(e){return new ToolTip(e)}static traversal(e){return new Traversal(e)}static traverse(e){return new Traverse(e)}static ui(e){return new Ui(e)}static validate(e){return new Validate(e)}static value(e){return new Value(e)}static variables(e){return new Variables(e)}}const Jl=ul.datasets.id;function createText(e){const t=new Text({});t[so]=e;return t}class Binder{constructor(e){this.root=e;this.datasets=e.datasets;this.data=e.datasets?.data||new XmlObject(ul.datasets.id,"data");this.emptyMerge=0===this.data[ko]().length;this.root.form=this.form=e.template[ao]()}_isConsumeData(){return!this.emptyMerge&&this._mergeMode}_isMatchTemplate(){return!this._isConsumeData()}bind(){this._bindElement(this.form,this.data);return this.form}getData(){return this.data}_bindValue(e,t,a){e[ro]=t;if(e[Co]())if(t[Bo]()){const a=t[bo]();e[nl](createText(a))}else if(e instanceof Field&&"multiSelect"===e.ui?.choiceList?.open){const a=t[ko]().map(e=>e[so].trim()).join("\n");e[nl](createText(a))}else this._isConsumeData()&&warn("XFA - Nodes haven't the same type.");else!t[Bo]()||this._isMatchTemplate()?this._bindElement(e,t):warn("XFA - Nodes haven't the same type.")}_findDataByNameToConsume(e,t,a,n){if(!e)return null;let s,r;for(let n=0;n<3;n++){s=a[jo](e,!1,!0);for(;;){r=s.next().value;if(!r)break;if(t===r[Bo]())return r}if(a[Lo]===ul.datasets.id&&"data"===a[Uo])break;a=a[So]()}if(!n)return null;s=this.data[jo](e,!0,!1);r=s.next().value;if(r)return r;s=this.data[co](e,!0);r=s.next().value;return r?.[Bo]()?r:null}_setProperties(e,t){if(Object.hasOwn(e,"setProperty"))for(const{ref:a,target:n,connection:s}of e.setProperty.children){if(s)continue;if(!a)continue;const r=searchNode(this.root,t,a,!1,!1);if(!r){warn(`XFA - Invalid reference: ${a}.`);continue}const[i]=r;if(!i[Do](this.data)){warn("XFA - Invalid node: must be a data node.");continue}const o=searchNode(this.root,e,n,!1,!1);if(!o){warn(`XFA - Invalid target: ${n}.`);continue}const[l]=o;if(!l[Do](e)){warn("XFA - Invalid target: must be a property or subproperty.");continue}const f=l[So]();if(l instanceof SetProperty||f instanceof SetProperty){warn("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(l instanceof BindItems||f instanceof BindItems){warn("XFA - Invalid target: cannot be a bindItems or one of its properties.");continue}const c=i[rl](),h=l[Uo];if(l instanceof XFAAttribute){const e=Object.create(null);e[h]=c;const t=Reflect.construct(Object.getPrototypeOf(f).constructor,[e]);f[h]=t[h];continue}if(Object.hasOwn(l,so)){l[ro]=i;l[so]=c;l[lo]()}else warn("XFA - Invalid node to use in setProperty")}}_bindItems(e,t){if(!Object.hasOwn(e,"items")||!Object.hasOwn(e,"bindItems")||e.bindItems.isEmpty())return;for(const t of e.items.children)e[Jo](t);e.items.clear();const a=new Items({}),n=new Items({});e[Ji](a);e.items.push(a);e[Ji](n);e.items.push(n);for(const{ref:s,labelRef:r,valueRef:i,connection:o}of e.bindItems.children){if(o)continue;if(!s)continue;const e=searchNode(this.root,t,s,!1,!1);if(e)for(const t of e){if(!t[Do](this.datasets)){warn(`XFA - Invalid ref (${s}): must be a datasets child.`);continue}const e=searchNode(this.root,t,r,!0,!1);if(!e){warn(`XFA - Invalid label: ${r}.`);continue}const[o]=e;if(!o[Do](this.datasets)){warn("XFA - Invalid label: must be a datasets child.");continue}const l=searchNode(this.root,t,i,!0,!1);if(!l){warn(`XFA - Invalid value: ${i}.`);continue}const[f]=l;if(!f[Do](this.datasets)){warn("XFA - Invalid value: must be a datasets child.");continue}const c=createText(o[rl]()),h=createText(f[rl]());a[Ji](c);a.text.push(c);n[Ji](h);n.text.push(h)}else warn(`XFA - Invalid reference: ${s}.`)}}_bindOccurrences(e,t,a){let n;if(t.length>1){n=e[ao]();n[Jo](n.occur);n.occur=null}this._bindValue(e,t[0],a);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const s=e[So](),r=e[Uo],i=s[Fo](e);for(let e=1,o=t.length;et.name===e.name).length:a[n].children.length;const r=a[Fo](e)+1,i=t.initial-s;if(i){const t=e[ao]();t[Jo](t.occur);t.occur=null;a[n].push(t);a[Oo](r,t);for(let e=1;e0)this._bindOccurrences(n,[e[0]],null);else if(this.emptyMerge){const e=t[Lo]===Jl?-1:t[Lo],a=n[ro]=new XmlObject(e,n.name||"root");t[Ji](a);this._bindElement(n,a)}continue}if(!n[Ho]())continue;let e=!1,s=null,r=null,i=null;if(n.bind){switch(n.bind.match){case"none":this._setAndBind(n,t);continue;case"global":e=!0;break;case"dataRef":if(!n.bind.ref){warn(`XFA - ref is empty in node ${n[Uo]}.`);this._setAndBind(n,t);continue}r=n.bind.ref}n.bind.picture&&(s=n.bind.picture[so])}const[o,l]=this._getOccurInfo(n);if(r){i=searchNode(this.root,t,r,!0,!1);if(null===i){i=createDataNode(this.data,t,r);if(!i)continue;this._isConsumeData()&&(i[no]=!0);this._setAndBind(n,i);continue}this._isConsumeData()&&(i=i.filter(e=>!e[no]));i.length>l?i=i.slice(0,l):0===i.length&&(i=null);i&&this._isConsumeData()&&i.forEach(e=>{e[no]=!0})}else{if(!n.name){this._setAndBind(n,t);continue}if(this._isConsumeData()){const a=[];for(;a.length0?a:null}else{i=t[jo](n.name,!1,this.emptyMerge).next().value;if(!i){if(0===o){a.push(n);continue}const e=t[Lo]===Jl?-1:t[Lo];i=n[ro]=new XmlObject(e,n.name);this.emptyMerge&&(i[no]=!0);t[Ji](i);this._setAndBind(n,i);continue}this.emptyMerge&&(i[no]=!0);i=[i]}}i?this._bindOccurrences(n,i,s):o>0?this._setAndBind(n,t):a.push(n)}a.forEach(e=>e[So]()[Jo](e))}}class DataHandler{constructor(e,t){this.data=t;this.dataset=e.datasets||null}serialize(e){const t=[[-1,this.data[ko]()]];for(;t.length>0;){const a=t.at(-1),[n,s]=a;if(n+1===s.length){t.pop();continue}const r=s[++a[0]],i=e.get(r[cl]);if(i)r[nl](i);else{const t=r[ho]();for(const a of t.values()){const t=e.get(a[cl]);if(t){a[nl](t);break}}}const o=r[ko]();o.length>0&&t.push([-1,o])}const a=[''];if(this.dataset)for(const e of this.dataset[ko]())"data"!==e[Uo]&&e[ll](a);this.data[ll](a);a.push("");return a.join("")}}const Ql=ul.config.id;class Acrobat extends XFAObject{constructor(e){super(Ql,"acrobat",!0);this.acrobat7=null;this.autoSave=null;this.common=null;this.validate=null;this.validateApprovalSignatures=null;this.submitUrl=new XFAObjectArray}}class Acrobat7 extends XFAObject{constructor(e){super(Ql,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends OptionObject{constructor(e){super(Ql,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends OptionObject{constructor(e){super(Ql,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends Option01{constructor(e){super(Ql,"addSilentPrint")}}class AddViewerPreferences extends Option01{constructor(e){super(Ql,"addViewerPreferences")}}class AdjustData extends Option10{constructor(e){super(Ql,"adjustData")}}class AdobeExtensionLevel extends IntegerObject{constructor(e){super(Ql,"adobeExtensionLevel",0,e=>e>=1&&e<=8)}}class Agent extends XFAObject{constructor(e){super(Ql,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new XFAObjectArray}}class AlwaysEmbed extends ContentObject{constructor(e){super(Ql,"alwaysEmbed")}}class Amd extends StringObject{constructor(e){super(Ql,"amd")}}class config_Area extends XFAObject{constructor(e){super(Ql,"area");this.level=getInteger({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=getStringOption(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends OptionObject{constructor(e){super(Ql,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends OptionObject{constructor(e){super(Ql,"autoSave",["disabled","enabled"])}}class Base extends StringObject{constructor(e){super(Ql,"base")}}class BatchOutput extends XFAObject{constructor(e){super(Ql,"batchOutput");this.format=getStringOption(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends ContentObject{constructor(e){super(Ql,"behaviorOverride")}[lo](){this[so]=new Map(this[so].trim().split(/\s+/).filter(e=>e.includes(":")).map(e=>e.split(":",2)))}}class Cache extends XFAObject{constructor(e){super(Ql,"cache",!0);this.templateCache=null}}class Change extends Option01{constructor(e){super(Ql,"change")}}class Common extends XFAObject{constructor(e){super(Ql,"common",!0);this.data=null;this.locale=null;this.localeSet=null;this.messaging=null;this.suppressBanner=null;this.template=null;this.validationMessaging=null;this.versionControl=null;this.log=new XFAObjectArray}}class Compress extends XFAObject{constructor(e){super(Ql,"compress");this.scope=getStringOption(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends Option01{constructor(e){super(Ql,"compressLogicalStructure")}}class CompressObjectStream extends Option10{constructor(e){super(Ql,"compressObjectStream")}}class Compression extends XFAObject{constructor(e){super(Ql,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends XFAObject{constructor(e){super(Ql,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new XFAObjectArray}}class Conformance extends OptionObject{constructor(e){super(Ql,"conformance",["A","B"])}}class ContentCopy extends Option01{constructor(e){super(Ql,"contentCopy")}}class Copies extends IntegerObject{constructor(e){super(Ql,"copies",1,e=>e>=1)}}class Creator extends StringObject{constructor(e){super(Ql,"creator")}}class CurrentPage extends IntegerObject{constructor(e){super(Ql,"currentPage",0,e=>e>=0)}}class Data extends XFAObject{constructor(e){super(Ql,"data",!0);this.adjustData=null;this.attributes=null;this.incrementalLoad=null;this.outputXSL=null;this.range=null;this.record=null;this.startNode=null;this.uri=null;this.window=null;this.xsl=null;this.excludeNS=new XFAObjectArray;this.transform=new XFAObjectArray}}class Debug extends XFAObject{constructor(e){super(Ql,"debug",!0);this.uri=null}}class DefaultTypeface extends ContentObject{constructor(e){super(Ql,"defaultTypeface");this.writingScript=getStringOption(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends OptionObject{constructor(e){super(Ql,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends Option01{constructor(e){super(Ql,"documentAssembly")}}class Driver extends XFAObject{constructor(e){super(Ql,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends OptionObject{constructor(e){super(Ql,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends OptionObject{constructor(e){super(Ql,"dynamicRender",["forbidden","required"])}}class Embed extends Option01{constructor(e){super(Ql,"embed")}}class config_Encrypt extends Option01{constructor(e){super(Ql,"encrypt")}}class config_Encryption extends XFAObject{constructor(e){super(Ql,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends OptionObject{constructor(e){super(Ql,"encryptionLevel",["40bit","128bit"])}}class Enforce extends StringObject{constructor(e){super(Ql,"enforce")}}class Equate extends XFAObject{constructor(e){super(Ql,"equate");this.force=getInteger({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends XFAObject{constructor(e){super(Ql,"equateRange");this.from=e.from||"";this.to=e.to||"";this._unicodeRange=e.unicodeRange||""}get unicodeRange(){const e=[],t=/U\+([0-9a-fA-F]+)/,a=this._unicodeRange;for(let n of a.split(",").map(e=>e.trim()).filter(e=>!!e)){n=n.split("-",2).map(e=>{const a=e.match(t);return a?parseInt(a[1],16):0});1===n.length&&n.push(n[0]);e.push(n)}return shadow(this,"unicodeRange",e)}}class Exclude extends ContentObject{constructor(e){super(Ql,"exclude")}[lo](){this[so]=this[so].trim().split(/\s+/).filter(e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e))}}class ExcludeNS extends StringObject{constructor(e){super(Ql,"excludeNS")}}class FlipLabel extends OptionObject{constructor(e){super(Ql,"flipLabel",["usePrinterSetting","on","off"])}}class config_FontInfo extends XFAObject{constructor(e){super(Ql,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new XFAObjectArray;this.defaultTypeface=new XFAObjectArray;this.neverEmbed=new XFAObjectArray}}class FormFieldFilling extends Option01{constructor(e){super(Ql,"formFieldFilling")}}class GroupParent extends StringObject{constructor(e){super(Ql,"groupParent")}}class IfEmpty extends OptionObject{constructor(e){super(Ql,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends StringObject{constructor(e){super(Ql,"includeXDPContent")}}class IncrementalLoad extends OptionObject{constructor(e){super(Ql,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends Option01{constructor(e){super(Ql,"incrementalMerge")}}class Interactive extends Option01{constructor(e){super(Ql,"interactive")}}class Jog extends OptionObject{constructor(e){super(Ql,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends XFAObject{constructor(e){super(Ql,"labelPrinter",!0);this.name=getStringOption(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends OptionObject{constructor(e){super(Ql,"layout",["paginate","panel"])}}class Level extends IntegerObject{constructor(e){super(Ql,"level",0,e=>e>0)}}class Linearized extends Option01{constructor(e){super(Ql,"linearized")}}class Locale extends StringObject{constructor(e){super(Ql,"locale")}}class LocaleSet extends StringObject{constructor(e){super(Ql,"localeSet")}}class Log extends XFAObject{constructor(e){super(Ql,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends XFAObject{constructor(e){super(Ql,"map",!0);this.equate=new XFAObjectArray;this.equateRange=new XFAObjectArray}}class MediumInfo extends XFAObject{constructor(e){super(Ql,"mediumInfo",!0);this.map=null}}class config_Message extends XFAObject{constructor(e){super(Ql,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends XFAObject{constructor(e){super(Ql,"messaging",!0);this.message=new XFAObjectArray}}class Mode extends OptionObject{constructor(e){super(Ql,"mode",["append","overwrite"])}}class ModifyAnnots extends Option01{constructor(e){super(Ql,"modifyAnnots")}}class MsgId extends IntegerObject{constructor(e){super(Ql,"msgId",1,e=>e>=1)}}class NameAttr extends StringObject{constructor(e){super(Ql,"nameAttr")}}class NeverEmbed extends ContentObject{constructor(e){super(Ql,"neverEmbed")}}class NumberOfCopies extends IntegerObject{constructor(e){super(Ql,"numberOfCopies",null,e=>e>=2&&e<=5)}}class OpenAction extends XFAObject{constructor(e){super(Ql,"openAction",!0);this.destination=null}}class Output extends XFAObject{constructor(e){super(Ql,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends StringObject{constructor(e){super(Ql,"outputBin")}}class OutputXSL extends XFAObject{constructor(e){super(Ql,"outputXSL",!0);this.uri=null}}class Overprint extends OptionObject{constructor(e){super(Ql,"overprint",["none","both","draw","field"])}}class Packets extends StringObject{constructor(e){super(Ql,"packets")}[lo](){"*"!==this[so]&&(this[so]=this[so].trim().split(/\s+/).filter(e=>["config","datasets","template","xfdf","xslt"].includes(e)))}}class PageOffset extends XFAObject{constructor(e){super(Ql,"pageOffset");this.x=getInteger({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=getInteger({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends StringObject{constructor(e){super(Ql,"pageRange")}[lo](){const e=this[so].trim().split(/\s+/).map(e=>parseInt(e,10)),t=[];for(let a=0,n=e.length;a!1)}}class Pcl extends XFAObject{constructor(e){super(Ql,"pcl",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.pageOffset=null;this.staple=null;this.xdc=null}}class Pdf extends XFAObject{constructor(e){super(Ql,"pdf",!0);this.name=e.name||"";this.adobeExtensionLevel=null;this.batchOutput=null;this.compression=null;this.creator=null;this.encryption=null;this.fontInfo=null;this.interactive=null;this.linearized=null;this.openAction=null;this.pdfa=null;this.producer=null;this.renderPolicy=null;this.scriptModel=null;this.silentPrint=null;this.submitFormat=null;this.tagged=null;this.version=null;this.viewerPreferences=null;this.xdc=null}}class Pdfa extends XFAObject{constructor(e){super(Ql,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends XFAObject{constructor(e){super(Ql,"permissions",!0);this.accessibleContent=null;this.change=null;this.contentCopy=null;this.documentAssembly=null;this.formFieldFilling=null;this.modifyAnnots=null;this.plaintextMetadata=null;this.print=null;this.printHighQuality=null}}class PickTrayByPDFSize extends Option01{constructor(e){super(Ql,"pickTrayByPDFSize")}}class config_Picture extends StringObject{constructor(e){super(Ql,"picture")}}class PlaintextMetadata extends Option01{constructor(e){super(Ql,"plaintextMetadata")}}class Presence extends OptionObject{constructor(e){super(Ql,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends XFAObject{constructor(e){super(Ql,"present",!0);this.behaviorOverride=null;this.cache=null;this.common=null;this.copies=null;this.destination=null;this.incrementalMerge=null;this.layout=null;this.output=null;this.overprint=null;this.pagination=null;this.paginationOverride=null;this.script=null;this.validate=null;this.xdp=null;this.driver=new XFAObjectArray;this.labelPrinter=new XFAObjectArray;this.pcl=new XFAObjectArray;this.pdf=new XFAObjectArray;this.ps=new XFAObjectArray;this.submitUrl=new XFAObjectArray;this.webClient=new XFAObjectArray;this.zpl=new XFAObjectArray}}class Print extends Option01{constructor(e){super(Ql,"print")}}class PrintHighQuality extends Option01{constructor(e){super(Ql,"printHighQuality")}}class PrintScaling extends OptionObject{constructor(e){super(Ql,"printScaling",["appdefault","noScaling"])}}class PrinterName extends StringObject{constructor(e){super(Ql,"printerName")}}class Producer extends StringObject{constructor(e){super(Ql,"producer")}}class Ps extends XFAObject{constructor(e){super(Ql,"ps",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.staple=null;this.xdc=null}}class Range extends ContentObject{constructor(e){super(Ql,"range")}[lo](){this[so]=this[so].split(",",2).map(e=>e.split("-").map(e=>parseInt(e.trim(),10))).filter(e=>e.every(e=>!isNaN(e))).map(e=>{1===e.length&&e.push(e[0]);return e})}}class Record extends ContentObject{constructor(e){super(Ql,"record")}[lo](){this[so]=this[so].trim();const e=parseInt(this[so],10);!isNaN(e)&&e>=0&&(this[so]=e)}}class Relevant extends ContentObject{constructor(e){super(Ql,"relevant")}[lo](){this[so]=this[so].trim().split(/\s+/)}}class Rename extends ContentObject{constructor(e){super(Ql,"rename")}[lo](){this[so]=this[so].trim();(this[so].toLowerCase().startsWith("xml")||new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u").test(this[so]))&&warn("XFA - Rename: invalid XFA name")}}class RenderPolicy extends OptionObject{constructor(e){super(Ql,"renderPolicy",["server","client"])}}class RunScripts extends OptionObject{constructor(e){super(Ql,"runScripts",["both","client","none","server"])}}class config_Script extends XFAObject{constructor(e){super(Ql,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends OptionObject{constructor(e){super(Ql,"scriptModel",["XFA","none"])}}class Severity extends OptionObject{constructor(e){super(Ql,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends XFAObject{constructor(e){super(Ql,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends XFAObject{constructor(e){super(Ql,"staple");this.mode=getStringOption(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends StringObject{constructor(e){super(Ql,"startNode")}}class StartPage extends IntegerObject{constructor(e){super(Ql,"startPage",0,e=>!0)}}class SubmitFormat extends OptionObject{constructor(e){super(Ql,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends StringObject{constructor(e){super(Ql,"submitUrl")}}class SubsetBelow extends IntegerObject{constructor(e){super(Ql,"subsetBelow",100,e=>e>=0&&e<=100)}}class SuppressBanner extends Option01{constructor(e){super(Ql,"suppressBanner")}}class Tagged extends Option01{constructor(e){super(Ql,"tagged")}}class config_Template extends XFAObject{constructor(e){super(Ql,"template",!0);this.base=null;this.relevant=null;this.startPage=null;this.uri=null;this.xsl=null}}class Threshold extends OptionObject{constructor(e){super(Ql,"threshold",["trace","error","information","warning"])}}class To extends OptionObject{constructor(e){super(Ql,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends XFAObject{constructor(e){super(Ql,"templateCache");this.maxEntries=getInteger({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends XFAObject{constructor(e){super(Ql,"trace",!0);this.area=new XFAObjectArray}}class Transform extends XFAObject{constructor(e){super(Ql,"transform",!0);this.groupParent=null;this.ifEmpty=null;this.nameAttr=null;this.picture=null;this.presence=null;this.rename=null;this.whitespace=null}}class Type extends OptionObject{constructor(e){super(Ql,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends StringObject{constructor(e){super(Ql,"uri")}}class config_Validate extends OptionObject{constructor(e){super(Ql,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends ContentObject{constructor(e){super(Ql,"validateApprovalSignatures")}[lo](){this[so]=this[so].trim().split(/\s+/).filter(e=>["docReady","postSign"].includes(e))}}class ValidationMessaging extends OptionObject{constructor(e){super(Ql,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends OptionObject{constructor(e){super(Ql,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends XFAObject{constructor(e){super(Ql,"VersionControl");this.outputBelow=getStringOption(e.outputBelow,["warn","error","update"]);this.sourceAbove=getStringOption(e.sourceAbove,["warn","error"]);this.sourceBelow=getStringOption(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends XFAObject{constructor(e){super(Ql,"viewerPreferences",!0);this.ADBE_JSConsole=null;this.ADBE_JSDebugger=null;this.addViewerPreferences=null;this.duplexOption=null;this.enforce=null;this.numberOfCopies=null;this.pageRange=null;this.pickTrayByPDFSize=null;this.printScaling=null}}class WebClient extends XFAObject{constructor(e){super(Ql,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends OptionObject{constructor(e){super(Ql,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends ContentObject{constructor(e){super(Ql,"window")}[lo](){const e=this[so].split(",",2).map(e=>parseInt(e.trim(),10));if(e.some(e=>isNaN(e)))this[so]=[0,0];else{1===e.length&&e.push(e[0]);this[so]=e}}}class Xdc extends XFAObject{constructor(e){super(Ql,"xdc",!0);this.uri=new XFAObjectArray;this.xsl=new XFAObjectArray}}class Xdp extends XFAObject{constructor(e){super(Ql,"xdp",!0);this.packets=null}}class Xsl extends XFAObject{constructor(e){super(Ql,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends XFAObject{constructor(e){super(Ql,"zpl",!0);this.name=e.name?e.name.trim():"";this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class ConfigNamespace{static[hl](e,t){if(Object.hasOwn(ConfigNamespace,e))return ConfigNamespace[e](t)}static acrobat(e){return new Acrobat(e)}static acrobat7(e){return new Acrobat7(e)}static ADBE_JSConsole(e){return new ADBE_JSConsole(e)}static ADBE_JSDebugger(e){return new ADBE_JSDebugger(e)}static addSilentPrint(e){return new AddSilentPrint(e)}static addViewerPreferences(e){return new AddViewerPreferences(e)}static adjustData(e){return new AdjustData(e)}static adobeExtensionLevel(e){return new AdobeExtensionLevel(e)}static agent(e){return new Agent(e)}static alwaysEmbed(e){return new AlwaysEmbed(e)}static amd(e){return new Amd(e)}static area(e){return new config_Area(e)}static attributes(e){return new Attributes(e)}static autoSave(e){return new AutoSave(e)}static base(e){return new Base(e)}static batchOutput(e){return new BatchOutput(e)}static behaviorOverride(e){return new BehaviorOverride(e)}static cache(e){return new Cache(e)}static change(e){return new Change(e)}static common(e){return new Common(e)}static compress(e){return new Compress(e)}static compressLogicalStructure(e){return new CompressLogicalStructure(e)}static compressObjectStream(e){return new CompressObjectStream(e)}static compression(e){return new Compression(e)}static config(e){return new Config(e)}static conformance(e){return new Conformance(e)}static contentCopy(e){return new ContentCopy(e)}static copies(e){return new Copies(e)}static creator(e){return new Creator(e)}static currentPage(e){return new CurrentPage(e)}static data(e){return new Data(e)}static debug(e){return new Debug(e)}static defaultTypeface(e){return new DefaultTypeface(e)}static destination(e){return new Destination(e)}static documentAssembly(e){return new DocumentAssembly(e)}static driver(e){return new Driver(e)}static duplexOption(e){return new DuplexOption(e)}static dynamicRender(e){return new DynamicRender(e)}static embed(e){return new Embed(e)}static encrypt(e){return new config_Encrypt(e)}static encryption(e){return new config_Encryption(e)}static encryptionLevel(e){return new EncryptionLevel(e)}static enforce(e){return new Enforce(e)}static equate(e){return new Equate(e)}static equateRange(e){return new EquateRange(e)}static exclude(e){return new Exclude(e)}static excludeNS(e){return new ExcludeNS(e)}static flipLabel(e){return new FlipLabel(e)}static fontInfo(e){return new config_FontInfo(e)}static formFieldFilling(e){return new FormFieldFilling(e)}static groupParent(e){return new GroupParent(e)}static ifEmpty(e){return new IfEmpty(e)}static includeXDPContent(e){return new IncludeXDPContent(e)}static incrementalLoad(e){return new IncrementalLoad(e)}static incrementalMerge(e){return new IncrementalMerge(e)}static interactive(e){return new Interactive(e)}static jog(e){return new Jog(e)}static labelPrinter(e){return new LabelPrinter(e)}static layout(e){return new Layout(e)}static level(e){return new Level(e)}static linearized(e){return new Linearized(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static log(e){return new Log(e)}static map(e){return new MapElement(e)}static mediumInfo(e){return new MediumInfo(e)}static message(e){return new config_Message(e)}static messaging(e){return new Messaging(e)}static mode(e){return new Mode(e)}static modifyAnnots(e){return new ModifyAnnots(e)}static msgId(e){return new MsgId(e)}static nameAttr(e){return new NameAttr(e)}static neverEmbed(e){return new NeverEmbed(e)}static numberOfCopies(e){return new NumberOfCopies(e)}static openAction(e){return new OpenAction(e)}static output(e){return new Output(e)}static outputBin(e){return new OutputBin(e)}static outputXSL(e){return new OutputXSL(e)}static overprint(e){return new Overprint(e)}static packets(e){return new Packets(e)}static pageOffset(e){return new PageOffset(e)}static pageRange(e){return new PageRange(e)}static pagination(e){return new Pagination(e)}static paginationOverride(e){return new PaginationOverride(e)}static part(e){return new Part(e)}static pcl(e){return new Pcl(e)}static pdf(e){return new Pdf(e)}static pdfa(e){return new Pdfa(e)}static permissions(e){return new Permissions(e)}static pickTrayByPDFSize(e){return new PickTrayByPDFSize(e)}static picture(e){return new config_Picture(e)}static plaintextMetadata(e){return new PlaintextMetadata(e)}static presence(e){return new Presence(e)}static present(e){return new Present(e)}static print(e){return new Print(e)}static printHighQuality(e){return new PrintHighQuality(e)}static printScaling(e){return new PrintScaling(e)}static printerName(e){return new PrinterName(e)}static producer(e){return new Producer(e)}static ps(e){return new Ps(e)}static range(e){return new Range(e)}static record(e){return new Record(e)}static relevant(e){return new Relevant(e)}static rename(e){return new Rename(e)}static renderPolicy(e){return new RenderPolicy(e)}static runScripts(e){return new RunScripts(e)}static script(e){return new config_Script(e)}static scriptModel(e){return new ScriptModel(e)}static severity(e){return new Severity(e)}static silentPrint(e){return new SilentPrint(e)}static staple(e){return new Staple(e)}static startNode(e){return new StartNode(e)}static startPage(e){return new StartPage(e)}static submitFormat(e){return new SubmitFormat(e)}static submitUrl(e){return new SubmitUrl(e)}static subsetBelow(e){return new SubsetBelow(e)}static suppressBanner(e){return new SuppressBanner(e)}static tagged(e){return new Tagged(e)}static template(e){return new config_Template(e)}static templateCache(e){return new TemplateCache(e)}static threshold(e){return new Threshold(e)}static to(e){return new To(e)}static trace(e){return new Trace(e)}static transform(e){return new Transform(e)}static type(e){return new Type(e)}static uri(e){return new Uri(e)}static validate(e){return new config_Validate(e)}static validateApprovalSignatures(e){return new ValidateApprovalSignatures(e)}static validationMessaging(e){return new ValidationMessaging(e)}static version(e){return new Version(e)}static versionControl(e){return new VersionControl(e)}static viewerPreferences(e){return new ViewerPreferences(e)}static webClient(e){return new WebClient(e)}static whitespace(e){return new Whitespace(e)}static window(e){return new Window(e)}static xdc(e){return new Xdc(e)}static xdp(e){return new Xdp(e)}static xsl(e){return new Xsl(e)}static zpl(e){return new Zpl(e)}}const Zl=ul.connectionSet.id;class ConnectionSet extends XFAObject{constructor(e){super(Zl,"connectionSet",!0);this.wsdlConnection=new XFAObjectArray;this.xmlConnection=new XFAObjectArray;this.xsdConnection=new XFAObjectArray}}class EffectiveInputPolicy extends XFAObject{constructor(e){super(Zl,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends XFAObject{constructor(e){super(Zl,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends StringObject{constructor(e){super(Zl,"operation");this.id=e.id||"";this.input=e.input||"";this.name=e.name||"";this.output=e.output||"";this.use=e.use||"";this.usehref=e.usehref||""}}class RootElement extends StringObject{constructor(e){super(Zl,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends StringObject{constructor(e){super(Zl,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends StringObject{constructor(e){super(Zl,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class connection_set_Uri extends StringObject{constructor(e){super(Zl,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends StringObject{constructor(e){super(Zl,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends XFAObject{constructor(e){super(Zl,"wsdlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.effectiveInputPolicy=null;this.effectiveOutputPolicy=null;this.operation=null;this.soapAction=null;this.soapAddress=null;this.wsdlAddress=null}}class XmlConnection extends XFAObject{constructor(e){super(Zl,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends XFAObject{constructor(e){super(Zl,"xsdConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.rootElement=null;this.uri=null}}class ConnectionSetNamespace{static[hl](e,t){if(Object.hasOwn(ConnectionSetNamespace,e))return ConnectionSetNamespace[e](t)}static connectionSet(e){return new ConnectionSet(e)}static effectiveInputPolicy(e){return new EffectiveInputPolicy(e)}static effectiveOutputPolicy(e){return new EffectiveOutputPolicy(e)}static operation(e){return new Operation(e)}static rootElement(e){return new RootElement(e)}static soapAction(e){return new SoapAction(e)}static soapAddress(e){return new SoapAddress(e)}static uri(e){return new connection_set_Uri(e)}static wsdlAddress(e){return new WsdlAddress(e)}static wsdlConnection(e){return new WsdlConnection(e)}static xmlConnection(e){return new XmlConnection(e)}static xsdConnection(e){return new XsdConnection(e)}}const ef=ul.datasets.id;class datasets_Data extends XmlObject{constructor(e){super(ef,"data",e)}[Mo](){return!0}}class Datasets extends XFAObject{constructor(e){super(ef,"datasets",!0);this.data=null;this.Signature=null}[Wo](e){const t=e[Uo];("data"===t&&e[Lo]===ef||"Signature"===t&&e[Lo]===ul.signature.id)&&(this[t]=e);this[Ji](e)}}class DatasetsNamespace{static[hl](e,t){if(Object.hasOwn(DatasetsNamespace,e))return DatasetsNamespace[e](t)}static datasets(e){return new Datasets(e)}static data(e){return new datasets_Data(e)}}const tf=ul.localeSet.id;class CalendarSymbols extends XFAObject{constructor(e){super(tf,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new XFAObjectArray(2)}}class CurrencySymbol extends StringObject{constructor(e){super(tf,"currencySymbol");this.name=getStringOption(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends XFAObject{constructor(e){super(tf,"currencySymbols",!0);this.currencySymbol=new XFAObjectArray(3)}}class DatePattern extends StringObject{constructor(e){super(tf,"datePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class DatePatterns extends XFAObject{constructor(e){super(tf,"datePatterns",!0);this.datePattern=new XFAObjectArray(4)}}class DateTimeSymbols extends ContentObject{constructor(e){super(tf,"dateTimeSymbols")}}class Day extends StringObject{constructor(e){super(tf,"day")}}class DayNames extends XFAObject{constructor(e){super(tf,"dayNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new XFAObjectArray(7)}}class Era extends StringObject{constructor(e){super(tf,"era")}}class EraNames extends XFAObject{constructor(e){super(tf,"eraNames",!0);this.era=new XFAObjectArray(2)}}class locale_set_Locale extends XFAObject{constructor(e){super(tf,"locale",!0);this.desc=e.desc||"";this.name="isoname";this.calendarSymbols=null;this.currencySymbols=null;this.datePatterns=null;this.dateTimeSymbols=null;this.numberPatterns=null;this.numberSymbols=null;this.timePatterns=null;this.typeFaces=null}}class locale_set_LocaleSet extends XFAObject{constructor(e){super(tf,"localeSet",!0);this.locale=new XFAObjectArray}}class Meridiem extends StringObject{constructor(e){super(tf,"meridiem")}}class MeridiemNames extends XFAObject{constructor(e){super(tf,"meridiemNames",!0);this.meridiem=new XFAObjectArray(2)}}class Month extends StringObject{constructor(e){super(tf,"month")}}class MonthNames extends XFAObject{constructor(e){super(tf,"monthNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new XFAObjectArray(12)}}class NumberPattern extends StringObject{constructor(e){super(tf,"numberPattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class NumberPatterns extends XFAObject{constructor(e){super(tf,"numberPatterns",!0);this.numberPattern=new XFAObjectArray(4)}}class NumberSymbol extends StringObject{constructor(e){super(tf,"numberSymbol");this.name=getStringOption(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends XFAObject{constructor(e){super(tf,"numberSymbols",!0);this.numberSymbol=new XFAObjectArray(5)}}class TimePattern extends StringObject{constructor(e){super(tf,"timePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class TimePatterns extends XFAObject{constructor(e){super(tf,"timePatterns",!0);this.timePattern=new XFAObjectArray(4)}}class TypeFace extends XFAObject{constructor(e){super(tf,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends XFAObject{constructor(e){super(tf,"typeFaces",!0);this.typeFace=new XFAObjectArray}}class LocaleSetNamespace{static[hl](e,t){if(Object.hasOwn(LocaleSetNamespace,e))return LocaleSetNamespace[e](t)}static calendarSymbols(e){return new CalendarSymbols(e)}static currencySymbol(e){return new CurrencySymbol(e)}static currencySymbols(e){return new CurrencySymbols(e)}static datePattern(e){return new DatePattern(e)}static datePatterns(e){return new DatePatterns(e)}static dateTimeSymbols(e){return new DateTimeSymbols(e)}static day(e){return new Day(e)}static dayNames(e){return new DayNames(e)}static era(e){return new Era(e)}static eraNames(e){return new EraNames(e)}static locale(e){return new locale_set_Locale(e)}static localeSet(e){return new locale_set_LocaleSet(e)}static meridiem(e){return new Meridiem(e)}static meridiemNames(e){return new MeridiemNames(e)}static month(e){return new Month(e)}static monthNames(e){return new MonthNames(e)}static numberPattern(e){return new NumberPattern(e)}static numberPatterns(e){return new NumberPatterns(e)}static numberSymbol(e){return new NumberSymbol(e)}static numberSymbols(e){return new NumberSymbols(e)}static timePattern(e){return new TimePattern(e)}static timePatterns(e){return new TimePatterns(e)}static typeFace(e){return new TypeFace(e)}static typeFaces(e){return new TypeFaces(e)}}const af=ul.signature.id;class signature_Signature extends XFAObject{constructor(e){super(af,"signature",!0)}}class SignatureNamespace{static[hl](e,t){if(Object.hasOwn(SignatureNamespace,e))return SignatureNamespace[e](t)}static signature(e){return new signature_Signature(e)}}const nf=ul.stylesheet.id;class Stylesheet extends XFAObject{constructor(e){super(nf,"stylesheet",!0)}}class StylesheetNamespace{static[hl](e,t){if(Object.hasOwn(StylesheetNamespace,e))return StylesheetNamespace[e](t)}static stylesheet(e){return new Stylesheet(e)}}const sf=ul.xdp.id;class xdp_Xdp extends XFAObject{constructor(e){super(sf,"xdp",!0);this.uuid=e.uuid||"";this.timeStamp=e.timeStamp||"";this.config=null;this.connectionSet=null;this.datasets=null;this.localeSet=null;this.stylesheet=new XFAObjectArray;this.template=null}[Ko](e){const t=ul[e[Uo]];return t&&e[Lo]===t.id}}class XdpNamespace{static[hl](e,t){if(Object.hasOwn(XdpNamespace,e))return XdpNamespace[e](t)}static xdp(e){return new xdp_Xdp(e)}}const rf=ul.xhtml.id,of=Symbol(),lf=new Set(["color","font","font-family","font-size","font-stretch","font-style","font-weight","margin","margin-bottom","margin-left","margin-right","margin-top","letter-spacing","line-height","orphans","page-break-after","page-break-before","page-break-inside","tab-interval","tab-stop","text-align","text-decoration","text-indent","vertical-align","widows","kerning-mode","xfa-font-horizontal-scale","xfa-font-vertical-scale","xfa-spacerun","xfa-tab-stops"]),ff=new Map([["page-break-after","breakAfter"],["page-break-before","breakBefore"],["page-break-inside","breakInside"],["kerning-mode",e=>"none"===e?"none":"normal"],["xfa-font-horizontal-scale",e=>`scaleX(${Math.max(0,parseInt(e,10)/100).toFixed(2)})`],["xfa-font-vertical-scale",e=>`scaleY(${Math.max(0,parseInt(e,10)/100).toFixed(2)})`],["xfa-spacerun",""],["xfa-tab-stops",""],["font-size",(e,t)=>measureToString(.99*(e=t.fontSize=Math.abs(getMeasurement(e))))],["letter-spacing",e=>measureToString(getMeasurement(e))],["line-height",e=>measureToString(getMeasurement(e))],["margin",e=>measureToString(getMeasurement(e))],["margin-bottom",e=>measureToString(getMeasurement(e))],["margin-left",e=>measureToString(getMeasurement(e))],["margin-right",e=>measureToString(getMeasurement(e))],["margin-top",e=>measureToString(getMeasurement(e))],["text-indent",e=>measureToString(getMeasurement(e))],["font-family",e=>e],["vertical-align",e=>measureToString(getMeasurement(e))]]),cf=/\s+/g,hf=/[\r\n]+/g,uf=/\r\n?/g;function mapStyle(e,t,a){const n=Object.create(null);if(!e)return n;const s=Object.create(null);for(const[t,a]of e.split(";").map(e=>e.split(":",2))){const e=ff.get(t);if(""===e)continue;let r=a;e&&(r="string"==typeof e?e:e(a,s));t.endsWith("scale")?n.transform=n.transform?`${n[t]} ${r}`:r:n[t.replaceAll(/-([a-zA-Z])/g,(e,t)=>t.toUpperCase())]=r}n.fontFamily&&setFontFamily({typeface:n.fontFamily,weight:n.fontWeight||"normal",posture:n.fontStyle||"normal",size:s.fontSize||0},t,t[xo].fontFinder,n);if(a&&n.verticalAlign&&"0px"!==n.verticalAlign&&n.fontSize){const e=.583,t=.333,a=getMeasurement(n.fontSize);n.fontSize=measureToString(a*e);n.verticalAlign=measureToString(Math.sign(getMeasurement(n.verticalAlign))*a*t)}a&&n.fontSize&&(n.fontSize=`calc(${n.fontSize} * var(--total-scale-factor))`);fixTextIndent(n);return n}const mf=new Set(["body","html"]);class XhtmlObject extends XmlObject{constructor(e,t){super(rf,t);this[of]=!1;this.style=e.style||""}[Zi](e){super[Zi](e);this.style=function checkStyle(e){return e.style?e.style.split(";").filter(e=>!!e.trim()).map(e=>e.split(":",2).map(e=>e.trim())).filter(([t,a])=>{"font-family"===t&&e[xo].usedTypefaces.add(a);return lf.has(t)}).map(e=>e.join(":")).join(";"):""}(this)}[$i](){return!mf.has(this[Uo])}[Go](e,t=!1){if(t)this[of]=!0;else{e=e.replaceAll(hf,"");this.style.includes("xfa-spacerun:yes")||(e=e.replaceAll(cf," "))}e&&(this[so]+=e)}[Vo](e,t=!0){const a=Object.create(null),n={top:NaN,bottom:NaN,left:NaN,right:NaN};let s=null;for(const[e,t]of this.style.split(";").map(e=>e.split(":",2)))switch(e){case"font-family":a.typeface=stripQuotes(t);break;case"font-size":a.size=getMeasurement(t);break;case"font-weight":a.weight=t;break;case"font-style":a.posture=t;break;case"letter-spacing":a.letterSpacing=getMeasurement(t);break;case"margin":const e=t.split(/ \t/).map(e=>getMeasurement(e));switch(e.length){case 1:n.top=n.bottom=n.left=n.right=e[0];break;case 2:n.top=n.bottom=e[0];n.left=n.right=e[1];break;case 3:n.top=e[0];n.bottom=e[2];n.left=n.right=e[1];break;case 4:n.top=e[0];n.left=e[1];n.bottom=e[2];n.right=e[3]}break;case"margin-top":n.top=getMeasurement(t);break;case"margin-bottom":n.bottom=getMeasurement(t);break;case"margin-left":n.left=getMeasurement(t);break;case"margin-right":n.right=getMeasurement(t);break;case"line-height":s=getMeasurement(t)}e.pushData(a,n,s);if(this[so])e.addString(this[so]);else for(const t of this[ko]())"#text"!==t[Uo]?t[Vo](e):e.addString(t[so]);t&&e.popFont()}[ol](e){const t=[];this[oo]={children:t};this[Qi]({});if(0===t.length&&!this[so])return HTMLResult.EMPTY;let a;a=this[of]?this[so]?this[so].replaceAll(uf,"\n"):void 0:this[so]||void 0;return HTMLResult.success({name:this[Uo],attributes:{href:this.href,style:mapStyle(this.style,this,this[of])},children:t,value:a})}}class A extends XhtmlObject{constructor(e){super(e,"a");this.href=fixURL(e.href)||""}}class B extends XhtmlObject{constructor(e){super(e,"b")}[Vo](e){e.pushFont({weight:"bold"});super[Vo](e);e.popFont()}}class Body extends XhtmlObject{constructor(e){super(e,"body")}[ol](e){const t=super[ol](e),{html:a}=t;if(!a)return HTMLResult.EMPTY;a.name="div";a.attributes.class=["xfaRich"];return t}}class Br extends XhtmlObject{constructor(e){super(e,"br")}[rl](){return"\n"}[Vo](e){e.addString("\n")}[ol](e){return HTMLResult.success({name:"br"})}}class Html extends XhtmlObject{constructor(e){super(e,"html")}[ol](e){const t=[];this[oo]={children:t};this[Qi]({});if(0===t.length)return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},value:this[so]||""});if(1===t.length){const e=t[0];if(e.attributes?.class.includes("xfaRich"))return HTMLResult.success(e)}return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},children:t})}}class I extends XhtmlObject{constructor(e){super(e,"i")}[Vo](e){e.pushFont({posture:"italic"});super[Vo](e);e.popFont()}}class Li extends XhtmlObject{constructor(e){super(e,"li")}}class Ol extends XhtmlObject{constructor(e){super(e,"ol")}}class P extends XhtmlObject{constructor(e){super(e,"p")}[Vo](e){super[Vo](e,!1);e.addString("\n");e.addPara();e.popFont()}[rl](){return this[So]()[ko]().at(-1)===this?super[rl]():super[rl]()+"\n"}}class Span extends XhtmlObject{constructor(e){super(e,"span")}}class Sub extends XhtmlObject{constructor(e){super(e,"sub")}}class Sup extends XhtmlObject{constructor(e){super(e,"sup")}}class Ul extends XhtmlObject{constructor(e){super(e,"ul")}}class XhtmlNamespace{static[hl](e,t){if(Object.hasOwn(XhtmlNamespace,e))return XhtmlNamespace[e](t)}static a(e){return new A(e)}static b(e){return new B(e)}static body(e){return new Body(e)}static br(e){return new Br(e)}static html(e){return new Html(e)}static i(e){return new I(e)}static li(e){return new Li(e)}static ol(e){return new Ol(e)}static p(e){return new P(e)}static span(e){return new Span(e)}static sub(e){return new Sub(e)}static sup(e){return new Sup(e)}static ul(e){return new Ul(e)}}const pf={config:ConfigNamespace,connection:ConnectionSetNamespace,datasets:DatasetsNamespace,localeSet:LocaleSetNamespace,signature:SignatureNamespace,stylesheet:StylesheetNamespace,template:TemplateNamespace,xdp:XdpNamespace,xhtml:XhtmlNamespace};class UnknownNamespace{constructor(e){this.namespaceId=e}[hl](e,t){return new XmlObject(this.namespaceId,e,t)}}class Root extends XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[Io]=e}[Wo](e){this.element=e;return!0}[lo](){super[lo]();if(this.element.template instanceof Template){this[Io].set(Qo,this.element);this.element.template[Zo](this[Io]);this.element.template[Io]=this[Io]}}}class Empty extends XFAObject{constructor(){super(-1,"",Object.create(null))}[Wo](e){return!1}}class Builder{constructor(e=null){this._namespaceStack=[];this._nsAgnosticLevel=0;this._namespacePrefixes=new Map;this._namespaces=new Map;this._nextNsId=Math.max(...Object.values(ul).map(({id:e})=>e));this._currentNamespace=e||new UnknownNamespace(++this._nextNsId)}buildRoot(e){return new Root(e)}build({nsPrefix:e,name:t,attributes:a,namespace:n,prefixes:s}){const r=null!==n;if(r){this._namespaceStack.push(this._currentNamespace);this._currentNamespace=this._searchNamespace(n)}s&&this._addNamespacePrefix(s);if(Object.hasOwn(a,Xo)){const e=pf.datasets,t=a[Xo];let n=null;for(const[a,s]of Object.entries(t)){if(this._getNamespaceToUse(a)===e){n={xfa:s};break}}n?a[Xo]=n:delete a[Xo]}const i=this._getNamespaceToUse(e),o=i?.[hl](t,a)||new Empty;o[Mo]()&&this._nsAgnosticLevel++;(r||s||o[Mo]())&&(o[to]={hasNamespace:r,prefixes:s,nsAgnostic:o[Mo]()});return o}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[a,{check:n}]of Object.entries(ul))if(n(e)){t=pf[a];if(t){this._namespaces.set(e,t);return t}break}t=new UnknownNamespace(++this._nextNsId);this._namespaces.set(e,t);return t}_addNamespacePrefix(e){for(const{prefix:t,value:a}of e){const e=this._searchNamespace(a);this._namespacePrefixes.getOrInsertComputed(t,makeArr).push(e)}}_getNamespaceToUse(e){if(!e)return this._currentNamespace;const t=this._namespacePrefixes.get(e);if(t?.length>0)return t.at(-1);warn(`Unknown namespace prefix: ${e}.`);return null}clean(e){const{hasNamespace:t,prefixes:a,nsAgnostic:n}=e;t&&(this._currentNamespace=this._namespaceStack.pop());a&&a.forEach(({prefix:e})=>{this._namespacePrefixes.get(e).pop()});n&&this._nsAgnosticLevel--}}class XFAParser extends XMLParserBase{constructor(e=null,t=!1){super();this._builder=new Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=Bi;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===Bi){this._current[lo]();return this._current.element}}onText(e){e=e.replace(this._nbsps,e=>e.slice(1)+" ");this._richText||this._current[$i]()?this._current[Go](e,this._richText):this._whiteRegex.test(e)||this._current[Go](e.trim())}onCdata(e){this._current[Go](e)}_mkAttributes(e,t){let a=null,n=null;const s=Object.create({});for(const{name:r,value:i}of e)if("xmlns"===r)a?warn(`XFA - multiple namespace definition in <${t}>`):a=i;else if(r.startsWith("xmlns:")){const e=r.substring(6);n??=[];n.push({prefix:e,value:i})}else{const e=r.indexOf(":");if(-1===e)s[r]=i;else{const t=s[Xo]??=Object.create(null),[a,n]=[r.slice(0,e),r.slice(e+1)];(t[a]||=Object.create(null))[n]=i}}return[a,n,s]}_getNameAndPrefix(e,t){const a=e.indexOf(":");return-1===a?[e,null]:[e.substring(a+1),t?"":e.substring(0,a)]}onBeginElement(e,t,a){const[n,s,r]=this._mkAttributes(t,e),[i,o]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),l=this._builder.build({nsPrefix:o,name:i,attributes:r,namespace:n,prefixes:s});l[xo]=this._globalData;if(a){l[lo]();this._current[Wo](l)&&l[tl](this._ids);l[Zi](this._builder)}else{this._stack.push(this._current);this._current=l}}onEndElement(e){const t=this._current;if(t[Ro]()&&"string"==typeof t[so]){const e=new XFAParser;e._globalData=this._globalData;const a=e.parse(t[so]);t[so]=null;t[Wo](a)}t[lo]();this._current=this._stack.pop();this._current[Wo](t)&&t[tl](this._ids);t[Zi](this._builder)}onError(e){this._errorCode=e}}class XFAFactory{constructor(e){try{this.root=(new XFAParser).parse(XFAFactory._createDocument(e));const t=new Binder(this.root);this.form=t.bind();this.dataHandler=new DataHandler(this.root,t.getData());this.form[xo].template=this.form}catch(e){warn(`XFA - an error occurred during parsing and binding: ${e}`)}}isValid(){return!(!this.root||!this.form)}_createPagesHelper(){const e=this.form[il]();return new Promise((t,a)=>{const nextIteration=()=>{try{const a=e.next();a.done?t(a.value):setTimeout(nextIteration,0)}catch(e){a(e)}};setTimeout(nextIteration,0)})}async _createPages(){try{this.pages=await this._createPagesHelper();this.dims=this.pages.children.map(e=>{const{width:t,height:a}=e.attributes.style;return[0,0,parseInt(t,10),parseInt(a,10)]})}catch(e){warn(`XFA - an error occurred during layout: ${e}`)}}getBoundingBox(e){return this.dims[e]}async getNumPages(){this.pages||await this._createPages();return this.dims.length}setImages(e){this.form[xo].images=e}setFonts(e){this.form[xo].fontFinder=new FontFinder(e);const t=[];for(let e of this.form[xo].usedTypefaces){e=stripQuotes(e);this.form[xo].fontFinder.find(e)||t.push(e)}return t.length>0?t:null}appendFonts(e,t){this.form[xo].fontFinder.add(e,t)}async getPages(){this.pages||await this._createPages();const e=this.pages;this.pages=null;return e}serializeData(e){return this.dataHandler.serialize(e)}static _createDocument(e){return e["/xdp:xdp"]?Object.values(e).join(""):e["xdp:xdp"]}static getRichTextAsHtml(e){if(!e||"string"!=typeof e)return null;try{let t=new XFAParser(XhtmlNamespace,!0).parse(e);if(!["body","xhtml"].includes(t[Uo])){const e=XhtmlNamespace.body({});e[Ji](t);t=e}const a=t[ol]();if(!a.success)return null;const{html:n}=a,{attributes:s}=n;if(s){s.class&&(s.class=s.class.filter(e=>!e.startsWith("xfa")));s.dir="auto"}return{html:n,str:t[rl]()}}catch(e){warn(`XFA - an error occurred during parsing of rich text: ${e}`)}return null}}class AnnotationFactory{static createGlobals(e){return Promise.all([e.ensureCatalog("acroForm"),e.ensureDoc("xfaDatasets"),e.ensureCatalog("structTreeRoot"),e.ensureCatalog("baseUrl"),e.ensureCatalog("attachments"),e.ensureCatalog("globalColorSpaceCache")]).then(([t,a,n,s,r,i])=>({pdfManager:e,acroForm:t instanceof Dict?t:Dict.empty,xfaDatasets:a,structTreeRoot:n,baseUrl:s,attachments:r,globalColorSpaceCache:i}),e=>{warn(`createGlobals: "${e}".`);return null})}static async create(e,t,a,n,s,r,i,o){const l=s?await this._getPageIndex(e,t,a.pdfManager):null;return a.pdfManager.ensure(this,"_create",[e,t,a,n,s,r,i,l,o])}static _create(e,t,a,n,s=!1,r=null,i=null,o=null,l=null){const f=e.fetchIfRef(t);if(!(f instanceof Dict))return;let c=f.get("Subtype");c=c instanceof Name?c.name:null;if(i&&!i.has(R[c?.toUpperCase()]))return null;const{acroForm:h,pdfManager:u}=a,m=t instanceof Ref?t.toString():`annot_${n.createObjId()}`,p={xref:e,ref:t,dict:f,subtype:c,id:m,annotationGlobals:a,collectFields:s,orphanFields:r,needAppearances:!s&&!0===h.get("NeedAppearances"),pageIndex:o,evaluatorOptions:u.evaluatorOptions,pageRef:l};switch(c){case"Link":return new LinkAnnotation(p);case"Text":return new TextAnnotation(p);case"Widget":let e=getInheritableProperty({dict:f,key:"FT"});e=e instanceof Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(p);case"Btn":return new ButtonWidgetAnnotation(p);case"Ch":return new ChoiceWidgetAnnotation(p);case"Sig":return new SignatureWidgetAnnotation(p)}warn(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(p);case"Popup":return new PopupAnnotation(p);case"FreeText":return new FreeTextAnnotation(p);case"Line":return new LineAnnotation(p);case"Square":return new SquareAnnotation(p);case"Circle":return new CircleAnnotation(p);case"PolyLine":return new PolylineAnnotation(p);case"Polygon":return new PolygonAnnotation(p);case"Caret":return new CaretAnnotation(p);case"Ink":return new InkAnnotation(p);case"Highlight":return new HighlightAnnotation(p);case"Underline":return new UnderlineAnnotation(p);case"Squiggly":return new SquigglyAnnotation(p);case"StrikeOut":return new StrikeOutAnnotation(p);case"Stamp":return new StampAnnotation(p);case"FileAttachment":return new FileAttachmentAnnotation(p);default:s||warn(c?`Unimplemented annotation type "${c}", falling back to base annotation.`:"Annotation is missing the required /Subtype.");return new Annotation(p)}}static async _getPageIndex(e,t,a){try{const n=await e.fetchIfRefAsync(t);if(!(n instanceof Dict))return-1;const s=n.getRaw("P");if(s instanceof Ref)try{return await a.ensureCatalog("getPageIndex",[s])}catch(e){info(`_getPageIndex -- not a valid page reference: "${e}".`)}if(n.has("Kids"))return-1;const r=await a.ensureDoc("numPages");for(let e=0;ee/255)||t}function getQuadPoints(e,t){const a=e.getArray("QuadPoints");if(!isNumberArray(a,null)||0===a.length||a.length%8>0)return null;const n=new Float32Array(a.length);for(let e=0,s=a.length;et[2]||pt[3]))return null;n.set([u,d,m,d,u,p,m,p],e)}return n}function getTransformMatrix(e,t,n){const s=a.slice();Util.axialAlignedBoundingBox(t,n,s);const[r,i,o,l]=s;if(r===o||i===l)return[1,0,0,1,e[0],e[1]];const f=(e[2]-e[0])/(o-r),c=(e[3]-e[1])/(l-i);return[f,0,0,c,e[0]-r*f,e[1]-i*c]}class Annotation{constructor(e){const{annotationGlobals:t,dict:a,orphanFields:n,ref:s,subtype:r,xref:i}=e,o=n?.get(s);o&&a.set("Parent",o);this.setTitle(a.get("T"));this.setContents(a.get("Contents"));this.setModificationDate(a.get("M"));this.setFlags(a.get("F"));this.setRectangle(a.getArray("Rect"));this.setColor(a.getArray("C"));this.setBorderStyle(a);this.setAppearance(a);this.setOptionalContent(a);const l=a.get("MK");this.setBorderAndBackgroundColors(l);this.setRotation(l,a);this.ref=e.ref instanceof Ref?e.ref:null;this._streams=[];this.appearance&&this._streams.push(this.appearance);const f=!!(this.flags&L),c=!!(this.flags&U);this.data={annotationType:R[r?.toUpperCase()],annotationFlags:this.flags,borderStyle:this.borderStyle,color:this.color,backgroundColor:this.backgroundColor,borderColor:this.borderColor,rotation:this.rotation,contentsObj:this._contents,hasAppearance:!!this.appearance,id:e.id,modificationDate:this.modificationDate,rect:this.rectangle,subtype:r,hasOwnCanvas:!1,noRotate:!!(this.flags&_),noHTML:f&&c,isEditable:!1,structParent:-1};if(t.structTreeRoot){let n=a.get("StructParent");this.data.structParent=n=Number.isInteger(n)&&n>=0?n:-1;t.structTreeRoot.addAnnotationIdToPage(e.pageRef,n)}if(e.collectFields){const t=a.get("Kids");if(Array.isArray(t)){const e=[];for(const a of t)a instanceof Ref&&e.push(a.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=collectActions(i,a,ie);this.data.fieldName=this._constructFieldName(a);this.data.pageIndex=e.pageIndex}const h=a.get("IT");h instanceof Name&&(this.data.it=h.name);this._isOffscreenCanvasSupported=e.evaluatorOptions.isOffscreenCanvasSupported;this._fallbackFontDict=null;this._needAppearances=!1}_hasFlag(e,t){return!!(e&t)}_buildFlags(e,t){let{flags:a}=this;if(void 0===e){if(void 0===t)return;return t?a&~E:a&~N|E}if(e){a|=E;return t?a&~z|N:a&~N|z}a&=~(N|z);return t?a&~E:a|E}_isViewable(e){return!this._hasFlag(e,M)&&!this._hasFlag(e,z)}_isPrintable(e){return this._hasFlag(e,E)&&!this._hasFlag(e,N)&&!this._hasFlag(e,M)}mustBeViewed(e,t){const a=e?.get(this.data.id)?.noView;return void 0!==a?!a:this.viewable&&!this._hasFlag(this.flags,N)}mustBePrinted(e){const t=e?.get(this.data.id)?.noPrint;return void 0!==t?!t:this.printable}mustBeViewedWhenEditing(e,t=null){return e?!this.data.isEditable:!t?.has(this.data.id)}get viewable(){return null!==this.data.quadPoints&&(0===this.flags||this._isViewable(this.flags))}get printable(){return null!==this.data.quadPoints&&(0!==this.flags&&this._isPrintable(this.flags))}_parseStringHelper(e){const t="string"==typeof e?stringToPDFString(e):"";return{str:t,dir:t&&"rtl"===bidi(t).dir?"rtl":"ltr"}}setDefaultAppearance(e){const{dict:t,annotationGlobals:a}=e,n=getInheritableProperty({dict:t,key:"DA"})||a.acroForm.get("DA");this._defaultAppearance="string"==typeof n?n:"";this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance)}setTitle(e){this._title=this._parseStringHelper(e)}setContents(e){this._contents=this._parseStringHelper(e)}setModificationDate(e){this.modificationDate="string"==typeof e?e:null}setFlags(e){this.flags=Number.isInteger(e)&&e>0?e:0;this.flags&M&&"Annotation"!==this.constructor.name&&(this.flags^=M)}hasFlag(e){return this._hasFlag(this.flags,e)}setRectangle(e){this.rectangle=lookupNormalRect(e,[0,0,0,0])}setColor(e){this.color=getRgbColor(e)}setLineEndings(e){this.lineEndings=["None","None"];if(Array.isArray(e)&&2===e.length)for(let t=0;t<2;t++){const a=e[t];if(a instanceof Name)switch(a.name){case"None":continue;case"Square":case"Circle":case"Diamond":case"OpenArrow":case"ClosedArrow":case"Butt":case"ROpenArrow":case"RClosedArrow":case"Slash":this.lineEndings[t]=a.name;continue}warn(`Ignoring invalid lineEnding: ${a}`)}}setRotation(e,t){this.rotation=0;let a=e instanceof Dict?e.get("R")||0:t.get("Rotate")||0;if(Number.isInteger(a)&&0!==a){a%=360;a<0&&(a+=360);a%90==0&&(this.rotation=a)}}setBorderAndBackgroundColors(e){if(e instanceof Dict){this.borderColor=getRgbColor(e.getArray("BC"),null);this.backgroundColor=getRgbColor(e.getArray("BG"),null)}else this.borderColor=this.backgroundColor=null}setBorderStyle(e){this.borderStyle=new AnnotationBorderStyle;if(e instanceof Dict)if(e.has("BS")){const t=e.get("BS");if(t instanceof Dict){const e=t.get("Type");if(!e||isName(e,"Border")){this.borderStyle.setWidth(t.get("W"),this.rectangle);this.borderStyle.setStyle(t.get("S"));this.borderStyle.setDashArray(t.getArray("D"))}}}else if(e.has("Border")){const t=e.getArray("Border");if(Array.isArray(t))if(t.length>=3){this.borderStyle.setHorizontalCornerRadius(t[0]);this.borderStyle.setVerticalCornerRadius(t[1]);this.borderStyle.setWidth(t[2],this.rectangle);4===t.length&&this.borderStyle.setDashArray(t[3],!0)}else 0===t.length&&this.borderStyle.setWidth(0)}else this.borderStyle.setWidth(0)}setAppearance(e){this.appearance=null;const t=e.get("AP");if(!(t instanceof Dict))return;const a=t.get("N");if(a instanceof BaseStream){this.appearance=a;return}if(!(a instanceof Dict))return;const n=e.get("AS");if(!(n instanceof Name&&a.has(n.name)))return;const s=a.get(n.name);s instanceof BaseStream&&(this.appearance=s)}setOptionalContent(e){this.oc=null;const t=e.get("OC");t instanceof Name?warn("setOptionalContent: Support for /Name-entry is not implemented."):t instanceof Dict&&(this.oc=t)}async loadResources(e,t){const a=await t.dict.getAsync("Resources");a&&await ObjectLoader.load(a,e,a.xref);return a}async getOperatorList(e,t,a,n){const{hasOwnCanvas:s,id:r,rect:i}=this.data;let o=this.appearance;const f=!!(s&&a&l);if(f&&(0===this.width||0===this.height)){this.data.hasOwnCanvas=!1;return{opList:new OperatorList,separateForm:!1,separateCanvas:!1}}if(!o){if(!f)return{opList:new OperatorList,separateForm:!1,separateCanvas:!1};o=new StringStream("");o.dict=new Dict}const c=o.dict,h=await this.loadResources(da,o),u=lookupRect(c.getArray("BBox"),[0,0,1,1]),m=lookupMatrix(c.getArray("Matrix"),pa),p=getTransformMatrix(i,u,m),d=new OperatorList;let g;this.oc&&(g=await e.parseMarkedContentProps(this.oc,null));void 0!==g&&d.addOp(xt,["OC",g]);d.addOp(Bt,[r,i,p,m,f]);await e.getOperatorList({stream:o,task:t,resources:h,operatorList:d,fallbackFontDict:this._fallbackFontDict});d.addOp(Dt,[]);void 0!==g&&d.addOp(Ct,[]);this.reset();return{opList:d,separateForm:!1,separateCanvas:f}}async save(e,t,a,n){return null}get overlaysTextContent(){return!1}get hasTextContent(){return!1}async extractTextContent(e,t,a){if(!this.appearance)return;const n=await this.loadResources(ga,this.appearance),s=[],r=[];let i=null;const o={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items)if(void 0!==t.str){i||=t.transform.slice(-2);r.push(t.str);if(t.hasEOL){s.push(r.join("").trimEnd());r.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:n,includeMarkedContent:!0,keepWhiteSpace:!0,sink:o,viewBox:a});this.reset();r.length&&s.push(r.join("").trimEnd());if(s.length>1||s[0]){const e=this.appearance.dict,t=lookupRect(e.getArray("BBox"),null),a=lookupMatrix(e.getArray("Matrix"),null);this.data.textPosition=this._transformPoint(i,t,a);this.data.textContent=s}}_transformPoint(e,t,a){const{rect:n}=this.data;t||=[0,0,1,1];a||=[1,0,0,1,0,0];const s=getTransformMatrix(n,t,a);s[4]-=n[0];s[5]-=n[1];const r=e.slice();Util.applyTransform(r,s);Util.applyTransform(r,a);return r}getFieldObject(){return this.data.kidIds?{id:this.data.id,actions:this.data.actions,name:this.data.fieldName,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,type:"",kidIds:this.data.kidIds,page:this.data.pageIndex,rotation:this.rotation}:null}reset(){for(const e of this._streams)e.reset()}_constructFieldName(e){if(!e.has("T")&&!e.has("Parent")){warn("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return stringToPDFString(e.get("T"));const t=[];e.has("T")&&t.unshift(stringToPDFString(e.get("T")));let a=e;const n=new RefSet;e.objId&&n.put(e.objId);for(;a.has("Parent");){a=a.get("Parent");if(!(a instanceof Dict)||a.objId&&n.has(a.objId))break;a.objId&&n.put(a.objId);a.has("T")&&t.unshift(stringToPDFString(a.get("T")))}return t.join(".")}get width(){return this.data.rect[2]-this.data.rect[0]}get height(){return this.data.rect[3]-this.data.rect[1]}}class AnnotationBorderStyle{width=1;rawWidth=1;style=te;dashArray=[3];horizontalCornerRadius=0;verticalCornerRadius=0;setWidth(e,t=[0,0,0,0]){if(e instanceof Name)this.width=0;else if("number"==typeof e){if(e>0){this.rawWidth=e;const a=(t[2]-t[0])/2,n=(t[3]-t[1])/2;if(a>0&&n>0&&(e>a||e>n)){warn(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`);e=1}}this.width=e}}setStyle(e){if(e instanceof Name)switch(e.name){case"S":this.style=te;break;case"D":this.style=ae;break;case"B":this.style=ne;break;case"I":this.style=se;break;case"U":this.style=re}}setDashArray(e,t=!1){if(Array.isArray(e)){let a=!0,n=!0;for(const t of e){if(!(+t>=0)){a=!1;break}t>0&&(n=!1)}if(0===e.length||a&&!n){this.dashArray=e;t&&this.setStyle(Name.get("D"))}else this.width=0}else e&&(this.width=0)}setHorizontalCornerRadius(e){Number.isInteger(e)&&(this.horizontalCornerRadius=e)}setVerticalCornerRadius(e){Number.isInteger(e)&&(this.verticalCornerRadius=e)}}class MarkupAnnotation extends Annotation{constructor(e){super(e);const{dict:t}=e;if(t.has("IRT")){const e=t.getRaw("IRT");this.data.inReplyTo=e instanceof Ref?e.toString():null;const a=t.get("RT");this.data.replyType=a instanceof Name?a.name:D}let a=null;if(this.data.replyType===H){const e=t.get("IRT");this.setTitle(e.get("T"));this.data.titleObj=this._title;this.setContents(e.get("Contents"));this.data.contentsObj=this._contents;if(e.has("CreationDate")){this.setCreationDate(e.get("CreationDate"));this.data.creationDate=this.creationDate}else this.data.creationDate=null;if(e.has("M")){this.setModificationDate(e.get("M"));this.data.modificationDate=this.modificationDate}else this.data.modificationDate=null;a=e.getRaw("Popup");if(e.has("C")){this.setColor(e.getArray("C"));this.data.color=this.color}else this.data.color=null}else{this.data.titleObj=this._title;this.setCreationDate(t.get("CreationDate"));this.data.creationDate=this.creationDate;a=t.getRaw("Popup");t.has("C")||(this.data.color=null)}this.data.popupRef=a instanceof Ref?a.toString():null;t.has("RC")&&(this.data.richText=XFAFactory.getRichTextAsHtml(t.get("RC")))}setCreationDate(e){this.creationDate="string"==typeof e?e:null}_setDefaultAppearance({xref:e,extra:a,strokeColor:n,fillColor:s,blendMode:r,strokeAlpha:i,fillAlpha:o,pointsCallback:l}){const f=this.data.rect=t.slice(),c=["q"];a&&c.push(a);n&&c.push(`${n[0]} ${n[1]} ${n[2]} RG`);s&&c.push(`${s[0]} ${s[1]} ${s[2]} rg`);const h=this.data.quadPoints||Float32Array.from([this.rectangle[0],this.rectangle[3],this.rectangle[2],this.rectangle[3],this.rectangle[0],this.rectangle[1],this.rectangle[2],this.rectangle[1]]);for(let e=0,t=h.length;ethis._decodeFormValue(e)).filter(e=>null!==e);return t.length>0?t:null}return e instanceof Name?e.name:"string"==typeof e?stringToPDFString(e):null}hasFieldFlag(e){return!!(this.data.fieldFlags&e)}_isViewable(e){return!0}mustBeViewed(e,t){return t?this.viewable:super.mustBeViewed(e,t)&&!this._hasFlag(this.flags,z)}getRotationMatrix(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);return 0===t?pa:getRotationMatrix(t,this.width,this.height)}getBorderAndBackgroundAppearances(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);if(!this.backgroundColor&&!this.borderColor)return"";const a=0===t||180===t?`0 0 ${this.width} ${this.height} re`:`0 0 ${this.height} ${this.width} re`;let n="";this.backgroundColor&&(n=`${getPdfColor(this.backgroundColor,!0)} ${a} f `);if(this.borderColor){n+=`${this.borderStyle.width||1} w ${getPdfColor(this.borderColor,!1)} ${a} S `}return n}async getOperatorList(e,t,a,n){if(a&h&&!(this instanceof SignatureWidgetAnnotation)&&!this.data.noHTML&&!this.data.hasOwnCanvas)return{opList:new OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,a,n);const s=await this._getAppearance(e,t,a,n);if(this.appearance&&null===s)return super.getOperatorList(e,t,a,n);const r=new OperatorList;if(!this._defaultAppearance||null===s)return{opList:r,separateForm:!1,separateCanvas:!1};const i=!!(this.data.hasOwnCanvas&&a&l),o=[0,0,this.width,this.height],f=getTransformMatrix(this.data.rect,o,[1,0,0,1,0,0]);let c;this.oc&&(c=await e.parseMarkedContentProps(this.oc,null));void 0!==c&&r.addOp(xt,["OC",c]);r.addOp(Bt,[this.data.id,this.data.rect,f,this.getRotationMatrix(n),i]);const u=new StringStream(s);await e.getOperatorList({stream:u,task:t,resources:this._fieldResources.mergedResources,operatorList:r});r.addOp(Dt,[]);void 0!==c&&r.addOp(Ct,[]);return{opList:r,separateForm:!1,separateCanvas:i}}_getMKDict(e){const t=new Dict(null);e&&t.set("R",e);t.setIfArray("BC",getPdfColorArray(this.borderColor));t.setIfArray("BG",getPdfColorArray(this.backgroundColor));return t.size>0?t:null}amendSavedDict(e,t){}setValue(e,t,a,n){const{dict:s,ref:r}=function getParentToUpdate(e,t,a){const n=new RefSet,s=e,r={dict:null,ref:null};for(;e instanceof Dict&&!n.has(t);){n.put(t);if(e.has("T"))break;if(!((t=e.getRaw("Parent"))instanceof Ref))return r;e=a.fetch(t)}if(e instanceof Dict&&e!==s){r.dict=e;r.ref=t}return r}(e,this.ref,a);if(s){if(!n.has(r)){const e=s.clone();e.set("V",t);n.put(r,{data:e});return e}}else e.set("V",t);return null}async save(e,t,a,n){const s=a?.get(this.data.id),r=this._buildFlags(s?.noView,s?.noPrint);let i=s?.value,o=s?.rotation;if(i===this.data.fieldValue||void 0===i){if(!this._hasValueFromXFA&&void 0===o&&void 0===r)return;i||=this.data.fieldValue}if(void 0===o&&!this._hasValueFromXFA&&Array.isArray(i)&&Array.isArray(this.data.fieldValue)&&isArrayEqual(i,this.data.fieldValue)&&void 0===r)return;void 0===o&&(o=this.rotation);let l=null;if(!this._needAppearances){l=await this._getAppearance(e,t,c,a);if(null===l&&void 0===r)return}let f=!1;if(l?.needAppearances){f=!0;l=null}const{xref:h}=e,u=h.fetchIfRef(this.ref);if(!(u instanceof Dict))return;const m=new Dict(h);for(const[e,t]of u.getRawEntries())"AP"!==e&&m.set(e,t);if(void 0!==r){m.set("F",r);if(null===l&&!f){const e=u.getRaw("AP");e&&m.set("AP",e)}}const p={path:this.data.fieldName,value:i},d=this.setValue(m,Array.isArray(i)?i.map(stringToAsciiOrUTF16BE):stringToAsciiOrUTF16BE(i),h,n);this.amendSavedDict(a,d||m);const g=this._getMKDict(o);g&&m.set("MK",g);n.put(this.ref,{data:m,xfa:p,needAppearances:f});if(null!==l){const e=h.getNewTemporaryRef(),t=new Dict(h);m.set("AP",t);t.set("N",e);const s=this._getSaveFieldResources(h),r=new StringStream(l),i=r.dict=new Dict(h);i.setIfName("Subtype","Form");i.set("Resources",s);const f=o%180==0?[0,0,this.width,this.height]:[0,0,this.height,this.width];i.set("BBox",f);const c=this.getRotationMatrix(a);c!==pa&&i.set("Matrix",c);n.put(e,{data:r,xfa:null,needAppearances:!1})}m.set("M",`D:${getModificationDate()}`)}async _getAppearance(e,t,a,n){if(this.data.password)return null;const s=n?.get(this.data.id);let r,o;if(s){r=s.formattedValue||s.value;o=s.rotation}if(void 0===o&&void 0===r&&!this._needAppearances&&(!this._hasValueFromXFA||this.appearance))return null;const l=this.getBorderAndBackgroundAppearances(n);if(void 0===r){r=this.data.fieldValue;if(!r)return`/Tx BMC q ${l}Q EMC`}Array.isArray(r)&&1===r.length&&(r=r[0]);assert("string"==typeof r,"Expected `value` to be a string.");r=r.trimEnd();if(this.data.combo){const e=this.data.options.find(({exportValue:e})=>r===e);r=e?.displayValue||r}if(""===r)return`/Tx BMC q ${l}Q EMC`;void 0===o&&(o=this.rotation);let f,h=-1;if(this.data.multiLine){f=r.split(/\r\n?|\n/).map(e=>e.normalize("NFC"));h=f.length}else f=[r.replace(/\r\n?|\n/,"").normalize("NFC")];let{width:u,height:m}=this;90!==o&&270!==o||([u,m]=[m,u]);this._defaultAppearance||(this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance="/Helvetica 0 Tf 0 g"));let p,d,g,b=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources);const w=[];let j=!1;for(const e of f){const t=b.encodeString(e);t.length>1&&(j=!0);w.push(t.join(""))}if(j&&a&c)return{needAppearances:!0};if(j&&this._isOffscreenCanvasSupported){const a=this.data.comb?"monospace":"sans-serif",n=new FakeUnicodeFont(e.xref,a),s=n.createFontResources(f.join("")),i=s.getRaw("Font");if(this._fieldResources.mergedResources.has("Font")){const e=this._fieldResources.mergedResources.get("Font");for(const[t,a]of i.getRawEntries())e.set(t,a)}else this._fieldResources.mergedResources.set("Font",i);const o=n.fontName.name;b=await WidgetAnnotation._getFontData(e,t,{fontName:o,fontSize:0},s);for(let e=0,t=w.length;e2)return`/Tx BMC q ${l}BT `+p+` 1 0 0 1 ${numberToString(2)} ${numberToString(v)} Tm (${escapeString(w[0])}) Tj ET Q EMC`;return`/Tx BMC q ${l}BT `+p+` 1 0 0 1 0 0 Tm ${this._renderText(w[0],b,d,u,q,{shift:0},2,v)} ET Q EMC`}static async _getFontData(e,t,a,n){const s=new OperatorList,r={font:null,clone(){return this}},{fontName:i,fontSize:o}=a;await e.handleSetFont(n,[i&&Name.get(i),o],null,s,t,r,null);return r.font}_getTextWidth(e,t){return Math.sumPrecise(t.charsToGlyphs(e).map(e=>e.width))/1e3}_computeFontSize(e,t,a,n,r){let{fontSize:i}=this.data.defaultAppearanceData,o=(i||12)*s,l=Math.round(e/o);if(!i){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===r){const r=this._getTextWidth(a,n);i=roundWithTwoDigits(Math.min(e/s,t/r));l=1}else{const f=a.split(/\r\n?|\n/),c=[];for(const e of f){const t=n.encodeString(e).join(""),a=n.charsToGlyphs(t),s=n.getCharPositions(t);c.push({line:t,glyphs:a,positions:s})}const isTooBig=a=>{let s=0;for(const r of c){s+=this._splitLine(null,n,a,t,r).length*a;if(s>e)return!0}return!1};l=Math.max(l,r);for(;;){o=e/l;i=roundWithTwoDigits(o/s);if(!isTooBig(i))break;l++}}const{fontName:f,fontColor:c}=this.data.defaultAppearanceData;this._defaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:a}){return`/${escapePDFName(t)} ${e} Tf ${getPdfColor(a,!0)}`}({fontSize:i,fontName:f,fontColor:c})}return[this._defaultAppearance,i,e/l]}_renderText(e,t,a,n,s,r,i,o){let l;if(1===s){l=(n-this._getTextWidth(e,t)*a)/2}else if(2===s){l=n-this._getTextWidth(e,t)*a-i}else l=i;const f=numberToString(l-r.shift);r.shift=l;return`${f} ${o=numberToString(o)} Td (${escapeString(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:a,acroFormResources:n}=this._fieldResources,s=this.data.defaultAppearanceData?.fontName;if(!s)return t||Dict.empty;for(const e of[t,a])if(e instanceof Dict){const t=e.get("Font");if(t instanceof Dict&&t.has(s))return e}if(n instanceof Dict){const a=n.get("Font");if(a instanceof Dict&&a.has(s)){const n=new Dict(e);n.set(s,a.getRaw(s));const r=new Dict(e);r.set("Font",n);return Dict.merge({xref:e,dictArray:[r,t],mergeSubDicts:!0})}}return t||Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t}=e;if(t.has("PMD")){this.flags|=N;this.data.hidden=!0;warn("Barcodes are not supported")}this.data.hasOwnCanvas=this.data.readOnly&&!this.data.noHTML;this._hasText=!0;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let a=getInheritableProperty({dict:t,key:"Q"});(!Number.isInteger(a)||a<0||a>2)&&(a=null);this.data.textAlignment=a;let n=getInheritableProperty({dict:t,key:"MaxLen"});(!Number.isInteger(n)||n<0)&&(n=0);this.data.maxLen=n;this.data.multiLine=this.hasFieldFlag(K);this.data.comb=this.hasFieldFlag(ee)&&!this.data.multiLine&&!this.data.password&&!this.hasFieldFlag(J)&&0!==this.data.maxLen;this.data.doNotScroll=this.hasFieldFlag(Z);const{data:{actions:s}}=this;if(!s)return;const r=/^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\(['"]?([^'"]+)['"]?\);$/;let i=!1;(1===s.Format?.length&&1===s.Keystroke?.length&&r.test(s.Format[0])&&r.test(s.Keystroke[0])||0===s.Format?.length&&1===s.Keystroke?.length&&r.test(s.Keystroke[0])||0===s.Keystroke?.length&&1===s.Format?.length&&r.test(s.Format[0]))&&(i=!0);const o=[];s.Format&&o.push(...s.Format);s.Keystroke&&o.push(...s.Keystroke);if(i){delete s.Keystroke;s.Format=o}for(const e of o){const t=e.match(r);if(!t)continue;const a="Date"===t[1];let n=t[2];const s=parseInt(n,10);isNaN(s)||Math.floor(Math.log10(s))+1!==t[2].length||(n=(a?Ri:Hi)[s]??n);this.data.datetimeFormat=n;if(!i)break;if(a){if(/HH|MM|ss|h/.test(n)){this.data.datetimeType="datetime-local";this.data.timeStep=/ss/.test(n)?1:60}else this.data.datetimeType="date";break}this.data.datetimeType="time";this.data.timeStep=/ss/.test(n)?1:60;break}}get hasTextContent(){return!!this.appearance&&!this._needAppearances}_getCombAppearance(e,t,a,n,s,r,i,o,l,f,c,h,u){const m=s/this.data.maxLen,p=this.getBorderAndBackgroundAppearances(u),d=[],g=t.getCharPositions(a);for(const[e,t]of g)d.push(`(${escapeString(a.substring(e,t))}) Tj`);h&&d.reverse();const b=m*g.length;let w=i;1===c?w+=Math.floor((s-b)/(2*m))*m:2===c&&(w+=s-b);const j=d.join(` ${numberToString(m)} 0 Td `);return`/Tx BMC q ${p}BT `+e+` 1 0 0 1 ${numberToString(w)} ${numberToString(o+l)} Tm ${j} ET Q EMC`}_getMultilineAppearance(e,t,a,n,s,r,i,o,l,f,c,h){const u=[],m=s-2*o,p={shift:0};for(let e=0,r=t.length;en){l.push(e.substring(u,a));u=a;m=d;f=-1;h=-1}else{m+=d;f=a;c=s;h=t}else if(m+d>n)if(-1!==f){l.push(e.substring(u,c));u=c;t=h+1;f=-1;m=0}else{l.push(e.substring(u,a));u=a;m=d}else m+=d}ut?`\\${t}`:"\\s+");new RegExp(`^\\s*${r}\\s*$`).test(this.data.fieldValue)&&(this.data.textContent=this.data.fieldValue.split("\n"))}getFieldObject(){return{id:this.data.id,value:this.data.fieldValue,defaultValue:this.data.defaultFieldValue||"",multiline:this.data.multiLine,password:this.data.password,charLimit:this.data.maxLen,comb:this.data.comb,editable:!this.data.readOnly,hidden:this.data.hidden,name:this.data.fieldName,rect:this.data.rect,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,datetimeFormat:this.data.datetimeFormat,hasDatetimeHTML:!!this.data.datetimeType,type:"text"}}}class ButtonWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.checkedAppearance=null;this.uncheckedAppearance=null;const t=this.hasFieldFlag(V),a=this.hasFieldFlag($);this.data.checkBox=!t&&!a;this.data.radioButton=t&&!a;this.data.pushButton=a;this.data.isTooltipOnly=!1;if(this.data.checkBox)this._processCheckBox(e);else if(this.data.radioButton)this._processRadioButton(e);else if(this.data.pushButton){this.data.hasOwnCanvas=!0;this.data.noHTML=!1;this._processPushButton(e)}else warn("Invalid field flags for button widget annotation")}async getOperatorList(e,t,a,n){if(this.data.pushButton)return super.getOperatorList(e,t,a,!1,n);let s=null,r=null;if(n){const e=n.get(this.data.id);s=e?e.value:null;r=e?e.rotation:null}if(null===s&&this.appearance)return super.getOperatorList(e,t,a,n);null==s&&(s=this.data.checkBox?this.data.fieldValue===this.data.exportValue:this.data.fieldValue===this.data.buttonValue);const i=s?this.checkedAppearance:this.uncheckedAppearance;if(i){const s=this.appearance,o=lookupMatrix(i.dict.getArray("Matrix"),pa);r&&i.dict.set("Matrix",this.getRotationMatrix(n));this.appearance=i;const l=super.getOperatorList(e,t,a,n);this.appearance=s;i.dict.set("Matrix",o);return l}return{opList:new OperatorList,separateForm:!1,separateCanvas:!1}}async save(e,t,a,n){this.data.checkBox?this._saveCheckbox(e,t,a,n):this.data.radioButton&&this._saveRadioButton(e,t,a,n)}async _saveCheckbox(e,t,a,n){if(!a)return;const s=a.get(this.data.id),r=this._buildFlags(s?.noView,s?.noPrint);let i=s?.rotation,o=s?.value;if(void 0===i&&void 0===r){if(void 0===o)return;if(this.data.fieldValue===this.data.exportValue===o)return}let l=e.xref.fetchIfRef(this.ref);if(!(l instanceof Dict))return;l=l.clone();void 0===i&&(i=this.rotation);void 0===o&&(o=this.data.fieldValue===this.data.exportValue);const f={path:this.data.fieldName,value:o?this.data.exportValue:""},c=Name.get(o?this.data.exportValue:"Off");this.setValue(l,c,e.xref,n);l.set("AS",c);l.set("M",`D:${getModificationDate()}`);void 0!==r&&l.set("F",r);const h=this._getMKDict(i);h&&l.set("MK",h);n.put(this.ref,{data:l,xfa:f,needAppearances:!1})}async _saveRadioButton(e,t,a,n){if(!a)return;const s=a.get(this.data.id),r=this._buildFlags(s?.noView,s?.noPrint);let i=s?.rotation,o=s?.value;if(void 0===i&&void 0===r){if(void 0===o)return;if(this.data.fieldValue===this.data.buttonValue===o)return}let l=e.xref.fetchIfRef(this.ref);if(!(l instanceof Dict))return;l=l.clone();void 0===o&&(o=this.data.fieldValue===this.data.buttonValue);void 0===i&&(i=this.rotation);const f={path:this.data.fieldName,value:o?this.data.buttonValue:""},c=Name.get(o?this.data.buttonValue:"Off");o&&this.setValue(l,c,e.xref,n);l.set("AS",c);l.set("M",`D:${getModificationDate()}`);void 0!==r&&l.set("F",r);const h=this._getMKDict(i);h&&l.set("MK",h);n.put(this.ref,{data:l,xfa:f,needAppearances:!1})}_getDefaultCheckedAppearance(e,t){const{width:a,height:n}=this,s=[0,0,a,n],r=.8*Math.min(a,n);let i,o;if("check"===t){i={width:.755*r,height:.705*r};o="3"}else if("disc"===t){i={width:.791*r,height:.705*r};o="l"}else unreachable(`_getDefaultCheckedAppearance - unsupported type: ${t}`);const l=`q BT /PdfJsZaDb ${r} Tf 0 g ${numberToString((a-i.width)/2)} ${numberToString((n-i.height)/2)} Td (${o}) Tj ET Q`,f=new Dict(e.xref);f.set("FormType",1);f.setIfName("Subtype","Form");f.setIfName("Type","XObject");f.set("BBox",s);f.set("Matrix",[1,0,0,1,0,0]);f.set("Length",l.length);const c=new Dict(e.xref),h=new Dict(e.xref);h.set("PdfJsZaDb",this.fallbackFontDict);c.set("Font",h);f.set("Resources",c);this.checkedAppearance=new StringStream(l);this.checkedAppearance.dict=f;this._streams.push(this.checkedAppearance)}_processCheckBox(e){const t=e.dict.get("AP");if(!(t instanceof Dict))return;const a=t.get("N");if(!(a instanceof Dict))return;const n=this._decodeFormValue(e.dict.get("AS"));"string"==typeof n&&(this.data.fieldValue=n);const s=null!==this.data.fieldValue&&"Off"!==this.data.fieldValue?this.data.fieldValue:"Yes",r=[...a.getKeys()];if(0===r.length)r.push("Off",s);else if(1===r.length)"Off"===r[0]?r.push(s):r.unshift("Off");else if(r.includes(s)){r.length=0;r.push("Off",s)}else{const e=r.find(e=>"Off"!==e);r.length=0;r.push("Off",e)}r.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=r[1];const i=a.get(this.data.exportValue);this.checkedAppearance=i instanceof BaseStream?i:null;const o=a.get("Off");this.uncheckedAppearance=o instanceof BaseStream?o:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"check");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processRadioButton(e){this.data.buttonValue=null;const t=e.dict.get("Parent");if(t instanceof Dict){this.parent=e.dict.getRaw("Parent");const a=t.get("V");a instanceof Name&&(this.data.fieldValue=this._decodeFormValue(a))}const a=e.dict.get("AP");if(!(a instanceof Dict))return;const n=a.get("N");if(!(n instanceof Dict))return;for(const e of n.getKeys())if("Off"!==e){this.data.buttonValue=e;break}const s=n.get(this.data.buttonValue);this.checkedAppearance=s instanceof BaseStream?s:null;const r=n.get("Off");this.uncheckedAppearance=r instanceof BaseStream?r:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"disc");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processPushButton(e){const{dict:t,annotationGlobals:a}=e;if(t.has("A")||t.has("AA")||this.data.alternativeText){this.data.isTooltipOnly=!t.has("A")&&!t.has("AA");Catalog.parseDestDictionary({destDict:t,resultObj:this.data,docBaseUrl:a.baseUrl,docAttachments:a.attachments})}else warn("Push buttons without action dictionaries are not supported")}getFieldObject(){let e,t="button";if(this.data.checkBox){t="checkbox";e=this.data.exportValue}else if(this.data.radioButton){t="radiobutton";e=this.data.buttonValue}return{id:this.data.id,value:this.data.fieldValue||"Off",defaultValue:this.data.defaultFieldValue,exportValues:e,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,hidden:this.data.hidden,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:t}}get fallbackFontDict(){const e=new Dict;e.setIfName("BaseFont","ZapfDingbats");e.setIfName("Type","FallbackType");e.setIfName("Subtype","FallbackType");e.setIfName("Encoding","ZapfDingbatsEncoding");return shadow(this,"fallbackFontDict",e)}}class ChoiceWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t,xref:a}=e;this.indices=t.getArray("I");this.hasIndices=Array.isArray(this.indices)&&this.indices.length>0;this.data.options=[];const n=getInheritableProperty({dict:t,key:"Opt"});if(Array.isArray(n))for(let e=0,t=n.length;e=0&&t0&&(this.data.options=this.data.fieldValue.map(e=>({exportValue:e,displayValue:e})));this.data.combo=this.hasFieldFlag(Y);this.data.multiSelect=this.hasFieldFlag(Q);this._hasText=!0}getFieldObject(){const e=this.data.combo?"combobox":"listbox",t=this.data.fieldValue.length>0?this.data.fieldValue[0]:null;return{id:this.data.id,value:t,defaultValue:this.data.defaultFieldValue,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,numItems:this.data.fieldValue.length,multipleSelection:this.data.multiSelect,hidden:this.data.hidden,actions:this.data.actions,items:this.data.options,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:e}}amendSavedDict(e,t){if(!this.hasIndices)return;let a=e?.get(this.data.id)?.value;Array.isArray(a)||(a=[a]);const n=[],{options:s}=this.data;for(let e=0,t=0,r=s.length;ea){a=n;t=e}}[m,p]=this._computeFontSize(e,l-4,t,u,-1)}const d=p*s,g=(d-p)/2,b=Math.floor(f/d);let w=0;if(h.length>0){const e=Math.min(...h),t=Math.max(...h);w=Math.max(0,t-b+1);w>e&&(w=e)}const j=Math.min(w+b+1,c),k=["/Tx BMC q",`1 1 ${l} ${f} re W n`];if(h.length){k.push("0.600006 0.756866 0.854904 rg");for(const e of h)w<=e&&ee.trimEnd());const{coords:e,bbox:t,matrix:a}=FakeUnicodeFont.getFirstPositionInfo(this.rectangle,this.rotation,n);this.data.textPosition=this._transformPoint(e,t,a)}if(this._isOffscreenCanvasSupported){const s=e.dict.get("CA"),r=new FakeUnicodeFont(a,"sans-serif");this.appearance=r.createAppearance(this._contents.str,this.rectangle,this.rotation,n,t,s);this._streams.push(this.appearance)}else warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.")}}get hasTextContent(){return this._hasAppearance}static createNewDict(e,t,{apRef:a,ap:n}){const{color:s,date:r,fontSize:i,oldAnnotation:o,rect:l,rotation:f,user:c,value:h}=e,u=o||new Dict(t);u.setIfNotExists("Type",Name.get("Annot"));u.setIfNotExists("Subtype",Name.get("FreeText"));u.set(o?"M":"CreationDate",`D:${getModificationDate(r)}`);o&&u.delete("RC");u.setIfArray("Rect",l);const m=`/Helv ${i} Tf ${getPdfColor(s,!0)}`;u.set("DA",m);u.setIfDefined("Contents",stringToAsciiOrUTF16BE(h));u.setIfNotExists("F",4);u.setIfNotExists("Border",[0,0,0]);u.setIfNumber("Rotate",f);u.setIfDefined("T",stringToAsciiOrUTF16BE(c));if(a||n){const e=new Dict(t);u.set("AP",e);e.set("N",a||n)}return u}static async createNewAppearanceStream(e,t,a){const{baseFontRef:n,evaluator:r,task:i}=a,{color:o,fontSize:l,rect:f,rotation:c,value:h}=e;if(!o)return null;const u=new Dict(t),m=new Dict(t);if(n)m.set("Helv",n);else{const e=new Dict(t);e.setIfName("BaseFont","Helvetica");e.setIfName("Type","Font");e.setIfName("Subtype","Type1");e.setIfName("Encoding","WinAnsiEncoding");m.set("Helv",e)}u.set("Font",m);const p=await WidgetAnnotation._getFontData(r,i,{fontName:"Helv",fontSize:l},u),[d,g,b,w]=f;let j=b-d,k=w-g;c%180!=0&&([j,k]=[k,j]);const y=h.split("\n"),q=l/1e3;let v=-1/0;const S=[];for(let e of y){const t=p.encodeString(e);if(t.length>1)return null;e=t.join("");S.push(e);let a=0;const n=p.charsToGlyphs(e);for(const e of n)a+=e.width*q;v=Math.max(v,a)}let x=1;v>j&&(x=j/v);let C=1;const F=s*l,T=1*l,O=F*y.length;O>k&&(C=k/O);const R=l*Math.min(x,C);let H,D,M;switch(c){case 0:M=[1,0,0,1];D=[f[0],f[1],j,k];H=[f[0],f[3]-T];break;case 90:M=[0,1,-1,0];D=[f[1],-f[2],j,k];H=[f[1],-f[0]-T];break;case 180:M=[-1,0,0,-1];D=[-f[2],-f[3],j,k];H=[-f[2],-f[1]-T];break;case 270:M=[0,-1,1,0];D=[-f[3],f[0],j,k];H=[-f[3],f[2]-T]}const N=["q",`${M.join(" ")} 0 0 cm`,`${D.join(" ")} re W n`,"BT",`${getPdfColor(o,!0)}`,`0 Tc /Helv ${numberToString(R)} Tf`];N.push(`${H.join(" ")} Td (${escapeString(S[0])}) Tj`);const E=numberToString(F);for(let e=1,t=S.length;e{e.push(`${n[0]} ${n[1]} m`,`${n[2]} ${n[3]} l`,"S");return[t[0]-o,t[7]-o,t[2]+o,t[3]+o]}})}}}class SquareAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:a}=e;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;if(!this.appearance){const e=getPdfColorArray(this.color,[0,0,0]),n=t.get("CA"),s=getPdfColorArray(getRgbColor(t.getArray("IC"),null)),r=s?n:null;if(0===this.borderStyle.width&&!s)return;this._setDefaultAppearance({xref:a,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:s,strokeAlpha:n,fillAlpha:r,pointsCallback:(e,t)=>{const a=t[4]+this.borderStyle.width/2,n=t[5]+this.borderStyle.width/2,r=t[6]-t[4]-this.borderStyle.width,i=t[3]-t[7]-this.borderStyle.width;e.push(`${a} ${n} ${r} ${i} re`);s?e.push("B"):e.push("S");return[t[0],t[7],t[2],t[3]]}})}}}class CircleAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:a}=e;if(!this.appearance){const e=getPdfColorArray(this.color,[0,0,0]),n=t.get("CA"),s=getPdfColorArray(getRgbColor(t.getArray("IC"),null)),r=s?n:null;if(0===this.borderStyle.width&&!s)return;const i=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:a,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:s,strokeAlpha:n,fillAlpha:r,pointsCallback:(e,t)=>{const a=t[0]+this.borderStyle.width/2,n=t[1]-this.borderStyle.width/2,r=t[6]-this.borderStyle.width/2,o=t[7]+this.borderStyle.width/2,l=a+(r-a)/2,f=n+(o-n)/2,c=(r-a)/2*i,h=(o-n)/2*i;e.push(`${l} ${o} m`,`${l+c} ${o} ${r} ${f+h} ${r} ${f} c`,`${r} ${f-h} ${l+c} ${n} ${l} ${n} c`,`${l-c} ${n} ${a} ${f-h} ${a} ${f} c`,`${a} ${f+h} ${l-c} ${o} ${l} ${o} c`,"h");s?e.push("B"):e.push("S");return[t[0],t[7],t[2],t[3]]}})}}}class PolylineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:a,xref:n}=e;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;this.data.vertices=null;if(!(this instanceof PolygonAnnotation)){this.setLineEndings(a.getArray("LE"));this.data.lineEndings=this.lineEndings}const s=a.getArray("Vertices");if(!isNumberArray(s,null))return;const r=this.data.vertices=Float32Array.from(s);if(!this.appearance){const e=getPdfColorArray(this.color,[0,0,0]),s=a.get("CA");let i,o=getRgbColor(a.getArray("IC"),null);o&&(o=getPdfColorArray(o));i=o?this.color?o.every((t,a)=>t===e[a])?"f":"B":"f":"S";const l=this.borderStyle.width||1,f=2*l,c=t.slice();for(let e=0,t=r.length;e{for(let t=0,a=r.length;t{for(const t of this.data.inkLists){for(let a=0,n=t.length;a0){const e=new Dict(t);p.set("BS",e);e.set("W",u)}p.setIfArray("C",getPdfColorArray(r));p.setIfNumber("CA",o);if(n||a){const e=new Dict(t);p.set("AP",e);e.set("N",a||n)}return p}static async createNewAppearanceStream(e,t,a){if(e.outlines)return this.createNewAppearanceStreamForHighlight(e,t,a);const{color:n,rect:s,paths:r,thickness:i,opacity:o}=e;if(!n)return null;const l=[`${i} w 1 J 1 j`,`${getPdfColor(n,!1)}`];1!==o&&l.push("/R0 gs");for(const e of r.lines){l.push(`${numberToString(e[4])} ${numberToString(e[5])} m`);for(let t=6,a=e.length;t{e.push(`${t[0]} ${t[1]} m`,`${t[2]} ${t[3]} l`,`${t[6]} ${t[7]} l`,`${t[4]} ${t[5]} l`,"f");return[t[0],t[7],t[2],t[3]]}})}}else this.data.popupRef=null}get overlaysTextContent(){return!0}static createNewDict(e,t,{apRef:a,ap:n}){const{color:s,date:r,oldAnnotation:i,opacity:o,rect:l,rotation:f,user:c,quadPoints:h}=e,u=i||new Dict(t);u.setIfNotExists("Type",Name.get("Annot"));u.setIfNotExists("Subtype",Name.get("Highlight"));u.set(i?"M":"CreationDate",`D:${getModificationDate(r)}`);u.setIfArray("Rect",l);u.setIfNotExists("F",4);u.setIfNotExists("Border",[0,0,0]);u.setIfNumber("Rotate",f);u.setIfArray("QuadPoints",h);u.setIfArray("C",getPdfColorArray(s));u.setIfNumber("CA",o);u.setIfDefined("T",stringToAsciiOrUTF16BE(c));if(a||n){const e=new Dict(t);u.set("AP",e);e.set("N",a||n)}return u}static async createNewAppearanceStream(e,t,a){const{color:n,rect:s,outlines:r,opacity:i}=e;if(!n)return null;const o=[`${getPdfColor(n,!0)}`,"/R0 gs"],l=[];for(const e of r){l.length=0;l.push(`${numberToString(e[0])} ${numberToString(e[1])} m`);for(let t=2,a=e.length;t{e.push(`${t[4]} ${t[5]+1.3} m`,`${t[6]} ${t[7]+1.3} l`,"S");return[t[0],t[7],t[2],t[3]]}})}}else this.data.popupRef=null}get overlaysTextContent(){return!0}}class SquigglyAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:a}=e;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=getPdfColorArray(this.color,[0,0,0]),n=t.get("CA");this._setDefaultAppearance({xref:a,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:n,pointsCallback:(e,t)=>{const a=(t[1]-t[5])/6;let n=a,s=t[4];const r=t[5],i=t[6];e.push(`${s} ${r+n} m`);do{s+=2;n=0===n?a:0;e.push(`${s} ${r+n} l`)}while(s{e.push((t[0]+t[4])/2+" "+(t[1]+t[5])/2+" m",(t[2]+t[6])/2+" "+(t[3]+t[7])/2+" l","S");return[t[0],t[7],t[2],t[3]]}})}}else this.data.popupRef=null}get overlaysTextContent(){return!0}}class StampAnnotation extends MarkupAnnotation{#ot=null;constructor(e){super(e);this.data.hasOwnCanvas=this.data.noRotate;this.data.isEditable=!this.data.noHTML;this.data.noHTML=!1}mustBeViewedWhenEditing(e,t=null){if(e){if(!this.data.isEditable)return!0;this.#ot??=this.data.hasOwnCanvas;this.data.hasOwnCanvas=!0;return!0}if(null!==this.#ot){this.data.hasOwnCanvas=this.#ot;this.#ot=null}return!t?.has(this.data.id)}static async createImage(e,t){const{width:a,height:n}=e,s=new OffscreenCanvas(a,n),r=s.getContext("2d",{alpha:!0});r.drawImage(e,0,0);const i=r.getImageData(0,0,a,n).data,o=new Uint32Array(i.buffer),l=o.some(FeatureTest.isLittleEndian?e=>e>>>24!=255:e=>!!(255&~e));if(l){r.fillStyle="white";r.fillRect(0,0,a,n);r.drawImage(e,0,0)}const f=s.convertToBlob({type:"image/jpeg",quality:1}).then(e=>e.bytes()),c=Name.get("XObject"),h=Name.get("Image"),u=new Dict(t);u.set("Type",c);u.set("Subtype",h);u.set("BitsPerComponent",8);u.setIfName("ColorSpace","DeviceRGB");u.setIfName("Filter","DCTDecode");u.set("BBox",[0,0,a,n]);u.set("Width",a);u.set("Height",n);let m=null;if(l){const e=new Uint8Array(o.length);if(FeatureTest.isLittleEndian)for(let t=0,a=o.length;t>>24;else for(let t=0,a=o.length;t=0&&s<=1?s:null}}const df={get r(){return shadow(this,"r",new Uint8Array([7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21]))},get k(){return shadow(this,"k",new Int32Array([-680876936,-389564586,606105819,-1044525330,-176418897,1200080426,-1473231341,-45705983,1770035416,-1958414417,-42063,-1990404162,1804603682,-40341101,-1502002290,1236535329,-165796510,-1069501632,643717713,-373897302,-701558691,38016083,-660478335,-405537848,568446438,-1019803690,-187363961,1163531501,-1444681467,-51403784,1735328473,-1926607734,-378558,-2022574463,1839030562,-35309556,-1530992060,1272893353,-155497632,-1094730640,681279174,-358537222,-722521979,76029189,-640364487,-421815835,530742520,-995338651,-198630844,1126891415,-1416354905,-57434055,1700485571,-1894986606,-1051523,-2054922799,1873313359,-30611744,-1560198380,1309151649,-145523070,-1120210379,718787259,-343485551]))}};function calculateMD5(e,t,a){let n=1732584193,s=-271733879,r=-1732584194,i=271733878;const o=a+72&-64,l=new Uint8Array(o);let f,c;for(f=0;f>5&255;l[f++]=a>>13&255;l[f++]=a>>21&255;l[f++]=a>>>29&255;f+=3;const u=new Int32Array(16),{k:m,r:p}=df;for(f=0;f>>32-r)|0;a=n}n=n+a|0;s=s+o|0;r=r+h|0;i=i+d|0}return new Uint8Array([255&n,n>>8&255,n>>16&255,n>>>24&255,255&s,s>>8&255,s>>16&255,s>>>24&255,255&r,r>>8&255,r>>16&255,r>>>24&255,255&i,i>>8&255,i>>16&255,i>>>24&255])}function decodeString(e){try{return stringToUTF8String(e)}catch(t){warn(`UTF-8 decoding failed: "${t}".`);return e}}class DatasetXMLParser extends SimpleXMLParser{node=null;onEndElement(e){const t=super.onEndElement(e);if(t&&"xfa:datasets"===e){this.node=t;throw new Error("Aborting DatasetXMLParser.")}}}class DatasetReader{constructor(e){if(e.datasets)this.node=new SimpleXMLParser({hasAttributes:!0}).parseFromString(e.datasets).documentElement;else{const t=new DatasetXMLParser({hasAttributes:!0});try{t.parseFromString(e["xdp:xdp"])}catch{}this.node=t.node}}getValue(e){if(!this.node||!e)return"";const t=this.node.searchNode(parseXFAPath(e),0);if(!t)return"";const a=t.firstChild;return"value"===a?.nodeName?t.children.map(e=>decodeString(e.textContent)):decodeString(t.textContent)}}class SingleIntersector{#ft;minX=1/0;minY=1/0;maxX=-1/0;maxY=-1/0;#ct=null;#ht=[];#ut=[];#mt=-1;#pt=!1;constructor(e){this.#ft=e;const t=e.data.quadPoints;if(t){for(let e=0,a=t.length;e8&&(this.#ct=t)}else[this.minX,this.minY,this.maxX,this.maxY]=e.data.rect}#dt(e,t){if(this.minX>=e||this.maxX<=e||this.minY>=t||this.maxY<=t)return!1;const a=this.#ct;if(!a)return!0;if(this.#mt>=0){const n=this.#mt;if(!(a[n]>=e||a[n+2]<=e||a[n+5]>=t||a[n+1]<=t))return!0;this.#mt=-1}for(let n=0,s=a.length;n=e||a[n+2]<=e||a[n+5]>=t||a[n+1]<=t)){this.#mt=n;return!0}return!1}addGlyph(e,t,a){if(!this.#dt(e,t)){this.disableExtraChars();return!1}if(this.#ut.length>0){this.#ht.push(this.#ut.join(""));this.#ut.length=0}this.#ht.push(a);this.#pt=!0;return!0}addExtraChar(e){this.#pt&&this.#ut.push(e)}disableExtraChars(){if(this.#pt){this.#pt=!1;this.#ut.length=0}}setText(){this.#ft.data.overlaidText=this.#ht.join("")}}const gf=64;class Intersector{#gt=[];#bt=[];#wt;#jt;#kt;#yt;#qt;#vt;constructor(e){let t=1/0,a=1/0,n=-1/0,s=-1/0;const r=this.#gt;for(const i of e){if(!i.data.quadPoints&&!i.data.rect)continue;const e=new SingleIntersector(i);r.push(e);t=Math.min(t,e.minX);a=Math.min(a,e.minY);n=Math.max(n,e.maxX);s=Math.max(s,e.maxY)}this.#wt=t;this.#kt=a;this.#jt=n;this.#yt=s;this.#qt=63/(n-t);this.#vt=63/(s-a);for(const e of r){const t=this.#St(e.minX,e.minY),a=this.#St(e.maxX,e.maxY),n=(a-t)%gf,s=Math.floor((a-t)/gf);for(let a=t;a<=t+s*gf;a+=gf)for(let t=0;t<=n;t++){let n=this.#bt[a+t];n||(this.#bt[a+t]=n=[]);n.push(e)}}}#St(e,t){return Math.floor((e-this.#wt)*this.#qt)+Math.floor((t-this.#kt)*this.#vt)*gf}addGlyph(e,t,a,n){const s=e[4]+t/2,r=e[5]+a/2;if(sthis.#jt||r>this.#yt)return;const i=this.#bt[this.#St(s,r)];if(i)for(const e of i)e.addGlyph(s,r,n)}addExtraChar(e){for(const t of this.#gt)t.addExtraChar(e)}setText(){for(const e of this.#gt)e.setText()}}class Word64{constructor(e,t){this.high=0|e;this.low=0|t}and(e){this.high&=e.high;this.low&=e.low}xor(e){this.high^=e.high;this.low^=e.low}shiftRight(e){if(e>=32){this.low=this.high>>>e-32|0;this.high=0}else{this.low=this.low>>>e|this.high<<32-e;this.high=this.high>>>e|0}}rotateRight(e){let t,a;if(32&e){a=this.low;t=this.high}else{t=this.low;a=this.high}e&=31;this.low=t>>>e|a<<32-e;this.high=a>>>e|t<<32-e}not(){this.high=~this.high;this.low=~this.low}add(e){const t=(this.low>>>0)+(e.low>>>0);let a=(this.high>>>0)+(e.high>>>0);t>4294967295&&(a+=1);this.low=0|t;this.high=0|a}copyTo(e,t){e[t]=this.high>>>24&255;e[t+1]=this.high>>16&255;e[t+2]=this.high>>8&255;e[t+3]=255&this.high;e[t+4]=this.low>>>24&255;e[t+5]=this.low>>16&255;e[t+6]=this.low>>8&255;e[t+7]=255&this.low}assign(e){this.high=e.high;this.low=e.low}}const bf={get k(){return shadow(this,"k",[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)])}};function ch(e,t,a,n,s){e.assign(t);e.and(a);s.assign(t);s.not();s.and(n);e.xor(s)}function maj(e,t,a,n,s){e.assign(t);e.and(a);s.assign(t);s.and(n);e.xor(s);s.assign(a);s.and(n);e.xor(s)}function sigma(e,t,a){e.assign(t);e.rotateRight(28);a.assign(t);a.rotateRight(34);e.xor(a);a.assign(t);a.rotateRight(39);e.xor(a)}function sigmaPrime(e,t,a){e.assign(t);e.rotateRight(14);a.assign(t);a.rotateRight(18);e.xor(a);a.assign(t);a.rotateRight(41);e.xor(a)}function littleSigma(e,t,a){e.assign(t);e.rotateRight(1);a.assign(t);a.rotateRight(8);e.xor(a);a.assign(t);a.shiftRight(7);e.xor(a)}function littleSigmaPrime(e,t,a){e.assign(t);e.rotateRight(19);a.assign(t);a.rotateRight(61);e.xor(a);a.assign(t);a.shiftRight(6);e.xor(a)}function calculateSHA512(e,t,a,n=!1){let s,r,i,o,l,f,c,h;if(n){s=new Word64(3418070365,3238371032);r=new Word64(1654270250,914150663);i=new Word64(2438529370,812702999);o=new Word64(355462360,4144912697);l=new Word64(1731405415,4290775857);f=new Word64(2394180231,1750603025);c=new Word64(3675008525,1694076839);h=new Word64(1203062813,3204075428)}else{s=new Word64(1779033703,4089235720);r=new Word64(3144134277,2227873595);i=new Word64(1013904242,4271175723);o=new Word64(2773480762,1595750129);l=new Word64(1359893119,2917565137);f=new Word64(2600822924,725511199);c=new Word64(528734635,4215389547);h=new Word64(1541459225,327033209)}const u=128*Math.ceil((a+17)/128),m=new Uint8Array(u);let p,d;for(p=0;p>>29&255;m[p++]=a>>21&255;m[p++]=a>>13&255;m[p++]=a>>5&255;m[p++]=a<<3&255;const b=new Array(80);for(p=0;p<80;p++)b[p]=new Word64(0,0);const{k:w}=bf;let j=new Word64(0,0),k=new Word64(0,0),y=new Word64(0,0),q=new Word64(0,0),v=new Word64(0,0),S=new Word64(0,0),x=new Word64(0,0),C=new Word64(0,0);const F=new Word64(0,0),T=new Word64(0,0),O=new Word64(0,0),R=new Word64(0,0);let H,D;for(p=0;p>>t|e<<32-t}function calculate_sha256_ch(e,t,a){return e&t^~e&a}function calculate_sha256_maj(e,t,a){return e&t^e&a^t&a}function calculate_sha256_sigma(e){return rotr(e,2)^rotr(e,13)^rotr(e,22)}function calculate_sha256_sigmaPrime(e){return rotr(e,6)^rotr(e,11)^rotr(e,25)}function calculate_sha256_littleSigma(e){return rotr(e,7)^rotr(e,18)^e>>>3}function calculate_sha256_littleSigmaPrime(e){return rotr(e,17)^rotr(e,19)^e>>>10}function calculateSHA256(e,t,a){let n=1779033703,s=3144134277,r=1013904242,i=2773480762,o=1359893119,l=2600822924,f=528734635,c=1541459225;const h=64*Math.ceil((a+9)/64),u=new Uint8Array(h);let m,p;for(m=0;m>>29&255;u[m++]=a>>21&255;u[m++]=a>>13&255;u[m++]=a>>5&255;u[m++]=a<<3&255;const g=new Uint32Array(64),{k:b}=wf;for(m=0;m>24&255,n>>16&255,n>>8&255,255&n,s>>24&255,s>>16&255,s>>8&255,255&s,r>>24&255,r>>16&255,r>>8&255,255&r,i>>24&255,i>>16&255,i>>8&255,255&i,o>>24&255,o>>16&255,o>>8&255,255&o,l>>24&255,l>>16&255,l>>8&255,255&l,f>>24&255,f>>16&255,f>>8&255,255&f,c>>24&255,c>>16&255,c>>8&255,255&c])}class DecryptStream extends DecodeStream{constructor(e,t,a){super(t);this.stream=e;this.dict=e.dict;this.decrypt=a;this.nextChunk=null;this.initialized=!1}readBlock(){let e;if(this.initialized)e=this.nextChunk;else{e=this.stream.getBytes(512);this.initialized=!0}if(!e?.length){this.eof=!0;return}this.nextChunk=this.stream.getBytes(512);const t=this.nextChunk?.length>0;e=(0,this.decrypt)(e,!t);const a=this.bufferLength,n=a+e.length;this.ensureBuffer(n).set(e,a);this.bufferLength=n}getOriginalStream(){return this}}class ARCFourCipher{a=0;b=0;constructor(e){const t=new Uint8Array(256),a=e.length;for(let e=0;e<256;++e)t[e]=e;for(let n=0,s=0;n<256;++n){const r=t[n];s=s+r+e[n%a]&255;t[n]=t[s];t[s]=r}this.s=t}encryptBlock(e){let t=this.a,a=this.b;const n=this.s,s=e.length,r=new Uint8Array(s);for(let i=0;it<128?t<<1:t<<1^27);constructor(){this.buffer=new Uint8Array(16);this.bufferPosition=0}_expandKey(e){unreachable("Cannot call `_expandKey` on the base class")}_decrypt(e,t){let a,n,s;const r=new Uint8Array(16);r.set(e);for(let e=0,a=this._keySize;e<16;++e,++a)r[e]^=t[a];for(let e=this._cyclesOfRepetition-1;e>=1;--e){a=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=a;a=r[14];n=r[10];r[14]=r[6];r[10]=r[2];r[6]=a;r[2]=n;a=r[15];n=r[11];s=r[7];r[15]=r[3];r[11]=a;r[7]=n;r[3]=s;for(let e=0;e<16;++e)r[e]=this._inv_s[r[e]];for(let a=0,n=16*e;a<16;++a,++n)r[a]^=t[n];for(let e=0;e<16;e+=4){const t=this._mix[r[e]],n=this._mix[r[e+1]],s=this._mix[r[e+2]],i=this._mix[r[e+3]];a=t^n>>>8^n<<24^s>>>16^s<<16^i>>>24^i<<8;r[e]=a>>>24&255;r[e+1]=a>>16&255;r[e+2]=a>>8&255;r[e+3]=255&a}}a=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=a;a=r[14];n=r[10];r[14]=r[6];r[10]=r[2];r[6]=a;r[2]=n;a=r[15];n=r[11];s=r[7];r[15]=r[3];r[11]=a;r[7]=n;r[3]=s;for(let e=0;e<16;++e){r[e]=this._inv_s[r[e]];r[e]^=t[e]}return r}_encrypt(e,t){const a=this._s;let n,s,r;const i=new Uint8Array(16);i.set(e);for(let e=0;e<16;++e)i[e]^=t[e];for(let e=1;e=n;--a)if(e[a]!==t){t=0;break}o-=t;r[r.length-1]=e.subarray(0,16-t)}}const l=new Uint8Array(o);for(let e=0,t=0,a=r.length;e=256&&(o=255&(27^o))}for(let t=0;t<4;++t){a[e]=n^=a[e-32];e++;a[e]=s^=a[e-32];e++;a[e]=r^=a[e-32];e++;a[e]=i^=a[e-32];e++}}return a}}class PDFBase{_hash(e,t,a){unreachable("Abstract method `_hash` called")}checkOwnerPassword(e,t,a,n){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(a,e.length+t.length);return isArrayEqual(this._hash(e,s,a),n)}checkUserPassword(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);return isArrayEqual(this._hash(e,n,[]),a)}getOwnerKey(e,t,a,n){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(a,e.length+t.length);const r=this._hash(e,s,a);return new AES256Cipher(r).decryptBlock(n,!1,new Uint8Array(16))}getUserKey(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);const s=this._hash(e,n,[]);return new AES256Cipher(s).decryptBlock(a,!1,new Uint8Array(16))}}class PDF17 extends PDFBase{_hash(e,t,a){return calculateSHA256(t,0,t.length)}}class PDF20 extends PDFBase{_hash(e,t,a){let n=calculateSHA256(t,0,t.length).subarray(0,32),s=[0],r=0;for(;r<64||s.at(-1)>r-32;){const t=e.length+n.length+a.length,i=new Uint8Array(t);let o=0;i.set(e,o);o+=e.length;i.set(n,o);o+=n.length;i.set(a,o);const l=new Uint8Array(64*t);for(let e=0,a=0;e<64;e++,a+=t)l.set(i,a);s=new AES128Cipher(n.subarray(0,16)).encrypt(l,n.subarray(16,32));const f=Math.sumPrecise(s.slice(0,16))%3;0===f?n=calculateSHA256(s,0,s.length):1===f?n=calculateSHA384(s,0,s.length):2===f&&(n=calculateSHA512(s,0,s.length));r++}return n.subarray(0,32)}}class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const a=new this.StreamCipherConstructor;return new DecryptStream(e,t,function cipherTransformDecryptStream(e,t){return a.decryptBlock(e,t)})}decryptString(e){const t=new this.StringCipherConstructor;let a=stringToBytes(e);a=t.decryptBlock(a,!0);return bytesToString(a)}encryptString(e){const t=new this.StringCipherConstructor;if(t instanceof AESBaseCipher){const a=16-e.length%16;e+=String.fromCharCode(a).repeat(a);const n=new Uint8Array(16);crypto.getRandomValues(n);let s=stringToBytes(e);s=t.encrypt(s,n);const r=new Uint8Array(16+s.length);r.set(n);r.set(s,16);return bytesToString(r)}let a=stringToBytes(e);a=t.encrypt(a);return bytesToString(a)}}class CipherTransformFactory{static get _defaultPasswordBytes(){return shadow(this,"_defaultPasswordBytes",new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]))}#At(e,t,a,n,s,r,i,o,l,f,c,h){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];const u=6===e?new PDF20:new PDF17;return u.checkUserPassword(t,o,i)?u.getUserKey(t,l,c):t.length&&u.checkOwnerPassword(t,n,r,a)?u.getOwnerKey(t,s,r,f):null}#xt(e,t,a,n,s,r,i,o){const l=40+a.length+e.length,f=new Uint8Array(l);let c,h,u=0;if(t){h=Math.min(32,t.length);for(;u>8&255;f[u++]=s>>16&255;f[u++]=s>>>24&255;f.set(e,u);u+=e.length;if(r>=4&&!o){f.fill(255,u,u+4);u+=4}let m=calculateMD5(f,0,u);const p=i>>3;if(r>=3)for(c=0;c<50;++c)m=calculateMD5(m,0,p);const d=m.subarray(0,p);let g,b;if(r>=3){u=0;f.set(CipherTransformFactory._defaultPasswordBytes,u);u+=32;f.set(e,u);u+=e.length;g=new ARCFourCipher(d);b=g.encryptBlock(calculateMD5(f,0,u));h=d.length;const t=new Uint8Array(h);for(c=1;c<=19;++c){for(let e=0;en[t]===e)?d:null}#Ct(e,t,a,n){const s=new Uint8Array(32);let r=0;const i=Math.min(32,e.length);for(;r>3;if(a>=3)for(o=0;o<50;++o)l=calculateMD5(l,0,l.length);let c,h;if(a>=3){h=t;const e=new Uint8Array(f);for(o=19;o>=0;o--){for(let t=0;t>8&255;r[i++]=e>>16&255;r[i++]=255&t;r[i++]=t>>8&255;if(n){r[i++]=115;r[i++]=65;r[i++]=108;r[i++]=84}return calculateMD5(r,0,i).subarray(0,Math.min(s+5,16))}#Ft(e,t,a,n,s){if(!(t instanceof Name))throw new FormatError("Invalid crypt filter name.");const r=this,i=e.get(t.name),o=i?.get("CFM");if(!o||"None"===o.name)return function(){return new NullCipher};if("V2"===o.name)return function(){return new ARCFourCipher(r.#It(a,n,s,!1))};if("AESV2"===o.name)return function(){return new AES128Cipher(r.#It(a,n,s,!0))};if("AESV3"===o.name)return function(){return new AES256Cipher(s)};throw new FormatError("Unknown crypto method")}constructor(e,t,a){const n=e.get("Filter");if(!isName(n,"Standard"))throw new FormatError("unknown encryption method");this.filterName=n.name;this.dict=e;const s=e.get("V");if(!Number.isInteger(s)||1!==s&&2!==s&&4!==s&&5!==s)throw new FormatError("unsupported encryption algorithm");this.algorithm=s;let r=e.get("Length");if(!r)if(s<=3)r=40;else{const t=e.get("CF"),a=e.get("StmF");if(t instanceof Dict&&a instanceof Name){t.suppressEncryption=!0;const e=t.get(a.name);r=e?.get("Length")||128;r<40&&(r<<=3)}}if(!Number.isInteger(r)||r<40||r%8!=0)throw new FormatError("invalid key length");const i=stringToBytes(e.get("O")),o=stringToBytes(e.get("U")),l=i.subarray(0,32),f=o.subarray(0,32),c=e.get("P"),h=e.get("R"),u=(4===s||5===s)&&!1!==e.get("EncryptMetadata");this.encryptMetadata=u;const m=stringToBytes(t);let p,d;if(a){if(6===h)try{a=utf8StringToString(a)}catch{warn("CipherTransformFactory: Unable to convert UTF8 encoded password.")}p=stringToBytes(a)}if(5!==s)d=this.#xt(m,p,l,f,c,h,r,u);else{const t=i.subarray(32,40),a=i.subarray(40,48),n=o.subarray(0,48),s=o.subarray(32,40),r=o.subarray(40,48),c=stringToBytes(e.get("OE")),u=stringToBytes(e.get("UE")),m=stringToBytes(e.get("Perms"));d=this.#At(h,p,l,t,a,n,f,s,r,c,u,m)}if(!d){if(!a)throw new PasswordException("No password given",Zt);const e=this.#Ct(p,l,h,r);d=this.#xt(m,e,l,f,c,h,r,u)}if(!d)throw new PasswordException("Incorrect Password",ea);if(4===s&&d.length<16){this.encryptionKey=new Uint8Array(16);this.encryptionKey.set(d)}else this.encryptionKey=d;if(s>=4){const t=e.get("CF");t instanceof Dict&&(t.suppressEncryption=!0);this.cf=t;this.stmf=e.get("StmF")||Name.get("Identity");this.strf=e.get("StrF")||Name.get("Identity");this.eff=e.get("EFF")||this.stmf}}createCipherTransform(e,t){if(4===this.algorithm||5===this.algorithm)return new CipherTransform(this.#Ft(this.cf,this.strf,e,t,this.encryptionKey),this.#Ft(this.cf,this.stmf,e,t,this.encryptionKey));const a=this.#It(e,t,this.encryptionKey,!1),cipherConstructor=function(){return new ARCFourCipher(a)};return new CipherTransform(cipherConstructor,cipherConstructor)}}class XRef{constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this._xrefStms=new Set;this._cacheMap=new Map;this._pendingRefs=new RefSet;this._newPersistentRefNum=null;this._newTemporaryRefNum=null;this._persistentRefsCache=null}getNewPersistentRef(e){null===this._newPersistentRefNum&&(this._newPersistentRefNum=this.entries.length||1);const t=this._newPersistentRefNum++;this._cacheMap.set(t,e);return Ref.get(t,0)}getNewTemporaryRef(){if(null===this._newTemporaryRefNum){this._newTemporaryRefNum=this.entries.length||1;if(this._newPersistentRefNum){this._persistentRefsCache=new Map;for(let e=this._newTemporaryRefNum;e0;){const[i,o]=r;if(!Number.isInteger(i)||!Number.isInteger(o))throw new FormatError(`Invalid XRef range fields: ${i}, ${o}`);if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(s))throw new FormatError(`Invalid XRef entry fields length: ${i}, ${o}`);for(let r=t.entryNum;r=e.length);){a+=String.fromCharCode(n);n=e[t]}return a}function skipUntil(e,t,a){const n=a.length,s=e.length;let r=0;for(;t=n)break;t++;r++}return r}const e=/\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g,t=/\b(startxref|\d+\s+\d+\s+obj)\b/g,a=/^(\d+)\s+(\d+)\s+obj\b/,n=new Uint8Array([116,114,97,105,108,101,114]),s=new Uint8Array([115,116,97,114,116,120,114,101,102]),r=new Uint8Array([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const i=this.stream;i.pos=0;const o=i.getBytes(),l=bytesToString(o),f=o.length;let c=i.start;const h=[],u=[];for(;c=f)break;m=o[c]}while(10!==m&&13!==m);continue}const p=readToken(o,c);let d;if(p.startsWith("xref")&&(4===p.length||/\s/.test(p[4]))){c+=skipUntil(o,c,n);h.push(c);c+=skipUntil(o,c,s)}else if(d=a.exec(p)){const t=0|d[1],a=0|d[2],n=c+p.length;let s,h=!1;if(this.entries[t]){if(this.entries[t].gen===a)try{new Parser({lexer:new Lexer(i.makeSubStream(n))}).getObj();h=!0}catch(e){e instanceof ParserEOFException?warn(`indexObjects -- checking object (${p}): "${e}".`):h=!0}}else h=!0;h&&(this.entries[t]={offset:c-i.start,gen:a,uncompressed:!0});e.lastIndex=n;const m=e.exec(l);if(m){s=e.lastIndex+1-c;if("endobj"!==m[1]){warn(`indexObjects: Found "${m[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`);s-=m[1].length+1}}else s=f-c;const g=o.subarray(c,c+s),b=skipUntil(g,0,r);if(b0&&t[3]-t[1]>0)return t;warn(`Empty, or invalid, /${e} entry.`)}return null}get mediaBox(){return shadow(this,"mediaBox",this.getBoundingBox("MediaBox")||jf)}get cropBox(){return shadow(this,"cropBox",this.getBoundingBox("CropBox")||this.mediaBox)}get userUnit(){const e=this.pageDict.get("UserUnit");return shadow(this,"userUnit","number"==typeof e&&e>0?e:1)}get view(){const{cropBox:e,mediaBox:t}=this;if(e!==t&&!isArrayEqual(e,t)){const a=Util.intersect(e,t);if(a&&a[2]-a[0]>0&&a[3]-a[1]>0)return shadow(this,"view",a);warn("Empty /CropBox and /MediaBox intersection.")}return shadow(this,"view",t)}get rotate(){let e=this.#Rt("Rotate")||0;e%90!=0?e=0:e>=360?e%=360:e<0&&(e=(e%360+360)%360);return shadow(this,"rotate",e)}#Ht(e,t){if(!this.evaluatorOptions.ignoreErrors)throw e;warn(`getContentStream - ignoring sub-stream (${t}): "${e}".`)}async getContentStream(){const e=await this.pdfManager.ensure(this,"content");if(e instanceof BaseStream&&!e.isImageStream){if(e.isAsync){const t=await e.asyncGetBytes();if(t)return new Stream(t,0,t.length,e.dict)}return e}if(Array.isArray(e)){const t=[];for(let a=0,n=e.length;a{t&&(e[a]=new Stream(t,0,t.length,n.dict))}))}t.length>0&&await Promise.all(t);return new StreamsSequenceStream(e,this.#Ht.bind(this))}return new NullStream}get xfaData(){return shadow(this,"xfaData",this.xfaFactory?{bbox:this.xfaFactory.getBoundingBox(this.pageIndex)}:null)}async#Bt(e,t,a){const n=[];for(const s of e)if(s.id){const e=Ref.fromString(s.id);if(!e){warn(`A non-linked annotation cannot be modified: ${s.id}`);continue}if(s.deleted){t.put(e,e);if(s.popupRef){const e=Ref.fromString(s.popupRef);e&&t.put(e,e)}continue}if(s.popup?.deleted){const e=Ref.fromString(s.popupRef);e&&t.put(e,e)}a?.put(e);s.ref=e;n.push(this.xref.fetchAsync(e).then(e=>{e instanceof Dict&&(s.oldAnnotation=e.clone())},()=>{warn(`Cannot fetch \`oldAnnotation\` for: ${e}.`)}));delete s.id}await Promise.all(n)}async saveNewAnnotations(e,t,a,n,s){if(this.xfaFactory)throw new Error("XFA: Cannot save new annotations.");const r=this.#Ot(e),i=new RefSetCache,o=new RefSet;await this.#Bt(a,i,o);const l=this.pageDict,f=this.annotations.filter(e=>!(e instanceof Ref&&i.has(e))),c=await AnnotationFactory.saveNewAnnotations(r,this.xref,t,a,n,s);for(const{ref:e}of c.annotations)e instanceof Ref&&!o.has(e)&&f.push(e);const h=l.clone();h.set("Annots",f);s.put(this.ref,{data:h});for(const e of i)s.put(e,{data:null})}async save(e,t,a,n){const s=this.#Ot(e),r=await this._parsedAnnotations,i=[];for(const e of r)i.push(e.save(s,t,a,n).catch(function(e){warn(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null}));return Promise.all(i)}async loadResources(e){await(this.#Tt??=this.pdfManager.ensure(this,"resources"));await ObjectLoader.load(this.resources,e,this.xref)}async#Dt(e,t){const a=e?.get("Resources");if(!(a instanceof Dict&&a.size))return this.resources;await ObjectLoader.load(a,t,this.xref);return Dict.merge({xref:this.xref,dictArray:[a,this.resources],mergeSubDicts:!0})}async getOperatorList({handler:e,sink:t,task:a,intent:n,cacheKey:s,pageIndex:r=this.pageIndex,annotationStorage:i=null,modifiedIds:c=null}){const p=this.getContentStream(),g=this.loadResources(da),b=this.#Ot(e,r),w=this.xfaFactory?null:getNewAnnotationsMap(i),j=w?.get(this.pageIndex);let k=Promise.resolve(null),y=null;if(j){const e=this.pdfManager.ensureDoc("annotationGlobals");let t;const n=new Set;for(const{bitmapId:e,bitmap:t}of j)!e||t||n.has(e)||n.add(e);const{isOffscreenCanvasSupported:s}=this.evaluatorOptions;if(n.size>0){const e=j.slice();for(const[t,a]of i)t.startsWith(d)&&a.bitmap&&n.has(a.bitmapId)&&e.push(a);t=AnnotationFactory.generateImages(e,this.xref,s)}else t=AnnotationFactory.generateImages(j,this.xref,s);y=new RefSet;k=Promise.all([e,this.#Bt(j,y,null)]).then(([e])=>e?AnnotationFactory.printNewAnnotations(e,b,a,j,t):null)}const q=Promise.all([p,g]).then(async([i])=>{const o=await this.#Dt(i.dict,da),l=new OperatorList(n,t);e.send("StartRenderPage",{transparency:b.hasBlendModes(o,this.nonBlendModesSet),pageIndex:r,cacheKey:s});await b.getOperatorList({stream:i,task:a,resources:o,operatorList:l});return l});let[v,S,x]=await Promise.all([q,this._parsedAnnotations,k]);if(x){S=S.filter(e=>!(e.ref&&y.has(e.ref)));for(let e=0,t=x.length;ee.ref&&isRefsEqual(e.ref,a.refToReplace));if(n>=0){S.splice(n,1,a);x.splice(e--,1);t--}}}S=S.concat(x)}if(0===S.length||n&u){v.flush(!0);return{length:v.totalLength}}const C=!!(n&h),F=!!(n&m),T=!!(n&o),O=!!(n&l),R=!!(n&f),H=[];for(const e of S)(T||O&&e.mustBeViewed(i,C)&&e.mustBeViewedWhenEditing(F,c)||R&&e.mustBePrinted(i))&&H.push(e.getOperatorList(b,a,n,i).catch(function(e){warn(`getOperatorList - ignoring annotation data during "${a.name}" task: "${e}".`);return{opList:null,separateForm:!1,separateCanvas:!1}}));const D=await Promise.all(H);let M=!1,N=!1;for(const{opList:e,separateForm:t,separateCanvas:a}of D){v.addOpList(e);M||=t;N||=a}v.flush(!0,{form:M,canvas:N});return{length:v.totalLength}}async extractTextContent({handler:e,task:t,includeMarkedContent:a,disableNormalization:n,sink:s,intersector:r=null}){const i=this.getContentStream(),o=this.loadResources(ga),l=this.pdfManager.ensureCatalog("lang"),[f,,c]=await Promise.all([i,o,l]),h=await this.#Dt(f.dict,ga);return this.#Ot(e).getTextContent({stream:f,task:t,resources:h,includeMarkedContent:a,disableNormalization:n,sink:s,viewBox:this.view,lang:c,intersector:r})}async getStructTree(){const e=await this.pdfManager.ensureCatalog("structTreeRoot");if(!e)return null;await this._parsedAnnotations;try{const t=await this.pdfManager.ensure(this,"_parseStructTree",[e]);return await this.pdfManager.ensure(t,"serializable")}catch(e){warn(`getStructTree: "${e}".`);return null}}_parseStructTree(e){const t=new StructTreePage(e,this.pageDict);t.parse(this.ref);return t}async getAnnotationsData(e,t,a){const n=await this._parsedAnnotations;if(0===n.length)return n;const s=[],r=[];let i;const c=!!(a&o),h=!!(a&l),u=!!(a&f),m=[];for(const a of n){const n=c||h&&a.viewable;(n||u&&a.printable)&&s.push(a.data);if(a.hasTextContent&&n){i??=this.#Ot(e);r.push(a.extractTextContent(i,t,[-1/0,-1/0,1/0,1/0]).catch(function(e){warn(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)}))}else a.overlaysTextContent&&n&&m.push(a)}if(m.length>0){const a=new Intersector(m);r.push(this.extractTextContent({handler:e,task:t,includeMarkedContent:!1,disableNormalization:!1,sink:null,viewBox:this.view,lang:null,intersector:a}).then(()=>{a.setText()}))}await Promise.all(r);return s}get annotations(){const e=this.#Rt("Annots");return shadow(this,"annotations",Array.isArray(e)?e:[])}get _parsedAnnotations(){return shadow(this,"_parsedAnnotations",this.pdfManager.ensure(this,"annotations").then(async e=>{if(0===e.length)return e;const[t,a]=await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"),this.pdfManager.ensureDoc("fieldObjects")]);if(!t)return[];const n=a?.orphanFields,s=[];for(const a of e)s.push(AnnotationFactory.create(this.xref,a,t,this._localIdFactory,!1,n,null,this.ref).catch(function(e){warn(`_parsedAnnotations: "${e}".`);return null}));const r=[];let i,o;for(const e of await Promise.all(s))e&&(e instanceof WidgetAnnotation?(o||=[]).push(e):e instanceof PopupAnnotation?(i||=[]).push(e):r.push(e));o&&r.push(...o);i&&r.push(...i);return r}))}get jsActions(){return shadow(this,"jsActions",collectActions(this.xref,this.pageDict,le))}async collectAnnotationsByType(e,t,a,n,s){const{pageIndex:r}=this;if(Object.hasOwn(this,"_parsedAnnotations")){const e=await this._parsedAnnotations;for(const{data:t}of e)if(!a||a.has(t.annotationType)){t.pageIndex=r;n.push(Promise.resolve(t))}return}const i=await this.pdfManager.ensure(this,"annotations");let o;for(const l of i)n.push(AnnotationFactory.create(this.xref,l,s,this._localIdFactory,!1,null,a,this.ref).then(async a=>{if(!a)return null;a.data.pageIndex=r;if(a.hasTextContent&&a.viewable){o??=this.#Ot(e);await a.extractTextContent(o,t,[-1/0,-1/0,1/0,1/0])}return a.data}).catch(function(e){warn(`collectAnnotationsByType: "${e}".`);return null}))}}const kf=new Uint8Array([37,80,68,70,45]),yf=new Uint8Array([115,116,97,114,116,120,114,101,102]),qf=new Uint8Array([101,110,100,111,98,106]);function find(e,t,a=1024,n=!1){const s=t.length,r=e.peekBytes(a),i=r.length-s;if(i<=0)return!1;if(n){const a=s-1;let n=r.length-1;for(;n>=a;){let i=0;for(;i=s){e.pos+=n-a;return!0}n--}}else{let a=0;for(;a<=i;){let n=0;for(;n=s){e.pos+=a;return!0}a++}}return!1}class PDFDocument{#Mt=new Map;#Nt=null;constructor(e,t){if(t.length<=0)throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new XRef(t,e);const a={font:0};this._globalIdFactory=class{static getDocId(){return`g_${e.docId}`}static createFontId(){return"f"+ ++a.font}static createObjId(){unreachable("Abstract method `createObjId` called.")}static getPageObjId(){unreachable("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new Catalog(this.pdfManager,this.xref)}get linearization(){let e=null;try{e=Linearization.create(this.stream)}catch(e){if(e instanceof MissingDataException)throw e;info(e)}return shadow(this,"linearization",e)}get startXRef(){const e=this.stream;let t=0;if(this.linearization){e.reset();if(find(e,qf)){e.skip(6);let a=e.peekByte();for(;isWhiteSpace(a);){e.pos++;a=e.peekByte()}t=e.pos-e.start}}else{const a=1024,n=yf.length;let s=!1,r=e.end;for(;!s&&r>0;){r-=a-n;r<0&&(r=0);e.pos=r;s=find(e,yf,a,!0)}if(s){e.skip(9);let a;do{a=e.getByte()}while(isWhiteSpace(a));let n="";for(;a>=32&&a<=57;){n+=String.fromCharCode(a);a=e.getByte()}t=parseInt(n,10);isNaN(t)&&(t=0)}}return shadow(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,kf))return;e.moveStart();e.skip(kf.length);let t,a="";for(;(t=e.getByte())>32&&a.length<7;)a+=String.fromCharCode(t);ua.test(a)?this.#Nt=a:warn(`Invalid PDF header version: ${a}`)}parseStartXRef(){this.xref.setStartXRef(this.startXRef)}get numPages(){let e=0;e=this.catalog.hasActualNumPages?this.catalog.numPages:this.xfaFactory?this.xfaFactory.getNumPages():this.linearization?this.linearization.numPages:this.catalog.numPages;return shadow(this,"numPages",e)}#Pt(e,t=0){return!!Array.isArray(e)&&e.every(e=>{if(!((e=this.xref.fetchIfRef(e))instanceof Dict))return!1;if(e.has("Kids")){if(++t>10){warn("#hasOnlyDocumentSignatures: maximum recursion depth reached");return!1}return this.#Pt(e.get("Kids"),t)}const a=isName(e.get("FT"),"Sig"),n=e.get("Rect"),s=Array.isArray(n)&&n.every(e=>0===e);return a&&s})}get _xfaStreams(){const{acroForm:e}=this.catalog;if(!e)return null;const t=e.get("XFA"),a=new Map(["xdp:xdp","template","datasets","config","connectionSet","localeSet","stylesheet","/xdp:xdp"].map(e=>[e,null]));if(t instanceof BaseStream&&!t.isEmpty){a.set("xdp:xdp",t);return a}if(!Array.isArray(t)||0===t.length)return null;for(let e=0,n=t.length;ef.handleSetFont(n,[Name.get(e),1],null,c,t,u,a,s).catch(e=>{warn(`loadXfaFonts: "${e}".`);return null}),m=[];for(const[e,t]of s){const a=t.get("FontDescriptor");if(!(a instanceof Dict))continue;let n=a.get("FontFamily");n=n.replaceAll(/[ ]+(\d)/g,"$1");const s={fontFamily:n,fontWeight:a.get("FontWeight"),italicAngle:-a.get("ItalicAngle")};validateCSSFont(s)&&m.push(parseFont(e,null,s))}await Promise.all(m);const p=this.xfaFactory.setFonts(h);if(!p)return;r.ignoreErrors=!0;m.length=0;h.length=0;const d=new Set;for(const e of p)getXfaFontName(`${e}-Regular`)||d.add(e);d.size&&p.push("PdfJS-Fallback");for(const e of p)if(!d.has(e))for(const t of[{name:"Regular",fontWeight:400,italicAngle:0},{name:"Bold",fontWeight:700,italicAngle:0},{name:"Italic",fontWeight:400,italicAngle:12},{name:"BoldItalic",fontWeight:700,italicAngle:12}]){const a=`${e}-${t.name}`;m.push(parseFont(a,getXfaFontDict(a),{fontFamily:e,fontWeight:t.fontWeight,italicAngle:t.italicAngle}))}await Promise.all(m);this.xfaFactory.appendFonts(h,d)}loadXfaResources(e,t){return Promise.all([this.#_t(e,t).catch(()=>{}),this.#Et()])}serializeXfaData(e){return this.xfaFactory?this.xfaFactory.serializeData(e):null}get version(){return this.catalog.version||this.#Nt}get formInfo(){const e={hasFields:!1,hasAcroForm:!1,hasXfa:!1,hasSignatures:!1},{acroForm:t}=this.catalog;if(!t)return shadow(this,"formInfo",e);try{const a=t.get("Fields"),n=Array.isArray(a)&&a.length>0;e.hasFields=n;const s=t.get("XFA");e.hasXfa=Array.isArray(s)&&s.length>0||s instanceof BaseStream&&!s.isEmpty;const r=!!(1&t.get("SigFlags")),i=r&&this.#Pt(a);e.hasAcroForm=n&&!i;e.hasSignatures=r}catch(e){if(e instanceof MissingDataException)throw e;warn(`Cannot fetch form information: "${e}".`)}return shadow(this,"formInfo",e)}get documentInfo(){const{catalog:e,formInfo:t,xref:a}=this,n={PDFFormatVersion:this.version,Language:e.lang,EncryptFilterName:a.encrypt?.filterName??null,IsLinearized:!!this.linearization,IsAcroFormPresent:t.hasAcroForm,IsXFAPresent:t.hasXfa,IsCollectionPresent:!!e.collection,IsSignaturesPresent:t.hasSignatures};let s;try{s=a.trailer.get("Info")}catch(e){if(e instanceof MissingDataException)throw e;info("The document information dictionary is invalid.")}if(!(s instanceof Dict))return shadow(this,"documentInfo",n);for(const[e,t]of s){switch(e){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof t){n[e]=stringToPDFString(t);continue}break;case"Trapped":if(t instanceof Name){n[e]=t;continue}break;default:let a;switch(typeof t){case"string":a=stringToPDFString(t);break;case"number":case"boolean":a=t;break;default:t instanceof Name&&(a=t)}if(void 0===a){warn(`Bad value, for custom key "${e}", in Info: ${t}.`);continue}n.Custom??=Object.create(null);n.Custom[e]=a;continue}warn(`Bad value, for key "${e}", in Info: ${t}.`)}return shadow(this,"documentInfo",n)}get fingerprints(){const e="\0".repeat(16);function validate(t){return"string"==typeof t&&16===t.length&&t!==e}const t=this.xref.trailer.get("ID");let a,n;if(Array.isArray(t)&&validate(t[0])){a=stringToBytes(t[0]);t[1]!==t[0]&&validate(t[1])&&(n=stringToBytes(t[1]))}else a=calculateMD5(this.stream.getByteRange(0,1024),0,1024);return shadow(this,"fingerprints",[a.toHex(),n?.toHex()??null])}async#zt(e){const{catalog:t,linearization:a,xref:n}=this,s=Ref.get(a.objectNumberFirst,0);try{const e=await n.fetchAsync(s);if(e instanceof Dict){let a=e.getRaw("Type");a instanceof Ref&&(a=await n.fetchAsync(a));if(isName(a,"Page")||!e.has("Type")&&!e.has("Kids")&&e.has("Contents")){t.pageKidsCountCache.has(s)||t.pageKidsCountCache.put(s,1);t.pageIndexCache.has(s)||t.pageIndexCache.put(s,0);return[e,s]}}throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.")}catch(a){warn(`_getLinearizationPage: "${a.message}".`);return t.getPageDict(e)}}getPage(e){const t=this.#Mt.get(e);if(t)return t;const{catalog:a,linearization:n,xfaFactory:s}=this;let r;r=s?Promise.resolve([Dict.empty,null]):n?.pageFirst===e?this.#zt(e):a.getPageDict(e);r=r.then(([t,n])=>new Page({pdfManager:this.pdfManager,xref:this.xref,pageIndex:e,pageDict:t,ref:n,globalIdFactory:this._globalIdFactory,fontCache:a.fontCache,builtInCMapCache:a.builtInCMapCache,standardFontDataCache:a.standardFontDataCache,globalColorSpaceCache:a.globalColorSpaceCache,globalImageCache:a.globalImageCache,systemFontCache:a.systemFontCache,nonBlendModesSet:a.nonBlendModesSet,xfaFactory:s}));this.#Mt.set(e,r);return r}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof XRefEntryException){this.#Mt.delete(0);await this.cleanup();throw new XRefParseException}}}async checkLastPage(e=!1){const{catalog:t,pdfManager:a}=this;t.setActualNumPages();let n;try{await Promise.all([a.ensureDoc("xfaFactory"),a.ensureDoc("linearization"),a.ensureCatalog("numPages")]);if(this.xfaFactory)return;n=this.linearization?this.linearization.numPages:t.numPages;if(!Number.isInteger(n))throw new FormatError("Page count is not an integer.");if(n<=1)return;await this.getPage(n-1)}catch(s){this.#Mt.delete(n-1);await this.cleanup();if(s instanceof XRefEntryException&&!e)throw new XRefParseException;warn(`checkLastPage - invalid /Pages tree /Count: ${n}.`);let r;try{r=await t.getAllPageDicts(e)}catch(a){if(a instanceof XRefEntryException&&!e)throw new XRefParseException;t.setActualNumPages(1);return}for(const[e,[n,s]]of r){let r;if(n instanceof Error){r=Promise.reject(n);r.catch(()=>{})}else r=Promise.resolve(new Page({pdfManager:a,xref:this.xref,pageIndex:e,pageDict:n,ref:s,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalColorSpaceCache:this.globalColorSpaceCache,globalImageCache:t.globalImageCache,systemFontCache:t.systemFontCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this.#Mt.set(e,r)}t.setActualNumPages(r.size)}}async fontFallback(e,t){const{catalog:a,pdfManager:n}=this;for(const s of await Promise.all(a.fontCache))if(s.loadedName===e){s.fallback(t,n.evaluatorOptions);return}}async cleanup(e=!1){return this.catalog?this.catalog.cleanup(e):clearGlobalCaches()}async#Lt(e,t,a,n,s,r,i){const{xref:o}=this;if(!(a instanceof Ref)||r.has(a))return;r.put(a);const l=await o.fetchAsync(a);if(!(l instanceof Dict))return;let f=await l.getAsync("Subtype");f=f instanceof Name?f.name:null;if("Link"===f)return;if(l.has("T")){const t=stringToPDFString(await l.getAsync("T"));e=""===e?t:`${e}.${t}`}else{let a=l;for(;;){a=a.getRaw("Parent")||t;if(a instanceof Ref){if(r.has(a))break;a=await o.fetchAsync(a)}if(!(a instanceof Dict))break;if(a.has("T")){const t=stringToPDFString(await a.getAsync("T"));e=""===e?t:`${e}.${t}`;break}}}t&&!l.has("Parent")&&isName(l.get("Subtype"),"Widget")&&i.put(a,t);n.getOrInsertComputed(e,makeArr).push(AnnotationFactory.create(o,a,s,null,!0,i,null,null).then(e=>e?.getFieldObject()).catch(function(e){warn(`#collectFieldObjects: "${e}".`);return null}));if(!l.has("Kids"))return;const c=await l.getAsync("Kids");if(Array.isArray(c))for(const t of c)await this.#Lt(e,a,t,n,s,r,i)}get fieldObjects(){return shadow(this,"fieldObjects",this.pdfManager.ensureDoc("formInfo").then(async e=>{if(!e.hasFields)return null;const t=await this.annotationGlobals;if(!t)return null;const{acroForm:a}=t,n=new RefSet,s=Object.create(null),r=new Map,i=new RefSetCache;for(const e of a.get("Fields"))await this.#Lt("",null,e,r,t,n,i);const o=[];for(const[e,t]of r)o.push(Promise.all(t).then(t=>{(t=t.filter(e=>!!e)).length>0&&(s[e]=t)}));await Promise.all(o);return{allFields:objectSize(s)>0?s:null,orphanFields:i}}))}get hasJSActions(){return shadow(this,"hasJSActions",this.pdfManager.ensureDoc("_parseHasJSActions"))}async _parseHasJSActions(){const[e,t]=await Promise.all([this.pdfManager.ensureCatalog("jsActions"),this.pdfManager.ensureDoc("fieldObjects")]);return!!e||!!t?.allFields&&Object.values(t.allFields).some(e=>e.some(e=>null!==e.actions))}get calculationOrderIds(){const e=this.catalog.acroForm?.get("CO");if(!Array.isArray(e)||0===e.length)return shadow(this,"calculationOrderIds",null);const t=[];for(const a of e)a instanceof Ref&&t.push(a.toString());return shadow(this,"calculationOrderIds",t.length?t:null)}get annotationGlobals(){return shadow(this,"annotationGlobals",AnnotationFactory.createGlobals(this.pdfManager))}async toJSObject(e,t=!0){throw new Error("Not implemented: toJSObject")}}class BasePdfManager{constructor({docBaseUrl:e,docId:t,enableXfa:a,evaluatorOptions:n,handler:s,password:r}){this._docBaseUrl=function parseDocBaseUrl(e){if(e){const t=createValidAbsoluteUrl(e);if(t)return t.href;warn(`Invalid absolute docBaseUrl: "${e}".`)}return null}(e);this._docId=t;this._password=r;this.enableXfa=a;n.isOffscreenCanvasSupported&&=FeatureTest.isOffscreenCanvasSupported;n.isImageDecoderSupported&&=FeatureTest.isImageDecoderSupported;this.evaluatorOptions=Object.freeze(n);ImageResizer.setOptions(n);JpegStream.setOptions(n);OperatorList.setOptions(n);const i={...n,handler:s};JpxImage.setOptions(i);IccColorSpace.setOptions(i);CmykICCBasedCS.setOptions(i);JBig2CCITTFaxImage.setOptions(i);PDFFunctionFactory.setOptions(i);Pattern.setOptions(i)}get docId(){return this._docId}get password(){return this._password}get docBaseUrl(){return this._docBaseUrl}ensureDoc(e,t){return this.ensure(this.pdfDocument,e,t)}ensureXRef(e,t){return this.ensure(this.pdfDocument.xref,e,t)}ensureCatalog(e,t){return this.ensure(this.pdfDocument.catalog,e,t)}getPage(e){return this.pdfDocument.getPage(e)}fontFallback(e,t){return this.pdfDocument.fontFallback(e,t)}cleanup(e=!1){return this.pdfDocument.cleanup(e)}async ensure(e,t,a){unreachable("Abstract method `ensure` called")}requestRange(e,t){unreachable("Abstract method `requestRange` called")}requestLoadedStream(e=!1){unreachable("Abstract method `requestLoadedStream` called")}sendProgressiveData(e){unreachable("Abstract method `sendProgressiveData` called")}updatePassword(e){this._password=e}terminate(e){unreachable("Abstract method `terminate` called")}}class LocalPdfManager extends BasePdfManager{constructor(e){super(e);const t=new Stream(e.source);this.pdfDocument=new PDFDocument(this,t);this._loadedStreamPromise=Promise.resolve(t)}async ensure(e,t,a){const n=e[t];return"function"==typeof n?n.apply(e,a):n}requestRange(e,t){return Promise.resolve()}requestLoadedStream(e=!1){return this._loadedStreamPromise}terminate(e){}}class NetworkPdfManager extends BasePdfManager{constructor(e){super(e);this.streamManager=new ChunkedStreamManager(e.source,{msgHandler:e.handler,length:e.length,disableAutoFetch:e.disableAutoFetch,rangeChunkSize:e.rangeChunkSize});this.pdfDocument=new PDFDocument(this,this.streamManager.getStream())}async ensure(e,t,a){try{const n=e[t];return"function"==typeof n?await n.apply(e,a):n}catch(n){if(!(n instanceof MissingDataException))throw n;await this.requestRange(n.begin,n.end);return this.ensure(e,t,a)}}requestRange(e,t){return this.streamManager.requestRange(e,t)}requestLoadedStream(e=!1){return this.streamManager.requestAllChunks(e)}sendProgressiveData(e){this.streamManager.onReceiveData({chunk:e})}terminate(e){this.streamManager.abort(e)}}const vf=1,Sf=2,Af=1,xf=2,Cf=3,If=4,Ff=5,Tf=6,Of=7,Rf=8;function onFn(){}function wrapReason(e){if(e instanceof AbortException||e instanceof InvalidPDFException||e instanceof PasswordException||e instanceof ResponseException||e instanceof UnknownErrorException)return e;e instanceof Error||"object"==typeof e&&null!==e||unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(e.name){case"AbortException":return new AbortException(e.message);case"InvalidPDFException":return new InvalidPDFException(e.message);case"PasswordException":return new PasswordException(e.message,e.code);case"ResponseException":return new ResponseException(e.message,e.status,e.missing);case"UnknownErrorException":return new UnknownErrorException(e.message,e.details)}return new UnknownErrorException(e.message,e.toString())}class MessageHandler{#Ut=new AbortController;constructor(e,t,a){this.sourceName=e;this.targetName=t;this.comObj=a;this.callbackId=1;this.streamId=1;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);a.addEventListener("message",this.#Xt.bind(this),{signal:this.#Ut.signal})}#Xt({data:e}){if(e.targetName!==this.sourceName)return;if(e.stream){this.#Wt(e);return}if(e.callback){const t=e.callbackId,a=this.callbackCapabilities[t];if(!a)throw new Error(`Cannot resolve callback ${t}`);delete this.callbackCapabilities[t];if(e.callback===vf)a.resolve(e.data);else{if(e.callback!==Sf)throw new Error("Unexpected callback case");a.reject(wrapReason(e.reason))}return}const t=this.actionHandler[e.action];if(!t)throw new Error(`Unknown action from worker: ${e.action}`);if(e.callbackId){const a=this.sourceName,n=e.sourceName,s=this.comObj;Promise.try(t,e.data).then(function(t){s.postMessage({sourceName:a,targetName:n,callback:vf,callbackId:e.callbackId,data:t})},function(t){s.postMessage({sourceName:a,targetName:n,callback:Sf,callbackId:e.callbackId,reason:wrapReason(t)})});return}e.streamId?this.#Kt(e):t(e.data)}on(e,t){const a=this.actionHandler;if(a[e])throw new Error(`There is already an actionName called "${e}"`);a[e]=t}send(e,t,a){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},a)}sendWithPromise(e,t,a){const n=this.callbackId++,s=Promise.withResolvers();this.callbackCapabilities[n]=s;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:n,data:t},a)}catch(e){s.reject(e)}return s.promise}sendWithStream(e,t,a,n){const s=this.streamId++,r=this.sourceName,i=this.targetName,o=this.comObj;return new ReadableStream({start:a=>{const l=Promise.withResolvers();this.streamControllers[s]={controller:a,startCall:l,pullCall:null,cancelCall:null,isClosed:!1};o.postMessage({sourceName:r,targetName:i,action:e,streamId:s,data:t,desiredSize:a.desiredSize},n);return l.promise},pull:e=>{const t=Promise.withResolvers();this.streamControllers[s].pullCall=t;o.postMessage({sourceName:r,targetName:i,stream:Tf,streamId:s,desiredSize:e.desiredSize});return t.promise},cancel:e=>{assert(e instanceof Error,"cancel must have a valid reason");const t=Promise.withResolvers();this.streamControllers[s].cancelCall=t;this.streamControllers[s].isClosed=!0;o.postMessage({sourceName:r,targetName:i,stream:Af,streamId:s,reason:wrapReason(e)});return t.promise}},a)}#Kt(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,s=this.comObj,r=this,i=this.actionHandler[e.action],o={enqueue(e,r=1,i){if(this.isCancelled)return;const o=this.desiredSize;this.desiredSize-=r;if(o>0&&this.desiredSize<=0){this.sinkCapability=Promise.withResolvers();this.ready=this.sinkCapability.promise}s.postMessage({sourceName:a,targetName:n,stream:If,streamId:t,chunk:e},i)},close(){if(!this.isCancelled){this.isCancelled=!0;s.postMessage({sourceName:a,targetName:n,stream:Cf,streamId:t});delete r.streamSinks[t]}},error(e){assert(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;s.postMessage({sourceName:a,targetName:n,stream:Ff,streamId:t,reason:wrapReason(e)})}},sinkCapability:Promise.withResolvers(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};o.sinkCapability.resolve();o.ready=o.sinkCapability.promise;this.streamSinks[t]=o;Promise.try(i,e.data,o).then(function(){s.postMessage({sourceName:a,targetName:n,stream:Rf,streamId:t,success:!0})},function(e){s.postMessage({sourceName:a,targetName:n,stream:Rf,streamId:t,reason:wrapReason(e)})})}#Wt(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,s=this.comObj,r=this.streamControllers[t],i=this.streamSinks[t];switch(e.stream){case Rf:e.success?r.startCall.resolve():r.startCall.reject(wrapReason(e.reason));break;case Of:e.success?r.pullCall.resolve():r.pullCall.reject(wrapReason(e.reason));break;case Tf:if(!i){s.postMessage({sourceName:a,targetName:n,stream:Of,streamId:t,success:!0});break}i.desiredSize<=0&&e.desiredSize>0&&i.sinkCapability.resolve();i.desiredSize=e.desiredSize;Promise.try(i.onPull||onFn).then(function(){s.postMessage({sourceName:a,targetName:n,stream:Of,streamId:t,success:!0})},function(e){s.postMessage({sourceName:a,targetName:n,stream:Of,streamId:t,reason:wrapReason(e)})});break;case If:assert(r,"enqueue should have stream controller");if(r.isClosed)break;r.controller.enqueue(e.chunk);break;case Cf:assert(r,"close should have stream controller");if(r.isClosed)break;r.isClosed=!0;r.controller.close();this.#Gt(r,t);break;case Ff:assert(r,"error should have stream controller");r.controller.error(wrapReason(e.reason));this.#Gt(r,t);break;case xf:e.success?r.cancelCall.resolve():r.cancelCall.reject(wrapReason(e.reason));this.#Gt(r,t);break;case Af:if(!i)break;const o=wrapReason(e.reason);Promise.try(i.onCancel||onFn,o).then(function(){s.postMessage({sourceName:a,targetName:n,stream:xf,streamId:t,success:!0})},function(e){s.postMessage({sourceName:a,targetName:n,stream:xf,streamId:t,reason:wrapReason(e)})});i.sinkCapability.reject(o);i.isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async#Gt(e,t){await Promise.allSettled([e.startCall?.promise,e.pullCall?.promise,e.cancelCall?.promise]);delete this.streamControllers[t]}destroy(){this.#Ut?.abort();this.#Ut=null}}async function writeObject(e,t,a,{encrypt:n=null,encryptRef:s=null}){const r=n&&s!==e?n.createCipherTransform(e.num,e.gen):null;a.push(`${e.num} ${e.gen} obj\n`);await writeValue(t,a,r);a.push("\nendobj\n")}async function writeDict(e,t,a){t.push("<<");for(const[n,s]of e.getRawEntries()){t.push(` /${escapePDFName(n)} `);await writeValue(s,t,a)}t.push(">>")}async function writeValue(e,t,a){if(e instanceof Name)t.push(`/${escapePDFName(e.name)}`);else if(e instanceof Ref)t.push(`${e.num} ${e.gen} R`);else if(Array.isArray(e)||ArrayBuffer.isView(e))await async function writeArray(e,t,a){t.push("[");for(let n=0,s=e.length;n=256&&!o)try{const e=new CompressionStream("deflate"),t=e.writable.getWriter();await t.ready;t.write(n).then(async()=>{await t.ready;await t.close()}).catch(()=>{});n=await new Response(e.readable).bytes();let a,l;if(r){if(!o){a=Array.isArray(r)?[Name.get("FlateDecode"),...r]:[Name.get("FlateDecode"),r];i&&(l=Array.isArray(i)?[null,...i]:[null,i])}}else a=Name.get("FlateDecode");a&&s.set("Filter",a);l&&s.set("DecodeParms",l)}catch(e){info(`writeStream - cannot compress data: "${e}".`)}let l=bytesToString(n);a&&(l=a.encryptString(l));s.set("Length",l.length);await writeDict(s,t,a);t.push(" stream\n",l,"\nendstream")}(e,t,a):null===e?t.push("null"):warn(`Unhandled value in writer: ${typeof e}, please file a bug.`)}function writeInt(e,t,a,n){for(let s=t+a-1;s>a-1;s--){n[s]=255&e;e>>=8}return a+t}function writeString(e,t,a){const n=e.length;for(let s=0;s1&&(r=a.documentElement.searchNode([s.at(-1)],0));r?r.childNodes=Array.isArray(n)?n.map(e=>new SimpleDOMNode("value",e)):[new SimpleDOMNode("#text",n)]:warn(`Node not found for path: ${t}`)}const n=[];a.documentElement.dump(n);return n.join("")}(n.fetchIfRef(t).getString(),a)}const s=new StringStream(e);s.dict=new Dict(n);s.dict.setIfName("Type","EmbeddedFile");a.put(t,{data:s})}function getIndexes(e){const t=[];for(const{ref:a}of e)a.num===t.at(-2)+t.at(-1)?t[t.length-1]+=1:t.push(a.num,1);return t}function computeIDs(e,t,a){if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const n=function computeMD5(e,t){const a=Math.floor(Date.now()/1e3),n=t.filename||"",s=[a.toString(),n,e.toString(),...t.infoMap.values()],r=Math.sumPrecise(s.map(e=>e.length)),i=new Uint8Array(r);let o=0;for(const e of s)o=writeString(e,o,i);return bytesToString(calculateMD5(i,0,i.length))}(e,t);a.set("ID",[t.fileIds[0]||n,n])}}async function incrementalUpdate({originalData:e,xrefInfo:t,changes:a,xref:n=null,hasXfa:s=!1,xfaDatasetsRef:r=null,hasXfaDatasetsEntry:i=!1,needAppearances:o,acroFormRef:l=null,acroForm:f=null,xfaData:c=null,useXrefStream:h=!1}){await async function updateAcroform({xref:e,acroForm:t,acroFormRef:a,hasXfa:n,hasXfaDatasetsEntry:s,xfaDatasetsRef:r,needAppearances:i,changes:o}){!n||s||r||warn("XFA - Cannot save it");if(!i&&(!n||!r||s))return;const l=t.clone();if(n&&!s){const e=t.get("XFA").slice();e.splice(2,0,"datasets");e.splice(3,0,r);l.set("XFA",e)}i&&l.set("NeedAppearances",!0);o.put(a,{data:l})}({xref:n,acroForm:f,acroFormRef:l,hasXfa:s,hasXfaDatasetsEntry:i,xfaDatasetsRef:r,needAppearances:o,changes:a});s&&updateXFA({xfaData:c,xfaDatasetsRef:r,changes:a,xref:n});const u=function getTrailerDict(e,t,a){const n=new Dict(null);n.setIfDefined("Prev",e?.startXRef);const s=e.newRef;if(a){t.put(s,{data:""});n.set("Size",s.num+1);n.setIfName("Type","XRef")}else n.set("Size",s.num);n.setIfDefined("Root",e?.rootRef);n.setIfDefined("Info",e?.infoRef);n.setIfDefined("Encrypt",e?.encryptRef);return n}(t,a,h),m=[],p=await async function writeChanges(e,t,a=[]){const n=[];for(const[s,{data:r,objStreamRef:i,index:o}]of e.items())if(i)n.push({ref:s,data:r,objStreamRef:i,index:o});else if(null!==r&&"string"!=typeof r){await writeObject(s,r,a,t);n.push({ref:s,data:a.join("")});a.length=0}else n.push({ref:s,data:r});return n.sort((e,t)=>e.ref.num-t.ref.num)}(a,n,m);let d=e.length;const g=e.at(-1);if(10!==g&&13!==g){m.push("\n");d+=1}for(const{data:e}of p)null!==e&&m.push(e);await(h?async function getXRefStreamTable(e,t,a,n,s){const r=[];let i=0,o=0;for(const{ref:e,data:n,objStreamRef:s,index:l}of a){let a;i=Math.max(i,t);if(s){a=l;r.push([2,s.num,a])}else if(null!==n){a=Math.min(e.gen,65535);r.push([1,t,a]);t+=n.length}else{a=Math.min(e.gen+1,65535);r.push([0,0,a])}o=Math.max(o,a)}n.set("Index",getIndexes(a));const l=[1,getSizeInBytes(i),getSizeInBytes(o)];n.set("W",l);computeIDs(t,e,n);const f=Math.sumPrecise(l),c=new Uint8Array(f*r.length),h=new Stream(c);h.dict=n;let u=0;for(const[e,t,a]of r){u=writeInt(e,l[0],u,c);u=writeInt(t,l[1],u,c);u=writeInt(a,l[2],u,c)}await writeObject(e.newRef,h,s,{});s.push("startxref\n",t.toString(),"\n%%EOF\n")}(t,d,p,u,m):async function getXRefTable(e,t,a,n,s){s.push("xref\n");const r=getIndexes(a);let i=0;for(const{ref:e,data:n}of a){if(e.num===r[i]){s.push(`${r[i]} ${r[i+1]}\n`);i+=2}if(null!==n){s.push(`${t.toString().padStart(10,"0")} ${Math.min(e.gen,65535).toString().padStart(5,"0")} n\r\n`);t+=n.length}else s.push(`0000000000 ${Math.min(e.gen+1,65535).toString().padStart(5,"0")} f\r\n`)}computeIDs(t,e,n);s.push("trailer\n");await writeDict(n,s,null);s.push("\nstartxref\n",t.toString(),"\n%%EOF\n")}(t,d,p,u,m));const b=e.length+Math.sumPrecise(m.map(e=>e.length)),w=new Uint8Array(b);w.set(e);let j=e.length;for(const e of m)j=writeString(e,j,w);return w}class PageData{constructor(e,t){this.page=e;this.documentData=t;this.annotations=null;this.pointingNamedDestinations=null;t.pagesMap.put(e.ref,this)}}class DocumentData{constructor(e){this.document=e;this.destinations=null;this.pageLabels=null;this.pagesMap=new RefSetCache;this.oldRefMapping=new RefSetCache;this.dedupNamedDestinations=new Map;this.usedNamedDestinations=new Set;this.postponedRefCopies=new RefSetCache;this.usedStructParents=new Set;this.oldStructParentMapping=new Map;this.structTreeRoot=null;this.parentTree=null;this.idTree=null;this.roleMap=null;this.classMap=null;this.namespaces=null;this.structTreeAF=null;this.structTreePronunciationLexicon=[];this.acroForm=null;this.acroFormDefaultAppearance="";this.acroFormDefaultResources=null;this.acroFormQ=0;this.hasSignatureAnnotations=!1;this.fieldToParent=new RefSetCache;this.outline=null;this.embeddedFiles=null}}class XRefWrapper{constructor(e,t){this.entries=e;this._getNewRef=t}fetch(e){return e instanceof Ref?this.entries[e.num]:e}fetchIfRefAsync(e){return Promise.resolve(this.fetch(e))}fetchIfRef(e){return this.fetch(e)}fetchAsync(e){return Promise.resolve(this.fetch(e))}getNewTemporaryRef(){return this._getNewRef()}}class PDFEditor{hasSingleFile=!1;isSingleFile=!1;#Vt=null;currentDocument=null;oldPages=[];newPages=[];xref=[null];xrefWrapper=new XRefWrapper(this.xref,()=>this.newRef);newRefCount=1;namesDict=null;version="1.7";pageLabels=null;namedDestinations=new Map;parentTree=new Map;structTreeKids=[];idTree=new Map;classMap=new Dict;roleMap=new Dict;namespaces=new Map;structTreeAF=[];structTreePronunciationLexicon=[];fields=[];acroFormDefaultAppearance="";acroFormDefaultResources=null;acroFormNeedAppearances=!1;acroFormSigFlags=0;acroFormCalculationOrder=null;acroFormQ=0;outlineItems=null;embeddedFiles=new Map;constructor({useObjectStreams:e=!0,title:t="",author:a=""}={}){[this.rootRef,this.rootDict]=this.newDict;[this.infoRef,this.infoDict]=this.newDict;[this.pagesRef,this.pagesDict]=this.newDict;this.useObjectStreams=e;this.objStreamRefs=e?new Set:null;this.title=t;this.author=a}get newRef(){return Ref.get(this.newRefCount++,0)}get newDict(){const e=this.newRef;return[e,this.xref[e.num]=new Dict]}async#$t(e,t){const a=this.newRef;this.xref[a.num]=await this.#Yt(e,!0,t);return a}cloneDict(e){const t=e.clone();t.xref=this.xrefWrapper;return t}async#Yt(e,t,a){if(e instanceof Ref){const{currentDocument:{oldRefMapping:t}}=this;let n=t.get(e);if(n)return n;const s=e;if("number"==typeof(e=await a.fetchAsync(s)))return e;n=this.newRef;t.put(s,n);this.xref[n.num]=await this.#Yt(e,!0,a);return n}const n=[],{currentDocument:{postponedRefCopies:s}}=this;if(Array.isArray(e)){t&&(e=e.slice());for(let t=0,r=e.length;te[t]=a):n.push(this.#Yt(e[t],!0,a).then(a=>e[t]=a))}await Promise.all(n);return e}let r;if(e instanceof BaseStream){({dict:r}=e=e.getOriginalStream().clone());r.xref=this.xrefWrapper}else if(e instanceof Dict){t&&((e=e.clone()).xref=this.xrefWrapper);r=e}if(r){for(const[e,t]of r.getRawEntries()){const i=t instanceof Ref&&s.get(t);i?i.push(t=>r.set(e,t)):n.push(this.#Yt(t,!0,a).then(t=>r.set(e,t)))}await Promise.all(n)}return e}async#Jt(e,t,a,n,s,r,i,o=new RefSet){const{currentDocument:{pagesMap:l,oldRefMapping:f}}=this,c=t.getRaw("Pg");if(c instanceof Ref&&!l.has(c))return null;let h;const u=h=t.getRaw("K");if(u instanceof Ref){if(o.has(u))return null;h=await a.fetchAsync(u);Array.isArray(h)||(h=[u])}h=Array.isArray(h)?h:[h];const m=[],p=[];for(let t of h){const c=t instanceof Ref?t:null;if(c){if(o.has(c))continue;o.put(c);t=await a.fetchAsync(c)}if("number"==typeof t){m.push(t);continue}if(!(t instanceof Dict))continue;const h=t.getRaw("Pg");if(h instanceof Ref&&!l.has(h))continue;const u=t.get("Type");if(!u||isName(u,"StructElem")){let e=!1;if(c&&n.has(c)){if(!isName(t.get("S"),"Link"))continue;e=!0}const l=await this.#Jt(c,t,a,n,s,r,i,o);if(l){p.push(m.length);m.push(l);c&&f.put(c,l);e&&this.xref[l.num].setIfName("S","Span")}continue}if(isName(u,"OBJR")){if(!c)continue;const t=f.get(c);if(!t)continue;const a=this.xref[t.num].getRaw("Obj");if(a instanceof Ref){const t=this.xref[a.num];if(t instanceof Dict&&!t.has("StructParent")&&e){const a=this.parentTree.size;this.parentTree.set(a,[f,e]);t.set("StructParent",a)}}m.push(t);continue}if(isName(u,"MCR")){const e=await this.#Yt(c||t,!0,a);m.push(e);continue}if(c){const e=await this.#Yt(c,!0,a);m.push(e)}}if(0!==h.length&&0===m.length)return null;const d=this.newRef,g=this.xref[d.num]=this.cloneDict(t);g.delete("ID");g.delete("C");g.delete("K");g.delete("P");g.delete("S");await this.#Yt(g,!1,a);const b=t.get("C");if(b instanceof Name){const e=r.get(b.name);e?g.set("C",Name.get(e)):g.set("C",b)}else if(Array.isArray(b)){const e=[];for(const t of b)if(t instanceof Name){const a=r.get(t.name);a?e.push(Name.get(a)):e.push(t)}g.set("C",e)}const w=t.get("S");if(w instanceof Name){const e=i.get(w.name);e?g.set("S",Name.get(e)):g.set("S",w)}const j=t.get("ID");if("string"==typeof j){const e=stringToPDFString(j,!1),t=s.get(e);t?g.set("ID",stringToAsciiOrUTF16BE(t)):g.set("ID",j)}let k=g.get("A");if(k){Array.isArray(k)||(k=[k]);for(let e of k){e=this.xrefWrapper.fetch(e);if(isName(e.get("O"),"Table")&&e.has("Headers")){const t=this.xrefWrapper.fetch(e.getRaw("Headers"));if(Array.isArray(t))for(let e=0,a=t.length;e1&&g.set("K",m);return d}#Qt({document:e,includePages:t,excludePages:a}){if(!e)return[];let n,s,r,i;for(const e of t||[])Array.isArray(e)?(s||=[]).push(e):(n||=new Set).add(e);for(const e of a||[])Array.isArray(e)?(i||=[]).push(e):(r||=new Set).add(e);const o=[];for(let t=0,a=e.numPages;t=a&&t<=n){e=!0;break}if(e)continue}let e=!1;n&&(e=n.has(t));if(!e&&s)for(const[a,n]of s)if(t>=a&&t<=n){e=!0;break}e||n||s||(e=!0);e&&o.push(t)}return o}#Zt(e){const t=[],a=[];for(let n=0;ne.insertAfter-t.insertAfter);if(a.length>0)for(const t of e){if(!t.document||!t.pageIndices)continue;const e=this.#Qt(t).length;if(t.pageIndices.length0&&e.some(e=>e.document&&e.pageIndices);if(0===t.length&&n){const t=e.slice();let n=-1;for(const t of e)if(t.document&&t.pageIndices)for(const e of t.pageIndices)e>n&&(n=e);let s=0;for(const{i:e,insertAfter:r,count:i}of a){const a=Math.min(Math.max(r,-1)+s,n);for(let e=0;ee<=a)&&(t[e]={...n,pageIndices:n.pageIndices.map(e=>e>a?e+i:e)})}const o=[];for(let e=0;e{if(!e.document||e.pageIndices)return e;const a={...e,pageIndices:r[t]||[]};delete a.insertAfter;return a})}async extractPages(e,t,a,n){e.some(e=>void 0!==e.insertAfter)&&(e=this.#Zt(e));const s=[];let r=0;this.isSingleFile=1===e.length||e.every(t=>t.document===e[0].document);this.hasSingleFile=1===e.length;const i=[];t&&(this.#Vt={handler:a,task:n,newAnnotationsByPage:getNewAnnotationsMap(t),imagesPromises:AnnotationFactory.generateImages(t.values(),this.xrefWrapper,!0)});for(const{document:t,includePages:a,excludePages:n,pageIndices:o}of e){if(!t)continue;o&&(r=-1);const e=new DocumentData(t);i.push(e);s.push(this.#ea(e));let l=0;for(const i of this.#Qt({document:t,includePages:a,excludePages:n})){let a;o&&(a=o[l++]);if(void 0===a)if(-1!==r)a=r++;else for(a=0;void 0!==this.oldPages[a];a++);this.oldPages[a]=null;s.push(t.getPage(i).then(t=>{this.oldPages[a]=new PageData(t,e)}))}}await Promise.all(s);s.length=0;this.#ta(i);this.#aa(i);this.#na();for(const e of this.oldPages)s.push(this.#sa(e));await Promise.all(s);this.#ra();this.#ia(i);for(let e=0,t=this.oldPages.length;ee.destinations=t),t.ensureCatalog("rawPageLabels").then(t=>e.pageLabels=t),t.ensureCatalog("structTreeRoot").then(t=>e.structTreeRoot=t),t.ensureCatalog("acroForm").then(t=>e.acroForm=t),t.ensureCatalog("documentOutlineForEditor").then(t=>e.outline=t),t.ensureCatalog("rawEmbeddedFiles").then(t=>e.embeddedFiles=t)]);const n=e.structTreeRoot;if(n){const t=n.dict,s=t.get("ParentTree");if(s){const t=new NumberTree(s,a);e.parentTree=t.getAll(!0)}const r=t.get("IDTree");if(r){const t=new NameTree(r,a);e.idTree=t.getAll(!0)}e.roleMap=t.get("RoleMap")||null;e.classMap=t.get("ClassMap")||null;let i=t.get("Namespaces")||null;i&&!Array.isArray(i)&&(i=[i]);e.namespaces=i;e.structTreeAF=t.get("AF")||null;e.structTreePronunciationLexicon=t.get("PronunciationLexicon")||null}}async#sa(e){const{page:{xref:t,annotations:a},documentData:{pagesMap:n,destinations:s,usedNamedDestinations:r,fieldToParent:i}}=e;if(!a)return;const o=[];let l=[],f=0,{hasSignatureAnnotations:c}=e.documentData;for(const e of a){const a=f++;o.push(t.fetchIfRefAsync(e).then(async t=>{if(!isName(t.get("Subtype"),"Link")){if(isName(t.get("Subtype"),"Widget")){c||=isName(t.get("FT"),"Sig");const a=t.get("Parent")||null;t.delete("Parent");i.put(e,a)}l[a]=e;return}const o=t.get("A"),f=o instanceof Dict?o.get("D"):t.get("Dest");if(f&&(!Array.isArray(f)||f[0]instanceof Ref&&!n.has(f[0]))){if("string"==typeof f){const t=stringToPDFString(f,!0);if(s.has(t)){l[a]=e;r.add(t)}}}else l[a]=e}))}await Promise.all(o);l=l.filter(e=>!!e);e.annotations=l.length>0?l:null;e.documentData.hasSignatureAnnotations||=c}#ia(e){for(const{postponedRefCopies:t,pagesMap:a}of e)for(const e of a.keys())t.put(e,[])}#la(e){for(const{postponedRefCopies:t,oldRefMapping:a}of e){for(const[e,n]of t.items()){const t=a.get(e);for(const e of n)e(t)}t.clear()}}#ma(e,t,a=new RefSet){if(e instanceof Ref){if(!a.has(e)){a.put(e);this.#ma(this.xref[e.num],t,a)}return}if(Array.isArray(e)){for(const n of e)this.#ma(n,t,a);return}let n;e instanceof BaseStream?({dict:n}=e):e instanceof Dict&&(n=e);if(n){t(n);for(const e of n.getRawValues())this.#ma(e,t,a)}}async#fa(e){let t=0;const{parentTree:a}=this;for(let e=0,n=this.newPages.length;e{const l=e.get("StructParent")??e.get("StructParents");if("number"!=typeof l)return;i.add(l);let f=n.get(l);const c=f instanceof Ref?f:null;if(c){const e=o.fetch(c);Array.isArray(e)&&(f=e)}Array.isArray(f)&&f.every(e=>null===e)&&(f=null);if(!f){e.has("StructParent")?e.delete("StructParent"):e.delete("StructParents");return}let h=r.get(l);if(void 0===h){h=t++;r.set(l,h);a.set(h,[s,f])}e.has("StructParent")?e.set("StructParent",h):e.set("StructParents",h)},c)}const{structTreeKids:n,idTree:s,classMap:r,roleMap:i,namespaces:o,structTreeAF:l,structTreePronunciationLexicon:f}=this;for(const t of e){const{document:{xref:e},oldRefMapping:a,parentTree:c,usedStructParents:h,structTreeRoot:u,idTree:m,classMap:p,roleMap:d,namespaces:g,structTreeAF:b,structTreePronunciationLexicon:w}=t;if(!u)continue;this.currentDocument=t;const j=new RefSet;for(const[e,t]of c||[])!h.has(e)&&t instanceof Ref&&j.put(t);const k=new Map;for(const[e,t]of m||[]){let a=e;if(s.has(e))for(let t=1;;t++){const n=`${e}_${t}`;if(!s.has(n)){k.set(e,n);a=n;break}}s.set(a,t)}const y=new Map;if(p?.size>0)for(let[t,a]of p){a=await this.#Yt(a,!0,e);if(r.has(t))for(let e=1;;e++){const a=`${t}_${e}`;if(!r.has(a)){y.set(t,a);t=a;break}}r.set(t,a)}const q=new Map;if(d?.size>0)for(const[e,t]of d){const a=i.get(e);if(a){if(a!==t)for(let a=1;;a++){const n=`${e}_${a}`;if(!i.has(n)){q.set(e,n);i.set(n,t);break}}}else i.set(e,t)}if(g?.length>0)for(const t of g){const a=await e.fetchIfRefAsync(t);let n=a.get("NS");if(!n||o.has(n))continue;n=stringToPDFString(n,!1);const s=await this.#Yt(a,!0,e);o.set(n,s)}if(b)for(const t of b)l.push(await this.#Yt(t,!0,e));if(w)for(const t of w)f.push(await this.#Yt(t,!0,e));let v=u.dict.get("K");if(v){v=Array.isArray(v)?v:[v];for(let t of v){const a=t instanceof Ref?t:null;if(a&&j.has(a))continue;t=await e.fetchIfRefAsync(t);const s=await this.#Jt(a,t,e,j,k,y,q);s&&n.push(s)}for(const[e,t]of m||[]){const n=t instanceof Ref&&a.get(t),r=k.get(e)||e;n?s.set(r,n):s.delete(r)}}}for(const[e,[t,n]]of a){if(!n){a.delete(e);continue}if(!Array.isArray(n)){const s=t.get(n);void 0===s?a.delete(e):a.set(e,s);continue}const s=n.map(e=>e instanceof Ref&&t.get(e)||null);0===s.length||s.every(e=>null===e)?a.delete(e):a.set(e,s)}this.currentDocument=null}#ta(e){for(const t of e){if(!t.destinations)continue;const{destinations:e,pagesMap:a}=t,n=t.destinations=new Map;for(const[t,s]of Object.entries(e)){const e=s[0],r=e instanceof Ref&&a.get(e);if(r){(r.pointingNamedDestinations||=new Set).add(t);n.set(t,s)}}}}#ra(){const{namedDestinations:e}=this,getUniqueDestinationName=t=>{if(!e.has(t))return t;for(let a=1;;a++){const n=`${t}_${a}`;if(!e.has(n))return n}};for(let t=0,a=this.oldPages.length;t{"string"==typeof n&&e.set(a,t.get(stringToPDFString(n,!0))||n)};for(const t of e){const e=this.xref[t.num];if(!isName(e.get("Subtype"),"Link"))continue;const a=e.get("A");if(a instanceof Dict&&a.has("D")){const e=a.get("D");fixDestination(a,"D",e);continue}const n=e.get("Dest");fixDestination(e,"Dest",n)}}#aa(e){const collect=(e,t,a)=>{for(const n of e){"string"==typeof n.dest&&t?.has(n.dest)&&a.add(n.dest);n.items.length>0&&collect(n.items,t,a)}};for(const t of e){const{outline:e,destinations:a,usedNamedDestinations:n}=t;e?.length&&collect(e,a,n)}}#da(e,t){const{dest:a,action:n,url:s,unsafeUrl:r,attachment:i,setOCGState:o}=e;if(n||s||r||i||o)return!0;if(!a)return!1;if("string"==typeof a){const e=t.dedupNamedDestinations.get(a)||a;return this.namedDestinations.has(e)}return!!(Array.isArray(a)&&a[0]instanceof Ref)&&!!t.oldRefMapping.get(a[0])}#ga(e,t){const a=[];for(const n of e){const e=this.#ga(n.items,t),s=this.#da(n,t);(s||e.length>0)&&a.push({...n,dest:s?n.dest:null,rawDict:s?n.rawDict:null,items:e,_documentData:t})}return a}#ha(e){const t=[];for(const a of e){const{outline:e}=a;e?.length&&t.push(...this.#ga(e,a))}this.outlineItems=t.length>0?t:null}async#ba(e,t){const{dest:a,rawDict:n}=t,s=t._documentData;if(a){if("string"==typeof a){const t=s.dedupNamedDestinations.get(a)||a;e.set("Dest",stringToAsciiOrUTF16BE(t))}else if(Array.isArray(a)){const t=a.slice();t[0]instanceof Ref&&(t[0]=s.oldRefMapping.get(t[0])||t[0]);e.set("Dest",t)}return}const r=n?.get("A");if(r instanceof Dict){this.currentDocument=s;const t=await this.#$t(r,s.document.xref);this.currentDocument=null;e.set("A",t)}}async#wa(){const{outlineItems:e}=this;if(!e?.length)return;const[t,a]=this.newDict;a.setIfName("Type","Outlines");const assignRefs=e=>{for(const t of e){[t._ref]=this.newDict;t.items.length>0&&assignRefs(t.items)}};assignRefs(e);const fillItems=async(e,t)=>{let a=0;for(let n=0;n0&&r.set("Prev",e[n-1]._ref);n0){r.set("First",s.items[0]._ref);r.set("Last",s.items.at(-1)._ref);const e=await fillItems(s.items,s._ref);void 0!==s.count&&r.set("Count",s.count<0?-e:e);a+=void 0!==s.count&&s.count<0?1:e+1}else a+=1;await this.#ba(r,s);const i=(s.bold?2:0)|(s.italic?1:0);0!==i&&r.set("F",i);!s.color||0===s.color[0]&&0===s.color[1]&&0===s.color[2]||r.set("C",[s.color[0]/255,s.color[1]/255,s.color[2]/255])}return a},n=await fillItems(e,t);a.set("First",e[0]._ref);a.set("Last",e.at(-1)._ref);a.set("Count",n);this.rootDict.set("Outlines",t)}async#ca(e){this.#ja(e);this.#ka(e);this.#ya(e);await this.#qa(e);const t=this.fields;for(const a of e){let e=a.acroForm?.get("Fields")||null;!e&&a.fieldToParent.size>0&&(e=this.#va(a.fieldToParent,a.document.xref));if(Array.isArray(e)&&e.length>0){this.currentDocument=a;await this.#Sa(t,e);this.currentDocument=null}}this.#Aa(e)}#ya(e){let t=0,a=null;for(const n of e){const e=n.acroForm?.get("Q");if("number"==typeof e&&0!==e)if(a?.acroFormQ>0)n.acroFormQ=e;else if(0!==t){if(e!==t){a.acroFormQ||=t;n.acroFormQ=e;t=0}}else{t=e;a=n}}t>0&&(this.acroFormQ=t)}#ja(e){let t=0,a=!1;for(const n of e){if(!n.acroForm)continue;const e=n.acroForm.get("SigFlags");"number"==typeof e&&n.hasSignatureAnnotations&&(t|=e);!0===n.acroForm.get("NeedAppearances")&&(a=!0)}this.acroFormSigFlags=t;this.acroFormNeedAppearances=a}#Aa(e){const t=[];for(const a of e){const e=a.acroForm?.get("CO")||null;if(!Array.isArray(e))continue;const{oldRefMapping:n}=a;for(const a of e){const e=a instanceof Ref&&n.get(a);e&&t.push(e)}}this.acroFormCalculationOrder=t.length>0?t:null}#ka(e){let t=null,a=null;for(const n of e){const e=n.acroForm?.get("DA")||null;if(e&&"string"==typeof e)if(a?.acroFormDefaultAppearance)n.acroFormDefaultAppearance=e;else if(t){if(e!==t){a.acroFormDefaultAppearance||=t;n.acroFormDefaultAppearance=e;t=null}}else{t=e;a=n}}t&&(this.acroFormDefaultAppearance=t)}async#qa(e){let t=null,a=null,n=null;for(const s of e){const e=s.acroForm?.get("DR")||null;if(e&&e instanceof Dict)if(n?.acroFormDefaultResources)s.acroFormDefaultResources=e;else if(t){if(!deepCompare(t,e)){n.acroFormDefaultResources||=t;s.acroFormDefaultResources=e;t=null;a=null}}else{t=e;a=s.acroForm.getRaw("DR");n=s}}if(t){this.currentDocument=n;this.acroFormDefaultResources=await this.#Yt(a,!0,n.document.xref);this.currentDocument=null}}#va(e,t){const a=[],n=new RefSet;for(const[s,r]of e){if(!r){a.push(s);continue}let e=r,i=r;for(;;){e=t.fetchIfRef(e)?.getRaw("Parent")||null;if(!e)break;i=e}if(i instanceof Ref&&!n.has(i)){a.push(i);n.put(i)}}return a}async#Sa(e,t){const a=new RefSet,n=[{kids:t,newKids:e,pos:0,oldParentRef:null,parentRef:null,parent:null}],{document:{xref:s},oldRefMapping:r,fieldToParent:i,acroFormDefaultAppearance:o,acroFormDefaultResources:l,acroFormQ:f}=this.currentDocument,c=[],h=[];for(;n.length>0;){const e=n.at(-1),{kids:t,newKids:u,parent:m,pos:p}=e;if(p===t.length){n.pop();if(0===u.length||!m)continue;const t=this.xref[e.parentRef.num]=this.cloneDict(m);t.delete("Parent");t.delete("Kids");await this.#Yt(t,!1,s);t.set("Kids",u);if(n.length>0){const a=n.at(-1);if(!a.parentRef&&a.oldParentRef){const e=a.parentRef=this.newRef;t.set("Parent",e);r.put(a.oldParentRef,e)}a.newKids.push(e.parentRef)}continue}const d=t[e.pos++];if(!(d instanceof Ref)||a.has(d))continue;a.put(d);const g=s.fetchIfRef(d);if(g.has("Kids")){const e=g.get("Kids");if(!Array.isArray(e))continue;n.push({kids:e,newKids:[],pos:0,oldParentRef:d,parentRef:null,parent:g});continue}if(!i.has(d))continue;const b=r.get(d);if(!b)continue;u.push(b);if(!e.parentRef&&e.oldParentRef){e.parentRef=this.newRef;r.put(e.oldParentRef,e.parentRef)}const w=this.xref[b.num];e.parentRef&&w.set("Parent",e.parentRef);o&&isName(w.get("FT"),"Tx")&&!w.has("DA")&&c.push(w);l&&!w.has("Kids")&&w.get("AP")instanceof Dict&&h.push(w);f&&!w.has("Q")&&w.set("Q",f)}for(const e of c){getInheritableProperty({dict:e,key:"DA"})||e.set("DA",o)}const u=new Map;for(const e of h){const t=e.get("AP");for(const[,e]of t){if(!(e instanceof BaseStream))continue;let t=e.dict.getRaw("Resources");if(!t){const t=await u.getOrInsertComputed(l,()=>this.#$t(l,s));e.dict.set("Resources",t);continue}t=s.fetchIfRef(t);for(const[e,a]of l.getRawEntries())if(!t.has(e)){let n=a;a instanceof Ref?n=await this.#Yt(a,!0,s):(a instanceof Dict||a instanceof BaseStream||Array.isArray(a))&&(n=await u.getOrInsertComputed(a,()=>this.#$t(a,s)));t.set(e,n)}}}}async#na(){if(!this.hasSingleFile)return;const{documentData:{document:e,pageLabels:t}}=this.oldPages[0];if(!t)return;const a=e.numPages,n=[],s=new Set(this.oldPages.map(({page:{pageIndex:e}})=>e));let r=null,i=-1;for(let e=0;ee!==f[t])&&m.set(e,a)}const d=t.userUnit;1!==d&&m.set("UserUnit",d);m.setIfDict("Resources",await this.#Yt(c,!0,o));let g=null;if(n){const e=await this.#Yt(n,!0,o);this.#pa(e,r);Array.isArray(e)&&e.length>0&&(g=e)}const b=this.#Vt?.newAnnotationsByPage?.get(e);if(b){const{handler:e,task:a,imagesPromises:n}=this.#Vt,s=new RefSetCache,r=await AnnotationFactory.saveNewAnnotations(t.createAnnotationEvaluator(e),this.xrefWrapper,a,b,n,s);for(const[e,{data:t}]of s.items())this.xref[e.num]=t;g||=[];for(const{ref:e}of r.annotations)g.push(e)}m.setIfArray("Annots",g);if(this.useObjectStreams){const e=this.newRefCount,t=[];for(let a=p;a0;){const{dict:e,kids:t,parentRef:a}=s.pop();if(t.length<=16){e.set("Kids",t);for(const e of t)this.xref[e.num].set("Parent",a);continue}const n=Math.max(16,Math.ceil(t.length/16)),r=[];for(let e=0;ee.localeCompare(t):([e],[t])=>e-t),[n,s]=this.newDict,r=[{dict:s,entries:a,isRoot:!0}],i=t?"Names":"Nums";for(;r.length>0;){const{dict:e,entries:t,isRoot:a}=r.pop();if(t.length<=64){a||e.set("Limits",[t[0][0],t.at(-1)[0]]);e.set(i,t.flat());continue}const n=[],s=Math.max(64,Math.ceil(t.length/64));for(let e=0;e0){const e=this.#Ca(Array.from(this.parentTree.entries()),!1);this.xref[e.num].setIfName("Type","ParentTree");n.set("ParentTree",e);n.set("ParentTreeNextKey",this.parentTree.size)}if(this.idTree.size>0){const e=this.#Ca(Array.from(this.idTree.entries()),!0);this.xref[e.num].setIfName("Type","IDTree");n.set("IDTree",e)}if(this.classMap.size>0){const e=this.newRef;this.xref[e.num]=this.classMap;n.set("ClassMap",e)}if(this.roleMap.size>0){const e=this.newRef;this.xref[e.num]=this.roleMap;n.set("RoleMap",e)}if(this.namespaces.size>0){const e=this.newRef;this.xref[e.num]=Array.from(this.namespaces.values());n.set("Namespaces",e)}if(this.structTreeAF.length>0){const e=this.newRef;this.xref[e.num]=this.structTreeAF;n.set("AF",e)}if(this.structTreePronunciationLexicon.length>0){const e=this.newRef;this.xref[e.num]=this.structTreePronunciationLexicon;n.set("PronunciationLexicon",e)}t.set("StructTreeRoot",a)}#Ra(){if(0===this.fields.length)return;const{rootDict:e}=this,t=this.newRef,a=this.xref[t.num]=new Dict;e.set("AcroForm",t);a.set("Fields",this.fields);this.acroFormNeedAppearances&&a.set("NeedAppearances",!0);this.acroFormSigFlags>0&&a.set("SigFlags",this.acroFormSigFlags);a.setIfArray("CO",this.acroFormCalculationOrder);a.setIfDict("DR",this.acroFormDefaultResources);this.acroFormDefaultAppearance&&a.set("DA",this.acroFormDefaultAppearance);this.acroFormQ>0&&a.set("Q",this.acroFormQ)}async#Ha(){const{rootDict:e}=this;e.setIfName("Type","Catalog");e.setIfName("Version",this.version);this.#Ra();this.#xa();this.#Ia();this.#Fa();this.#Ta();this.#Oa();await this.#wa()}#Ba(){const e=new Map;if(this.isSingleFile){const{xref:{trailer:t}}=this.oldPages[0].documentData.document,a=t.get("Info");for(const[t,n]of a||[])"string"==typeof n&&e.set(t,stringToPDFString(n))}e.delete("ModDate");e.set("CreationDate",getModificationDate());e.set("Creator","PDF.js");e.set("Producer","Firefox");this.author&&e.set("Author",this.author);this.title&&e.set("Title",this.title);for(const[t,a]of e)this.infoDict.set(t,stringToAsciiOrUTF16BE(a));return e}async#Da(){if(!this.isSingleFile)return[null,null,null];const{documentData:e}=this.oldPages[0],{document:{xref:{trailer:t,encrypt:a}}}=e;if(!t.has("Encrypt"))return[null,null,null];const n=t.get("Encrypt");if(!(n instanceof Dict))return[null,null,null];this.currentDocument=e;const s=[await this.#$t(n,t.xref),a,t.get("ID")];this.currentDocument=null;return s}async#Ma(){const e=new RefSetCache;e.put(Ref.get(0,65535),{data:null});for(let t=1,a=this.xref.length;t{this._contentLength=e.contentLength;this._isStreamingSupported=e.isStreamingSupported;this._isRangeSupported=e.isRangeSupported;this._headersCapability.resolve()},this._headersCapability.reject)}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader{_reader=null;constructor(e,t,a){super(e,t,a);const{msgHandler:n}=e._source,s=n.sendWithStream("GetRangeReader",{begin:t,end:a});this._reader=s.getReader()}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=Promise.withResolvers()}get finished(){return this._capability.promise}finish(){this._capability.resolve()}terminate(){this.terminated=!0}ensureNotTerminated(){if(this.terminated)throw new Error("Worker task was terminated")}}class WorkerMessageHandler{static{"undefined"==typeof window&&!e&&"undefined"!=typeof self&&"function"==typeof self.postMessage&&"onmessage"in self&&this.initializeFromPort(self)}static setup(e,t){let a=!1;e.on("test",t=>{if(!a){a=!0;e.send("test",t instanceof Uint8Array)}});e.on("configure",e=>{!function setVerbosityLevel(e){Number.isInteger(e)&&(ta=e)}(e.verbosity)});e.on("GetDocRequest",e=>this.createDocumentHandler(e,t))}static createDocumentHandler(e,t){let a,n=!1,s=null;const r=new Set,i=getVerbosityLevel(),{docId:o,apiVersion:l}=e,f="5.7.284";if(l!==f)throw new Error(`The API version "${l}" does not match the Worker version "${f}".`);const buildMsg=(e,t)=>`The \`${e}.prototype\` contains unexpected enumerable property "${t}", thus breaking e.g. \`for...in\` iteration of ${e}s.`;for(const e in{})throw new Error(buildMsg("Object",e));for(const e in[])throw new Error(buildMsg("Array",e));const c=o+"_worker";let h=new MessageHandler(c,o,t);function ensureNotTerminated(){if(n)throw new Error("Worker was terminated")}function startWorkerTask(e){r.add(e)}function finishWorkerTask(e){e.finish();r.delete(e)}async function loadDocument(e){await a.ensureDoc("checkHeader");await a.ensureDoc("parseStartXRef");await a.ensureDoc("parse",[e]);await a.ensureDoc("checkFirstPage",[e]);await a.ensureDoc("checkLastPage",[e]);const t=await a.ensureDoc("isPureXfa");if(t){const e=new WorkerTask("loadXfaResources");startWorkerTask(e);await a.ensureDoc("loadXfaResources",[h,e]);finishWorkerTask(e)}const[n,s]=await Promise.all([a.ensureDoc("numPages"),a.ensureDoc("fingerprints")]);return{numPages:n,fingerprints:s,htmlForXfa:t?await a.ensureDoc("htmlForXfa"):null}}function setupDoc(e){function onSuccess(e){ensureNotTerminated();h.send("GetDoc",{pdfInfo:e})}function onFailure(e){if(!n)if(e instanceof PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);h.sendWithPromise("PasswordRequest",e).then(function({password:e}){finishWorkerTask(t);a.updatePassword(e);pdfManagerReady()}).catch(function(){finishWorkerTask(t);h.send("DocException",e)})}else h.send("DocException",wrapReason(e))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,function(e){ensureNotTerminated();e instanceof XRefParseException?a.requestLoadedStream().then(function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)}):onFailure(e)})}ensureNotTerminated();(async function getPdfManager({data:e,password:t,disableAutoFetch:a,rangeChunkSize:n,docBaseUrl:r,enableXfa:i,evaluatorOptions:l}){const f={source:null,disableAutoFetch:a,docBaseUrl:r,docId:o,enableXfa:i,evaluatorOptions:l,handler:h,length:0,password:t,rangeChunkSize:n};if(e){f.source=e;return new LocalPdfManager(f)}const c=new PDFWorkerStream({msgHandler:h}),u=c.getFullReader(),{promise:m,resolve:p,reject:d}=Promise.withResolvers();let g,b=[];s=e=>c.cancelAllRequests(e);u.headersReady.then(()=>{if(u.isRangeSupported){f.source=c;f.length=u.contentLength;f.disableAutoFetch||=u.isStreamingSupported;g=new NetworkPdfManager(f);for(const e of b)g.sendProgressiveData(e);b=null;p(g);s=null}}).catch(e=>{d(e);s=null});(async function readData(){let e=0;for(;;){const{value:t,done:a}=await u.read();ensureNotTerminated();if(a)break;e+=t.byteLength;u.isStreamingSupported||h.send("DocProgress",{loaded:e,total:u.contentLength});g?g.sendProgressiveData(t):b.push(t)}if(!g){f.source=arrayBuffersToBytes(b);b=null;g=new LocalPdfManager(f);p(g)}s=null})().catch(e=>{d(e);s=null});return m})(e).then(function(e){if(n){e.terminate(new AbortException("Worker was terminated."));throw new Error("Worker was terminated")}a=e;a.requestLoadedStream(!0).then(e=>{h.send("DataLoaded",{length:e.bytes.byteLength})})}).then(pdfManagerReady,onFailure)}h.on("GetPage",function(e){return a.getPage(e.pageIndex).then(function(e){return Promise.all([a.ensure(e,"rotate"),a.ensure(e,"ref"),a.ensure(e,"userUnit"),a.ensure(e,"view")]).then(function([e,t,a,n]){return{rotate:e,ref:t,refStr:t?.toString()??null,userUnit:a,view:n}})})});h.on("GetPageIndex",function(e){const t=Ref.get(e.num,e.gen);return a.ensureCatalog("getPageIndex",[t])});h.on("GetDestinations",function(e){return a.ensureCatalog("destinations")});h.on("GetDestination",function(e){return a.ensureCatalog("getDestination",[e.id])});h.on("GetPageLabels",function(e){return a.ensureCatalog("pageLabels")});h.on("GetPageLayout",function(e){return a.ensureCatalog("pageLayout")});h.on("GetPageMode",function(e){return a.ensureCatalog("pageMode")});h.on("GetViewerPreferences",function(e){return a.ensureCatalog("viewerPreferences")});h.on("GetOpenAction",function(e){return a.ensureCatalog("openAction")});h.on("GetAttachments",function(e){return a.ensureCatalog("attachments")});h.on("GetDocJSActions",function(e){return a.ensureCatalog("jsActions")});h.on("GetPageJSActions",function({pageIndex:e}){return a.getPage(e).then(e=>a.ensure(e,"jsActions"))});h.on("GetAnnotationsByType",async function({types:e,pageIndexesToSkip:t}){const[n,s]=await Promise.all([a.ensureDoc("numPages"),a.ensureDoc("annotationGlobals")]);if(!s)return null;const r=[],i=[];let o=null;try{for(let l=0,f=n;lt&&t.collectAnnotationsByType(h,o,e,i,s)||[]))}await Promise.all(r);return(await Promise.all(i)).filter(e=>!!e)}finally{o&&finishWorkerTask(o)}});h.on("GetOutline",function(e){return a.ensureCatalog("documentOutline")});h.on("GetOptionalContentConfig",function(e){return a.ensureCatalog("optionalContentConfig")});h.on("GetPermissions",function(e){return a.ensureCatalog("permissions")});h.on("GetMetadata",function(e){return Promise.all([a.ensureDoc("documentInfo"),a.ensureCatalog("metadata"),a.ensureCatalog("hasStructTree")])});h.on("GetMarkInfo",function(e){return a.ensureCatalog("markInfo")});h.on("GetData",function(e){return a.requestLoadedStream().then(e=>e.bytes)});h.on("GetAnnotations",function({pageIndex:e,intent:t}){return a.getPage(e).then(function(a){const n=new WorkerTask(`GetAnnotations: page ${e}`);startWorkerTask(n);return a.getAnnotationsData(h,n,t).then(e=>{finishWorkerTask(n);return e},e=>{finishWorkerTask(n);throw e})})});h.on("GetFieldObjects",function(e){return a.ensureDoc("fieldObjects").then(e=>e?.allFields||null)});h.on("HasJSActions",function(e){return a.ensureDoc("hasJSActions")});h.on("GetCalculationOrderIds",function(e){return a.ensureDoc("calculationOrderIds")});h.on("ExtractPages",async function({pageInfos:e,annotationStorage:t}){if(!e){warn("extractPages: nothing to extract.");return null}Array.isArray(e)||(e=[e]);let n,s=0;for(const t of e)if(null===t.document)t.document=a.pdfDocument;else if(ArrayBuffer.isView(t.document)){const e=new LocalPdfManager({source:t.document,docId:`${o}_extractPages_${s++}`,handler:h,password:t.password??null,evaluatorOptions:Object.assign({},a.evaluatorOptions)});let n=!1,r=!0;for(;;)try{await e.requestLoadedStream();await e.ensureDoc("checkHeader");await e.ensureDoc("parseStartXRef");await e.ensureDoc("parse",[n]);break}catch(t){if(t instanceof XRefParseException){if(!1===n){n=!0;continue}r=!1;warn("extractPages: XRefParseException.")}else if(t instanceof PasswordException){const a=new WorkerTask(`PasswordException: response ${t.code}`);startWorkerTask(a);try{const{password:a}=await h.sendWithPromise("PasswordRequest",t);e.updatePassword(a)}catch{r=!1;warn("extractPages: invalid password.")}finally{finishWorkerTask(a)}}else{r=!1;warn("extractPages: invalid document.")}if(!r)break}r||(t.document=null);if(await e.ensureDoc("isPureXfa")){t.document=null;warn("extractPages does not support pure XFA documents.")}else t.document=e.pdfDocument}else warn("extractPages: invalid document.");try{const a=new PDFEditor;n=new WorkerTask(`ExtractPages: ${e.length} page(s)`);startWorkerTask(n);return await a.extractPages(e,t,h,n)}catch(e){warn(`extractPages: "${e}".`);return null}finally{n&&finishWorkerTask(n)}});h.on("SaveDocument",async function({isPureXfa:e,numPages:t,annotationStorage:n,filename:s}){const r=[a.requestLoadedStream(),a.ensureCatalog("acroForm"),a.ensureCatalog("acroFormRef"),a.ensureDoc("startXRef"),a.ensureDoc("xref"),a.ensureCatalog("structTreeRoot")],i=new RefSetCache,o=[],l=e?null:getNewAnnotationsMap(n),[f,c,u,m,p,d]=await Promise.all(r),g=p.trailer.getRaw("Root")||null;let b;if(l){d?await d.canUpdateStructTree({pdfManager:a,newAnnotationsByPage:l})&&(b=d):await StructTreeRoot.canCreateStructureTree({catalogRef:g,pdfManager:a,newAnnotationsByPage:l})&&(b=null);const e=AnnotationFactory.generateImages(n.values(),p,a.evaluatorOptions.isOffscreenCanvasSupported),t=void 0===b?o:[];for(const[n,s]of l)t.push(a.getPage(n).then(t=>{const a=new WorkerTask(`Save (editor): page ${n}`);startWorkerTask(a);return t.saveNewAnnotations(h,a,s,e,i).finally(function(){finishWorkerTask(a)})}));null===b?o.push(Promise.all(t).then(async()=>{await StructTreeRoot.createStructureTree({newAnnotationsByPage:l,xref:p,catalogRef:g,pdfManager:a,changes:i})})):b&&o.push(Promise.all(t).then(async()=>{await b.updateStructureTree({newAnnotationsByPage:l,pdfManager:a,changes:i})}))}if(e)o.push(a.ensureDoc("serializeXfaData",[n]));else for(let e=0;ee.needAppearances),y=c instanceof Dict&&c.get("XFA")||null;let q=null,v=!1;if(Array.isArray(y)){for(let e=0,t=y.length;e{p.resetNewTemporaryRef()})});h.on("GetOperatorList",function(e,t){const{pageId:n,pageIndex:s}=e;a.getPage(n).then(function(a){const n=new WorkerTask(`GetOperatorList: page ${s}`);startWorkerTask(n);const r=i>=ce?Date.now():0;a.getOperatorList({handler:h,sink:t,task:n,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage,modifiedIds:e.modifiedIds,pageIndex:s}).then(function(e){finishWorkerTask(n);r&&info(`page=${s+1} - getOperatorList: time=${Date.now()-r}ms, len=${e.length}`);t.close()},function(e){finishWorkerTask(n);n.terminated||t.error(e)})})});h.on("GetTextContent",function(e,t){const{pageId:n,pageIndex:s,includeMarkedContent:r,disableNormalization:o}=e;a.getPage(n).then(function(e){const a=new WorkerTask("GetTextContent: page "+s);startWorkerTask(a);const n=i>=ce?Date.now():0;e.extractTextContent({handler:h,task:a,sink:t,includeMarkedContent:r,disableNormalization:o}).then(function(){finishWorkerTask(a);n&&info(`page=${s+1} - getTextContent: time=`+(Date.now()-n)+"ms");t.close()},function(e){finishWorkerTask(a);a.terminated||t.error(e)})})});h.on("GetStructTree",function(e){return a.getPage(e.pageIndex).then(e=>a.ensure(e,"getStructTree"))});h.on("FontFallback",function(e){return a.fontFallback(e.id,h)});h.on("Cleanup",function(e){return a.cleanup(!0)});h.on("Terminate",async function(e){n=!0;const t=[];if(a){a.terminate(new AbortException("Worker was terminated."));const e=a.cleanup();t.push(e);a=null}else clearGlobalCaches();s?.(new AbortException("Worker was terminated."));for(const e of r){t.push(e.finished);e.terminate()}await Promise.all(t);h.destroy();h=null});h.on("Ready",function(t){setupDoc(e);e=null});return c}static initializeFromPort(e){const t=new MessageHandler("worker","main",e);this.setup(t,e);t.send("ready",null)}}globalThis.pdfjsWorker={WorkerMessageHandler};export{WorkerMessageHandler}; \ No newline at end of file diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb new file mode 100644 index 0000000000000000000000000000000000000000..30d52963e281dcd7e6dd70555340fc987d3568ef GIT binary patch literal 29513 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 SRF{Q1ot#xwM>}rnR8s9Z4xSAlsQ`=hF+NOYn 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitFixed.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitFixed.pfb new file mode 100644 index 0000000000000000000000000000000000000000..f12dcbce52babb40fb61765aa46ddf47e3846511 GIT binary patch literal 17597 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..d2880017c25716417f837a1c26044a0342fa3f9a GIT binary patch literal 19151 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..d71697d4b638737a5545dd0cb28cba8f613e4eec GIT binary patch literal 18746 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 G#ti^_ED$;X literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitSerif.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitSerif.pfb new file mode 100644 index 0000000000000000000000000000000000000000..3fa682efbb4b1d1941194a5dd8b78f39b33b72b0 GIT binary patch literal 19469 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 A1^@s6 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..460231fb88a0083e577ed534760307d7779fd82f GIT binary patch literal 20733 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb b/web/public/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb new file mode 100644 index 0000000000000000000000000000000000000000..d03a7c781e1a2b91481103dc3227a6bdca4a461c GIT binary patch literal 21227 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/LICENSE_FOXIT b/web/public/vendor/pdfjs/standard_fonts/LICENSE_FOXIT new file mode 100644 index 00000000..8b4ed6dd --- /dev/null +++ b/web/public/vendor/pdfjs/standard_fonts/LICENSE_FOXIT @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/web/public/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION b/web/public/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION new file mode 100644 index 00000000..aba73e8a --- /dev/null +++ b/web/public/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION @@ -0,0 +1,102 @@ +Digitized data copyright (c) 2010 Google Corporation + with Reserved Font Arimo, Tinos and Cousine. +Copyright (c) 2012 Red Hat, Inc. + with Reserved Font Name Liberation. + +This Font Software is licensed under the SIL Open Font License, +Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + +PREAMBLE The goals of the Open Font License (OFL) are to stimulate +worldwide development of collaborative font projects, to support the font +creation efforts of academic and linguistic communities, and to provide +a free and open framework in which fonts may be shared and improved in +partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. +The fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply to +any document created using the fonts or their derivatives. + + + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. +This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components +as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting ? in part or in whole ? +any of the components of the Original Version, by changing formats or +by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer +or other person who contributed to the Font Software. + + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a +copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components,in + Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the + corresponding Copyright Holder. This restriction only applies to the + primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + +5) The Font Software, modified or unmodified, in part or in whole, must + be distributed entirely under this license, and must not be distributed + under any other license. The requirement for fonts to remain under + this license does not apply to any document created using the Font + Software. + + + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + + + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +DEALINGS IN THE FONT SOFTWARE. + diff --git a/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf b/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee2371540417ffbc652745b059effa260430179f GIT binary patch literal 137052 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%0AvQpH0BnuDPmj1j)*-GV=WM4 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

    GM0e+n^wzYS<9#m@~>g|1jF6SC80*E04Z zLPHZ2x}ex+XLQZg3GpvCi&Njmw?lRt3p*2A?zWH}<=f&U86`mHlze$>Z~ykoTR~$8 zgdTqh?wrL!=Fg#BG;qfZLLfSLAaziA)E*pkZXP5L!bGS+C;_n`7C}f9>p+qatpD~3 z_)Jahw^w4{f{H|aeSHfHL1XY`+p!=)&`2F(5K>W@(O4C>ZymhJ(~e0PHem$XtZHP( z1lt1%E5b;YuRF@DbNtVIs|-I~J-FWC9HiNa1OEIu3E2T43RW+nDHLEL7@!u@hC{r;pvnUtmC^KccVI?CogZ*1b8T{5* z(AdyGno*HC)Pd1x9&;5F``@4c|1*R#S21s3Z4^*rk^=W(q!?c^Ffj1#WME``xrGIE z3^?dqbw-95hF&Hg<~0l)4Au_H%&%D(UUR%*d+i|4#K;70NiZ2OEns41Vt&iS$naKy z?LC8}z0_M{s188h7(^Hu*% z`ZryffsrAWp_j=QW)IVAwl@r{uUR-=J8WQJ1U38}7!nu?7+4uN-m1Rv z{LR3^q|3m-Ah3~{X$O<;7A|fk@Z=Tf0wu=(b*$@{b=X1}m>KxCFfuUiWMa^N%c!q! zXuzmws>rPKCy03+>$+v&`1se(z`%4K93L7EoJ`CD0?dre42+s`WL6O0HCxiU|3l89YX$%h(mBqOpfER7? zaPoR^3yKS}J(1;RV9+4 r+V=4lWFllllucAn8N@O*mSYwLPuz=%3Ni_E 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 z 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 T+6w9d@0a@D0HV)N@-qYgO8KTV literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf b/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0cf61263494608cbf1fccecce606bc01a247d1e4 GIT binary patch literal 162036 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�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�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 poVE@>K0nEi5dbNMz19E# literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf b/web/public/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..366d1489cdde3523e488ed1ee85583618fb0c120 GIT binary patch literal 139512 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�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

    SwjPuU4{lQ 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 + * can always match the size of the text in the canvas. */ + --min-font-size: 1; + --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv: calc(1 / var(--min-font-size)); + + > :not(.markedContent), + .markedContent span:not(.markedContent) { + z-index: 1; + + --font-height: 0; /* set by text_layer.js */ + font-size: calc(var(--text-scale-factor) * var(--font-height)); + + --scale-x: 1; + --rotate: 0deg; + transform: rotate(var(--rotate)) scaleX(var(--scale-x)) + scale(var(--min-font-size-inv)); + } + + .markedContent { + display: contents; + } + + span[role="img"] { + user-select: none; + cursor: default; + } + + .highlight { + --highlight-bg-color: rgb(180 0 170 / 0.25); + --highlight-selected-bg-color: rgb(0 100 0 / 0.25); + --highlight-backdrop-filter: none; + --highlight-selected-backdrop-filter: none; + + @media screen and (forced-colors: active) { + --highlight-bg-color: transparent; + --highlight-selected-bg-color: transparent; + --highlight-backdrop-filter: var(--hcm-highlight-filter); + --highlight-selected-backdrop-filter: var( + --hcm-highlight-selected-filter + ); + } + + margin: -1px; + padding: 1px; + background-color: var(--highlight-bg-color); + backdrop-filter: var(--highlight-backdrop-filter); + border-radius: 4px; + + &.appended { + position: initial; + } + + &.begin { + border-radius: 4px 0 0 4px; + } + + &.end { + border-radius: 0 4px 4px 0; + } + + &.middle { + border-radius: 0; + } + + &.selected { + background-color: var(--highlight-selected-bg-color); + backdrop-filter: var(--highlight-selected-backdrop-filter); + } + } + + ::selection { + /* stylelint-disable declaration-block-no-duplicate-properties */ + /*#if !MOZCENTRAL*/ + background: rgba(0 0 255 / 0.25); + /*#endif*/ + /* stylelint-enable declaration-block-no-duplicate-properties */ + background: color-mix(in srgb, AccentColor, transparent 75%); + } + + /* Avoids https://github.com/mozilla/pdf.js/issues/13840 in Chrome */ + /*#if !MOZCENTRAL*/ + br::selection { + background: transparent; + } + /*#endif*/ + + .endOfContent { + display: block; + position: absolute; + inset: 100% 0 0; + z-index: 0; + cursor: default; + user-select: none; + } + + &.selecting .endOfContent { + top: 0; + } +} diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_JBIG2 b/web/public/vendor/pdfjs/wasm/LICENSE_JBIG2 new file mode 100644 index 00000000..37a329c6 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_JBIG2 @@ -0,0 +1,196 @@ +// Copyright 2014 The PDFium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + https://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_OPENJPEG b/web/public/vendor/pdfjs/wasm/LICENSE_OPENJPEG new file mode 100644 index 00000000..e8fa4104 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_OPENJPEG @@ -0,0 +1,39 @@ +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_JBIG2 b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_JBIG2 new file mode 100644 index 00000000..f1845baf --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_JBIG2 @@ -0,0 +1,13 @@ +Copyright 2026 Mozilla Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG new file mode 100644 index 00000000..623929b8 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG @@ -0,0 +1,22 @@ +Copyright (c) 2024, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_QCMS b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_QCMS new file mode 100644 index 00000000..7e1aeb34 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_PDFJS_QCMS @@ -0,0 +1,22 @@ +Copyright (c) 2025, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/web/public/vendor/pdfjs/wasm/LICENSE_QCMS b/web/public/vendor/pdfjs/wasm/LICENSE_QCMS new file mode 100644 index 00000000..eec8246d --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/LICENSE_QCMS @@ -0,0 +1,21 @@ +qcms +Copyright (C) 2009-2024 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/web/public/vendor/pdfjs/wasm/jbig2.wasm b/web/public/vendor/pdfjs/wasm/jbig2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..254e1e48c86f51e103ee5a7f1fe0ee09e17af80c GIT binary patch literal 104852 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 z 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 C$yZwd literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/wasm/jbig2_nowasm_fallback.js b/web/public/vendor/pdfjs/wasm/jbig2_nowasm_fallback.js new file mode 100644 index 00000000..c86528f0 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/jbig2_nowasm_fallback.js @@ -0,0 +1,15 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ha){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;s=s>>>0;if(q+s>a.length)throw"trap: invalid memory.fill";a.fill(u,q,q+s)}function ga(n){var v=new ArrayBuffer(16777216);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var C=new Float32Array(v);var D=new Float64Array(v);var E=Math.imul;var F=Math.fround;var G=Math.abs;var H=Math.clz32;var I=Math.min;var J=Math.max;var K=Math.floor;var L=Math.ceil;var M=Math.trunc;var N=Math.sqrt;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=O.e;var U=O.f;var V=O.g;var W=O.h;var X=O.i;var Y=72736;var Z=0; +// EMSCRIPTEN_START_FUNCS +function yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;J=Y-16|0;Y=J;a:{b:{c:{d:{c=y[a+4>>2];b=y[c+8>>2];i=y[c+4>>2];e:{if(b>>>0>i>>>0){break e}if((b|0)==(i|0)){aa=2;break c}R=a+80|0;while(1){if(b>>>0>i>>>0){break e}if(i-b>>>0<11){break c}f:{g:{h:{m=y[R>>2];i:{if(!m){b=na(72);w[b+4|0]=0;y[b>>2]=0;t(b+8|0,0,64);y[J+4>>2]=0;ib(R,b);ac(J+4|0);j:{c=y[a+80>>2];k:{if(ra(y[a+4>>2],c)){break k}if(va(y[a+4>>2],c+4|0)){break k}b=y[a+4>>2];d=y[b+8>>2];g=y[b>>2];l:{m:{if(B[b+4>>2]<=d>>>0){w[J+15|0]=0;break m}d=z[d+g|0];w[J+15|0]=d;if(d>>>0<224){break m}if(ra(b,c+8|0)){break k}b=y[c+8>>2]&536870911;y[c+8>>2]=b;if(b>>>0>64){break k}g=y[a+4>>2];i=y[g+8>>2];d=i+(b+8>>>3|0)|0;if(d>>>0>>0){break l}h=g;g=y[g+4>>2];y[h+8>>2]=d>>>0>>0?d:g;break l}if(va(b,J+15|0)){break k}b=z[J+15|0]>>>5|0;y[c+8>>2]=b}g=z[c+4|0];n:{if(!b){break n}d=y[c>>2];xc(c+12|0,b);b=0;d=(d>>>0>65536?4:d>>>0>256?2:1)-1|0;while(1){if(y[c+8>>2]<=(b|0)){break n}o:{p:{switch(d-1|0){default:if(va(y[a+4>>2],J+15|0)){break k}m=z[J+15|0];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 0:if(Wa(y[a+4>>2],J+12|0)){break k}m=A[J+12>>1];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 1:break e;case 2:break p}}if(ra(y[a+4>>2],J+8|0)){break k}m=y[J+8>>2];y[y[c+12>>2]+(b<<2)>>2]=m}b=b+1|0;if(B[c>>2]>m>>>0){continue}break}break k}b=y[a+4>>2];q:{if(!(g&64)){if(va(b,J+15|0)){break k}y[c+24>>2]=z[J+15|0];break q}if(ra(b,c+24|0)){break k}}if(!ra(y[a+4>>2],c+28|0)){break j}}ib(R,0);break i}b=y[a+4>>2];d=y[b+20>>2];y[c+40>>2]=y[b+16>>2];y[c+44>>2]=d;b=y[b+8>>2];y[c+48>>2]=1;y[c+36>>2]=b;y[a+84>>2]=b;m=y[a+80>>2]}r:{while(1){h=0;c=0;f=Y-368|0;Y=f;b=2;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{d=z[m+4|0]&63;switch(d-16|0){case 0:break T;case 1:case 2:case 3:case 5:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 25:case 28:case 29:case 30:case 31:break B;case 4:case 6:case 7:break S;case 20:case 22:case 23:break R;case 24:case 26:case 27:break Q;case 32:break P;case 33:break O;case 34:break N;case 35:break u;case 36:break M;case 37:break L;default:break U}}V:{switch(d|0){case 0:b=0;s=0;F=0;N=0;e=Y-272|0;Y=e;l=1;if(!Wa(y[a+4>>2],e+118|0)){j=na(56);y[j+40>>2]=0;y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;h=A[e+118>>1];c=h&1;w[j|0]=c;d=h>>>10&3;w[j+3|0]=d;g=h&12288;w[j+2|0]=(g|0)!=0;i=(h&254)>>>1&1;w[j+1|0]=i;Q=j+16|0;W:{X:{Y:{if(!c){c=d?2:8;d=j+44|0;while(1){if((b|0)!=(c|0)){g=b+d|0;b=b+1|0;if(!va(y[a+4>>2],g)){continue}break W}break}if(z[j+1|0]!=1){break X}if(!z[j+2|0]){break Y}break X}if(g|!i){break X}}c=j+52|0;b=0;while(1){if((b|0)==4){break X}d=b+c|0;b=b+1|0;if(!va(y[a+4>>2],d)){continue}break}break W}if(ra(y[a+4>>2],j+12|0)){break W}if(ra(y[a+4>>2],j+8|0)|B[j+12>>2]>65535|B[j+8>>2]>65535){break W}b=y[m+8>>2];i=(b|0)>0?b:0;b=0;while(1){if((b|0)==(i|0)){c=1;k=0;b=0;while(1)if((b|0)==(i|0)){Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{if(!(c&1)){break fa}y[j+4>>2]=k;U=Ub(e+104|0,k);n=y[U>>2];ga:{if((n|0)==y[U+4>>2]){break ga}b=y[m+8>>2];q=(b|0)>0?b:0;c=1;k=0;while(1){if((q|0)==(F|0)){break ga}ha:{b=Ma(a,y[y[m+12>>2]+(F<<2)>>2]);if(z[b+4|0]&63){break ha}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;i=0;if(c&1){b=d+k|0;g=b>>>0>=d>>>0;i=g?b:0}k=i;c=g;break ha}i=b+k|0;if(!(i>>>0>=b>>>0&c)){break fa}y[n+(i<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}F=F+1|0;continue}}bb(Q,U);ia:{if(z[j|0]!=1){break ia}b=h>>>2&3;if((b|0)==2){break Z}d=h>>>4&3;if((d|0)==2){break Z}ja:{ka:{switch(b|0){case 0:c=sa(a,4);b=0;break ja;case 1:c=sa(a,5);b=0;break ja;default:break ka}}b=Ga(a,m,0);if(!b){break Z}c=y[b+68>>2];b=1}y[j+28>>2]=c;la:{ma:{switch(d|0){case 0:c=sa(a,2);break la;case 1:c=sa(a,3);break la;default:break ma}}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+32>>2]=c;na:{if(!(h&64)){c=sa(a,1);break na}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+36>>2]=c;if(z[j+1|0]!=1){break ia}oa:{if(!(h&128)){b=sa(a,1);break oa}b=Ga(a,m,b);if(!b){break Z}b=y[b+68>>2]}y[j+40>>2]=b}W=z[j+1|0];V=z[j|0];b=z[j+3|0];c=z[j+2|0];y[e+100>>2]=0;y[e+92>>2]=0;y[e+96>>2]=0;y[e+88>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;c=c?1024:8192;b=b?(b|0)==1?8192:1024:65536;pa:{if(!(!(h&256)|!s)){if(!(V&1)){d=Sb(e+92|0,y[s+56>>2]);if((b|0)!=y[e+96>>2]-y[d>>2]>>3){break _}}if(!(W&1)){break pa}b=Sb(e+80|0,y[s+56>>2]+12|0);if((c|0)==y[e+84>>2]-y[b>>2]>>3){break pa}break _}if(!(V&1)){kb(e+92|0,b)}if(!(W&1)){break pa}kb(e+80|0,c)}b=y[m+44>>2];d=b;c=y[m+40>>2];y[e+64>>2]=c;y[e+68>>2]=b;g=y[m+36>>2];y[e+72>>2]=g;y[m+52>>2]=2;qa:{if(!(b|c)|z[a+48|0]!=1){break qa}i=y[a+108>>2];b=i;while(1){b=y[b+4>>2];if((i|0)==(b|0)){break qa}if((c|0)!=y[b+8>>2]|(d|0)!=y[b+12>>2]|(g|0)!=y[b+16>>2]){continue}break}c=Ad(y[b+24>>2]);y[e+120>>2]=0;Rb(m+56|0,c);Za(e+120|0);zd(y[a+108>>2],e- -64|0,b+24|0);c=y[a+108>>2];d=y[b>>2];g=y[b+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[c+8>>2]=y[c+8>>2]-1;oc(b);break aa}if(!(V&1)){u=Ra(y[a+4>>2]);y[e+60>>2]=u;I=y[e+92>>2];d=y[e+96>>2];C=y[e+80>>2];g=y[e+84>>2];ba=Fa();y[e+268>>2]=ba;ca=Fa();y[e+252>>2]=ca;da=Fa();y[e+248>>2]=da;ea=Fa();y[e+244>>2]=ea;i=y[j+8>>2]+y[j+4>>2]|0;b=0;while(1){c=b;b=b+1|0;if(i>>>0>1<>>0){continue}break}_=I+3240|0;S=g-C>>3;P=Cd(e+120|0,c&255);O=gb(e+256|0,y[j+8>>2]);G=d-I>>3;X=G>>>0>405;i=0;F=0;while(1){ra:{sa:{ta:{b=y[j+8>>2];if(b>>>0>i>>>0){y[e+240>>2]=0;Aa(ba,u,e+236|0);F=y[e+236>>2]+F|0;if(F>>>0>65535){break ta}K=0;while(1){ua:{l=Aa(ca,u,e+232|0);if(!l|B[j+8>>2]<=i>>>0){break ua}l=1;K=y[e+232>>2]+K|0;if(K>>>0>65535){break ua}if(!(!F|!K)){va:{wa:{xa:{ya:{za:{if(!z[j+1|0]){r=qb();y[e+228>>2]=r;y[r+8>>2]=F;y[r+4>>2]=K;w[r|0]=0;b=z[j+3|0];w[r+1|0]=0;w[r+2|0]=0;w[r+3|0]=b;w[r+16|0]=z[j+44|0];w[r+17|0]=z[j+45|0];w[r+18|0]=z[j+46|0];w[r+19|0]=z[j+47|0];w[r+20|0]=z[j+48|0];w[r+21|0]=z[j+49|0];w[r+22|0]=z[j+50|0];w[r+23|0]=z[j+51|0];Aa:{switch(b|0){case 0:if(xd(r)){D=nc(r,u,I,G,0);break wa}D=mc(r,u,I,G,0);break wa;case 1:if(wd(r)){D=nc(r,u,I,G,1);break wa}D=mc(r,u,I,G,1);break wa;case 2:if(Qb(r)){D=nc(r,u,I,G,2);break wa}D=mc(r,u,I,G,2);break wa;default:break Aa}}if(!Qb(r)){break za}D=xa(K,F);y[e+160>>2]=D;if(!qa(D)){break ya}b=y[r+4>>2];if(!b){break fa}b=b-1|0;L=b>>>3|0;T=(b&7)+1|0;g=0;k=0;n=0;c=0;while(1){Ba:{Ca:{if(B[r+8>>2]>n>>>0){ja(e+192|0,D,n);h=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){b=c;break Ca}if(z[u|0]){break ya}if(!X){break fa}b=0;d=ka(u,_);if((d|0)==(c|0)){break Ca}y[e+184>>2]=h;y[e+180>>2]=q;y[e+172>>2]=k;y[e+168>>2]=g;b=y[e+184>>2];y[e+8>>2]=y[e+180>>2];y[e+12>>2]=b;b=y[e+172>>2];y[e>>2]=y[e+168>>2];y[e+4>>2]=b;Pa(e+8|0,e);c=c^d;break Ba}y[e+160>>2]=0;break xa}c=0;H=0;Da:{if(!n){Ea:{while(1){k=7;v=0;if((H|0)==(L|0)){break Ea}Fa:{while(1){if((k|0)>=0){if(z[u|0]){break Fa}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<>>0>>0){break ya}}k=0;v=0;while(1){if((k|0)==(T|0)){break Da}if(z[u|0]){break ya}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<<7-k|v;k=k+1|0;continue}}if(!k){break fa}$=k-1|0;H=z[g|0];k=H>>>1&112;d=0;while(1){Ga:{if((d|0)!=(L|0)){if((d|0)==($|0)){break fa}s=d+1|0;H=z[s+g|0]|H<<8;c=7;v=0;while(1){if((c|0)<0){break Ga}if(z[u|0]){break ya}if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=M|(H>>>c+1&16|k<<1&1006);v=M<>>0>=G>>>0){break fa}g=ka(u,(k<<3)+I|0);k=g|(d>>>8-c&16|k<<1&1006);v=g<<7-c|v;c=c+1|0;continue}break}break Da}if((d|0)==(h|0)){break fa}w[d+q|0]=v;d=s;continue}}if(h>>>0<=L>>>0){break fa}w[q+L|0]=v;c=b}n=n+1|0;g=q;k=h;continue}}Aa(da,u,e+180|0);d=y[e+180>>2];if(d>>>0>=2){g=wa(6);y[e+168>>2]=g;h=wa(8);y[e+160>>2]=h;k=wa(11);y[e+228>>2]=k;l=wa(15);y[e+224>>2]=l;n=wa(15);y[e+220>>2]=n;q=wa(15);y[e+216>>2]=q;s=wa(15);y[e+212>>2]=s;r=wa(1);y[e+208>>2]=r;c=Yb();y[e+204>>2]=c;b=z[j|0];y[c+20>>2]=1;y[c+16>>2]=d;y[c+12>>2]=F;y[c+8>>2]=K;w[c+1|0]=1;w[c|0]=b;b=y[j+4>>2]+i|0;y[c+24>>2]=b;d=Ub(e+192|0,b);b=y[j+4>>2];v=y[j+16>>2];if(b>>>0>y[j+20>>2]-v>>2>>>0){break fa}M=b;b=y[d>>2];vd(v,M,b,y[e+196>>2]-b>>2);v=b+(y[j+4>>2]<<2)|0;D=y[O>>2];b=0;while(1)if((b|0)==(i|0)){bb(c+40|0,d);x[c+4>>1]=0;y[c+52>>2]=0;y[c+56>>2]=1;w[c+3|0]=0;y[c+88>>2]=r;y[c+84>>2]=s;y[c+80>>2]=q;y[c+76>>2]=n;y[c+72>>2]=l;y[c+68>>2]=k;y[c+64>>2]=h;y[c+60>>2]=g;w[c+2|0]=z[j+2|0];w[c+92|0]=z[j+52|0];w[c+93|0]=z[j+53|0];w[c+94|0]=z[j+54|0];w[c+95|0]=z[j+55|0];b=Bd(c,u,C,S,P);y[e+176>>2]=0;oa(e+240|0,b);la(e+176|0);b=y[e+240>>2];ya(d);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+160|0);pa(e+168|0);if(!b){break ta}break va}else{H=b<<2;y[H+v>>2]=y[D+H>>2];b=b+1|0;continue}}b=0;if((d|0)!=1){break va}c=y[j+4>>2];Ac(y[P+36>>2],u,e+192|0);b=y[e+192>>2];if(b>>>0>=c+i>>>0){break ta}c=y[j+4>>2];if(c>>>0>b>>>0){b=y[Q>>2]+(b<<2)|0}else{b=b-c|0;c=y[O>>2];if(b>>>0>=y[O+4>>2]-c>>2>>>0){break fa}b=c+(b<<2)|0}c=y[b>>2];if(!c){break ta}Aa(y[P+28>>2],u,e+168|0);Aa(y[P+32>>2],u,e+160|0);b=db();y[e+228>>2]=b;y[b+8>>2]=F;y[b+4>>2]=K;d=z[j+2|0];y[b+20>>2]=c;w[b|0]=d;y[b+12>>2]=y[e+168>>2];c=y[e+160>>2];w[b+1|0]=0;y[b+16>>2]=c;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];b=cb(b,u,C,S);y[e+224>>2]=0;oa(e+240|0,b);la(e+224|0);b=y[e+240>>2];Ua(e+228|0);if(!b){break ta}break va}D=xa(K,F);y[e+160>>2]=D;Ha:{Ia:{if(!qa(D)){break Ia}n=0;Qa(D,0);h=0;c=0;b=0;while(1){Ja:{Ka:{if(B[r+8>>2]>b>>>0){ja(e+192|0,D,b);g=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){d=c;break Ka}if(z[u|0]){break Ia}if(!X){break fa}d=0;k=ka(u,_);if((k|0)==(c|0)){break Ka}y[e+184>>2]=g;y[e+180>>2]=q;y[e+172>>2]=h;y[e+168>>2]=n;d=y[e+184>>2];y[e+24>>2]=y[e+180>>2];y[e+28>>2]=d;d=y[e+172>>2];y[e+16>>2]=y[e+168>>2];y[e+20>>2]=d;c=c^k;D=y[e+160>>2];Pa(e+24|0,e+16|0);break Ja}y[e+160>>2]=0;break Ha}H=0;L=0;if(z[r+2|0]==1){ja(e+192|0,y[r+12>>2],b);L=y[e+192>>2];H=y[e+196>>2]}D=y[e+160>>2];ja(e+192|0,D,w[r+17|0]+b|0);T=y[e+196>>2];$=y[e+192>>2];s=z[n|0]>>>6|0;k=y[D+8>>2];c=!h|(k|0)<2?0:s&1;v=!h|(k|0)<=0?c:s&2|c;s=0;c=0;while(1){if(B[r+4>>2]<=c>>>0){c=d;break Ja}La:{Ma:{if(z[r+2|0]==1){if(ia(y[y[r+12>>2]+8>>2],c,L,H)){break Ma}}k=ia(k,w[r+16|0]+c|0,$,T);if(z[u|0]){break Ia}k=v<<5|k<<4|s;if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=y[D+8>>2];if(!M){break Ma}La(k,c,q,g,1);k=y[D+8>>2];M=1;break La}M=0}v=ia(k,c+2|0,n,h)|v<<1&30;c=c+1|0;s=s<<1&14|M;continue}}b=b+1|0;n=q;h=g;continue}}D=0}la(e+160|0);break wa}D=0}la(e+160|0)}y[e+192>>2]=0;oa(e+240|0,D);la(e+192|0);b=y[e+240>>2];ua(e+228|0);if(!b){break ua}}c=y[O>>2];y[e+240>>2]=0;oa((i<<2)+c|0,b)}i=i+1|0;continue}break}b=l^1;break sa}y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,b+y[j+4>>2]|0);g=y[e+192>>2];i=0;b=0;k=0;Na:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){Aa(ea,u,e+160|0);d=y[e+160>>2];c=d+b|0;if(!(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0&c>>>0>=d>>>0)){break Na}Pb(e+180|0,g,0,b);sd(e+168|0,y[e+180>>2],y[e+184>>2],d,i);k=(i&1?d:0)+k|0;i=(i^-1)&1;b=c;continue}break}if(B[j+12>>2]>>0){break Na}N=lc();d=y[O>>2];b=0;l=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=b>>>0){break Na}if(!(!(y[g+(b>>>3&536870908)>>2]>>>b&1)|B[j+12>>2]<=l>>>0)){Oa:{if(b>>>0>>0){c=y[y[Q>>2]+(b<<2)>>2];if(!c){i=0;break Oa}i=kc(c);break Oa}c=d+(b-c<<2)|0;i=y[c>>2];y[c>>2]=0}rd(N,i);l=l+1|0}b=b+1|0;continue}}Ob(e+192|0);break ra}b=0}la(e+240|0);if(b){continue}}break}$a(O);qc(P);Ea(e+244|0);Ea(e+248|0);Ea(e+252|0);Ea(e+268|0);y[e+120>>2]=0;Rb(m+56|0,N);Za(e+120|0);if(y[m+56>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(e+60|0);break ba}ua(e+60|0);break $}g=y[e+80>>2];b=y[e+84>>2];n=y[a+4>>2];q=qd(n);y[e+268>>2]=q;C=gb(e+120|0,y[j+8>>2]);y[e+264>>2]=0;y[e+256>>2]=0;y[e+260>>2]=0;if(!z[j+1|0]){xc(e+256|0,y[j+8>>2])}u=b-g>>3;y[e+252>>2]=0;s=0;d=0;Pa:while(1){if(B[j+8>>2]<=d>>>0){break da}if(za(q,y[j+28>>2],e+160|0)){break ea}s=y[e+160>>2]+s|0;if(s>>>0>65535){break ea}F=0;c=0;i=d;while(1){b=za(q,y[j+32>>2],e+248|0);y[e+244>>2]=b;Qa:{Ra:{Sa:{Ta:{Ua:{switch(b|0){case 0:if(B[j+8>>2]<=i>>>0){break ea}c=y[e+248>>2]+c|0;if(c>>>0>65535){break ea}if(!c|!s){break Qa}if(z[j+1|0]!=1){break Ra}if(za(q,y[j+40>>2],e+240|0)){break ea}oa(e+252|0,0);h=y[e+240>>2];if(h>>>0<2){break Ta}v=wa(6);y[e+236>>2]=v;D=wa(8);y[e+232>>2]=D;H=wa(11);y[e+228>>2]=H;I=wa(15);y[e+224>>2]=I;G=wa(15);y[e+220>>2]=G;K=wa(15);y[e+216>>2]=K;O=wa(15);y[e+212>>2]=O;b=1;P=wa(1);y[e+208>>2]=P;l=Yb();y[e+204>>2]=l;k=z[j|0];y[l+20>>2]=1;y[l+16>>2]=h;y[l+12>>2]=s;y[l+8>>2]=c;w[l+1|0]=1;w[l|0]=k;h=y[j+4>>2]+i|0;y[l+24>>2]=h;r=Ed(e+192|0,h);k=y[j+8>>2]+y[j+4>>2]|0;while(1){h=b;b=b+1|0;if(k>>>0>1<>>0){continue}break};h=h&255;k=y[r>>2];L=y[l+24>>2];b=0;while(1)if((b|0)==(L|0)){bb(l+28|0,r);h=Ub(e+180|0,y[l+24>>2]);b=y[j+4>>2];k=y[j+16>>2];if(b>>>0>y[j+20>>2]-k>>2>>>0){break fa}M=b;b=y[h>>2];vd(k,M,b,y[e+184>>2]-b>>2);L=b+(y[j+4>>2]<<2)|0;k=y[C>>2];b=0;while(1)if((b|0)==(i|0)){bb(l+40|0,h);x[l+4>>1]=0;y[l+52>>2]=0;y[l+56>>2]=1;w[l+3|0]=0;y[l+88>>2]=P;y[l+84>>2]=O;y[l+80>>2]=K;y[l+76>>2]=G;y[l+72>>2]=I;y[l+68>>2]=H;y[l+64>>2]=D;y[l+60>>2]=v;w[l+2|0]=z[j+2|0];w[l+92|0]=z[j+52|0];w[l+93|0]=z[j+53|0];w[l+94|0]=z[j+54|0];w[l+95|0]=z[j+55|0];b=Dd(l,n,g,u);y[e+176>>2]=0;oa(e+252|0,b);la(e+176|0);b=y[e+252>>2];ya(h);ya(r);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+232|0);pa(e+236|0);if(b){break Sa}break ea}else{N=b<<2;y[N+L>>2]=y[k+N>>2];b=b+1|0;continue}}else{N=k+(b<<3)|0;y[N+4>>2]=b;y[N>>2]=h;b=b+1|0;continue};case 1:break Ua;default:break ea}}Va:{if(!z[j+1|0]){if(za(q,y[j+36>>2],e+192|0)){break ea}ta(n);y[e+180>>2]=0;Wa:{if(!y[e+192>>2]){if((F|0)>65535){break Va}b=F+7>>>3|0;c=se(b,0,s);if(Z){break Va}h=y[n+4>>2];k=y[n+8>>2];if(h>>>0>>0){break fa}if(c>>>0>h-k>>>0){break Va}c=0;h=xa(F,s);y[e+248>>2]=0;oa(e+180|0,h);la(e+248|0);v=y[e+180>>2];while(1){if((c|0)==(s|0)){break Wa}ja(e+168|0,v,c);l=y[n+8>>2];h=y[n+4>>2];if(l>>>0>h>>>0|b>>>0>h-l>>>0|b>>>0>B[e+172>>2]){break fa}if(b){if(b){p(y[e+168>>2],y[n>>2]+l|0,b)}l=y[n+8>>2]}h=b+l|0;if(h>>>0>=l>>>0){k=y[n+4>>2];y[n+8>>2]=h>>>0>>0?h:k}c=c+1|0;continue}}b=qb();y[e+248>>2]=b;y[b+8>>2]=s;y[b+4>>2]=F;w[b|0]=1;hb(b,e+180|0,n);ta(n);ua(e+248|0);v=y[e+180>>2]}Xa:{if(!v){break Xa}c=d>>>0>i>>>0?d:i;h=y[C>>2];b=0;k=y[e+256>>2];while(1){if((c|0)==(d|0)){break Xa}l=d<<2;r=l+k|0;F=sb(v,b,0,y[r>>2],s);y[e+248>>2]=0;oa(h+l|0,F);d=d+1|0;la(e+248|0);b=y[r>>2]+b|0;continue}}la(e+180|0)}d=i;continue Pa}la(e+180|0);break ea}if((h|0)!=1){k=y[C>>2];b=y[e+252>>2];break Sa}r=y[j+8>>2]+y[j+4>>2]|0;b=1;l=1;while(1){k=b;b=b+1|0;h=l;l=h+1|0;if(r>>>0>1<>>0){continue}break}y[e+192>>2]=h;h=k&255;l=0;b=0;while(1){if((b|0)!=(h|0)){if(wb(n,e+192|0)){break ea}b=b+1|0;l=y[e+192>>2]|l<<1;continue}break}b=y[j+4>>2];if(b+i>>>0<=l>>>0){break ea}k=y[C>>2];if(b>>>0>l>>>0){b=y[Q>>2]+(l<<2)|0}else{b=l-b|0;if(b>>>0>=y[C+4>>2]-k>>2>>>0){break fa}b=(b<<2)+k|0}h=y[b>>2];if(!h){break ea}b=wa(15);y[e+180>>2]=b;l=wa(1);y[e+236>>2]=l;Ya:{if(za(q,b,e+232|0)){break Ya}if(za(q,b,e+228|0)){break Ya}if(za(q,l,e+244|0)){break Ya}ta(n);r=y[n+8>>2];y[e+192>>2]=r;b=db();y[e+224>>2]=b;y[b+8>>2]=s;y[b+4>>2]=c;l=z[j+2|0];y[b+20>>2]=h;w[b|0]=l;y[b+12>>2]=y[e+232>>2];h=y[e+228>>2];l=0;w[b+1|0]=0;y[b+16>>2]=h;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];h=Ra(n);y[e+220>>2]=h;b=cb(b,h,g,u);y[e+216>>2]=0;oa(e+252|0,b);la(e+216|0);b=y[e+252>>2];if(b){ta(n);l=y[n+8>>2];if(l>>>0<=4294967293){h=l+2|0;l=y[n+4>>2];l=h>>>0>>0?h:l;y[n+8>>2]=l}l=y[e+244>>2]==(l-r|0)}ua(e+220|0);Ua(e+224|0);pa(e+236|0);pa(e+180|0);if(l){break Sa}break ea}pa(e+236|0);pa(e+180|0);break ea}y[e+252>>2]=0;oa((i<<2)+k|0,b);if(z[j+1|0]){break Qa}}y[y[e+256>>2]+(i<<2)>>2]=c}F=c+F|0;i=i+1|0;continue}}}o()}b=0;break ca}i=wa(1);y[e+248>>2]=i;y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,y[j+8>>2]+y[j+4>>2]|0);g=y[e+192>>2];l=0;b=0;k=0;Za:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){_a:{$a:{if(za(q,i,e+244|0)){break $a}d=y[e+244>>2];c=d+b|0;if(c>>>0>>0){break $a}if(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0){break _a}}b=0;break Za}Pb(e+180|0,g,0,b);sd(e+160|0,y[e+180>>2],y[e+184>>2],d,l);k=(l&1?d:0)+k|0;l=(l^-1)&1;b=c;continue}break}b=0;if(B[j+12>>2]>>0){break Za}b=lc();d=y[C>>2];l=0;i=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=l>>>0){break Za}if(!(!(y[g+(l>>>3&536870908)>>2]>>>l&1)|B[j+12>>2]<=i>>>0)){ab:{if(c>>>0>l>>>0){c=y[y[Q>>2]+(l<<2)>>2];if(!c){c=0;break ab}c=kc(c);break ab}h=d+(l-c<<2)|0;c=y[h>>2];y[h>>2]=0}rd(b,c);i=i+1|0}l=l+1|0;continue}}Ob(e+192|0);pa(e+248|0)}la(e+252|0);Ja(e+256|0);$a(C);Ua(e+268|0);y[e+120>>2]=0;Rb(m+56|0,b);Za(e+120|0);if(!y[m+56>>2]){break $}ta(y[a+4>>2])}if(z[a+48|0]!=1){break aa}fa=e,ga=Ad(y[m+56>>2]),y[fa+120>>2]=ga;b=y[a+108>>2];l=y[b+8>>2];while(1){if(l>>>0>=2){c=y[b>>2];d=y[c>>2];g=y[c+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[b+8>>2]=y[b+8>>2]-1;oc(c);l=l-1|0;b=y[a+108>>2];continue}break}c=b;b=e+120|0;zd(c,e- -64|0,b);Za(b)}l=0;if(!(z[e+119|0]&2)){break _}if(!(V&1)){b=y[m+56>>2];y[e+48>>2]=y[e+92>>2];c=y[e+96>>2];d=y[e+100>>2];y[e+96>>2]=0;y[e+100>>2]=0;y[e+52>>2]=c;y[e+56>>2]=d;y[e+92>>2]=0;c=b;b=e+48|0;pd(c,b);Ja(b)}if(!(W&1)){break _}b=y[m+56>>2];y[e+36>>2]=y[e+80>>2];c=y[e+84>>2];d=y[e+88>>2];y[e+84>>2]=0;y[e+88>>2]=0;y[e+40>>2]=c;y[e+44>>2]=d;y[e+80>>2]=0;c=b+12|0;b=e+36|0;pd(c,b);Ja(b);break _}l=1}Ja(e+80|0);Ja(e+92|0)}ya(U);break W}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(c&1){c=y[d+56>>2];c=y[c+28>>2]-y[c+24>>2]>>2;g=c+k|0;n=g;g=c>>>0<=g>>>0;k=g?n:0}else{k=0}s=d;c=g}b=b+1|0;continue}}c=b<<2;b=b+1|0;if(Ma(a,y[c+y[m+12>>2]>>2])){continue}break}}ya(Q);ma(j)}Y=e+272|0;b=l;break u;case 1:case 2:case 3:case 5:break B;case 4:case 6:case 7:break V;default:break K}}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+332|0)){break u}d=f+14|0;if(Wa(y[a+4>>2],d)){break u}c=y[f+332>>2];if(c-1>>>0>65534){break u}q=y[f+336>>2];if(q-1>>>0>65534){break u}h=Yb();y[f+308>>2]=h;y[h+12>>2]=q;y[h+8>>2]=c;c=A[f+14>>1];g=c&1;w[h|0]=g;w[h+2|0]=c>>>15;y[h+56>>2]=c>>>4&3;y[h+52>>2]=c>>>7&3;w[h+3|0]=c>>>6&1;w[h+4|0]=c>>>9&1;y[h+20>>2]=1<<(c>>>2&3);i=(c&254)>>>1&1;w[h+1|0]=i;k=c>>>10&31;w[h+5|0]=(k>>>0>15?-32:0)|k;bb:{if(g){if(Wa(y[a+4>>2],d)){break v}if(z[h+1|0]!=1){break w}if(!z[h+2|0]){break bb}break w}if(!i|c<<16>>16<0){break w}}c=h+92|0;d=0;while(1){if((d|0)==4){break w}g=c+d|0;d=d+1|0;if(!va(y[a+4>>2],g)){continue}break}break v}g=na(12);y[g+8>>2]=0;y[g>>2]=0;y[g+4>>2]=0;if(va(y[a+4>>2],f+352|0)){break y}b=1;if(va(y[a+4>>2],g+1|0)){break x}if(va(y[a+4>>2],g+2|0)){break x}if(ra(y[a+4>>2],g+4|0)){break x}i=y[g+4>>2];if(i>>>0>65535){break x}b=z[f+352|0];d=b&1;w[g|0]=d;b=b>>>1&3;w[g+8|0]=b;y[m+52>>2]=3;if(d){d=y[a+4>>2];b=wc(g);y[f+24>>2]=b;if(b){y[f+332>>2]=0;hb(b,f+332|0,d);cb:{d=y[f+332>>2];if(!d){break cb}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break cb}h=z[g+1|0];h=sb(d,E(h,b),0,h,z[g+2|0]);k=y[c+4>>2];y[f+312>>2]=0;oa((b<<2)+k|0,h);b=b+1|0;la(f+312|0);continue}}la(f+332|0)}ua(f+24|0);y[f+332>>2]=0;Xb(m+60|0,c);Zb(f+332|0);if(!y[m+60>>2]){break y}ta(y[a+4>>2]);b=0;break x}k=b?(b|0)==1?8192:1024:65536;l=ab(k,8);y[f+336>>2]=k;y[f+332>>2]=l;n=Ra(y[a+4>>2]);y[f+16>>2]=n;d=wc(g);y[f+312>>2]=d;if(!d){break z}w[d+1|0]=0;w[d+2|0]=0;w[d+3|0]=b;h=z[g+1|0];w[d+17|0]=0;w[d+16|0]=0-h;if(!b){w[d+22|0]=254;w[d+23|0]=254;w[d+18|0]=253;w[d+19|0]=255;w[d+20|0]=2;w[d+21|0]=254}y[f+356>>2]=0;y[f+40>>2]=0;y[f+32>>2]=l;y[f+36>>2]=k;y[f+28>>2]=n;y[f+24>>2]=f+356;b=Wb(d,f+24|0);y[f+40>>2]=0;while(1){if((b|0)==3){b=Vb(d,f+24|0);continue}break}y[d+44>>2]=0;y[d+48>>2]=0;y[d+36>>2]=0;y[d+40>>2]=0;y[d+28>>2]=0;y[d+32>>2]=0;if(!y[f+356>>2]){break A}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break A}d=sb(y[f+356>>2],E(b,h),0,h,z[g+2|0]);k=y[c+4>>2];y[f>>2]=0;oa((b<<2)+k|0,d);b=b+1|0;la(f);continue}}b=1;if(z[a+49|0]!=1){break u}q=na(56);y[q+16>>2]=0;db:{if(tb(a,f+312|0)){break db}if(va(y[a+4>>2],f+14|0)){break db}if(ra(y[a+4>>2],q+32|0)){break db}if(ra(y[a+4>>2],q+36|0)){break db}if(ra(y[a+4>>2],q+40|0)){break db}if(ra(y[a+4>>2],q+44|0)){break db}if(Wa(y[a+4>>2],q+48|0)){break db}if(Wa(y[a+4>>2],q+50|0)){break db}C=y[q+32>>2];if(C-1>>>0>65534){break db}e=y[q+36>>2];if(e-1>>>0>65534){break db}v=y[f+312>>2];if(v-1>>>0>65534){break db}k=y[f+316>>2];if(k-1>>>0>65534){break db}y[q+4>>2]=k;y[q>>2]=v;d=z[f+14|0];F=d&1;w[q+8|0]=F;w[q+20|0]=d>>>7;i=d>>>3|0;K=i&1;w[q+28|0]=K;s=d>>>1&3;w[q+9|0]=s;g=d>>>4|0;y[q+24>>2]=(g&7)==4?4:g&3;if(y[m+8>>2]!=1){break db}g=Ma(a,y[y[m+12>>2]>>2]);if(!g|(z[g+4|0]&63)!=16){break db}g=y[g+60>>2];if(!g){break db}j=y[g>>2];if(!j){break db}y[q+12>>2]=j;y[q+16>>2]=g+4;b=y[y[g+4>>2]>>2];g=y[b+8>>2];w[q+52|0]=g;r=y[b+12>>2];w[q+53|0]=r;y[m+52>>2]=1;eb:{fb:{gb:{if(d&1){d=y[a+4>>2];b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}x[f+80>>1]=0;y[f+36>>2]=0;y[f+48>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;b=c&255;g=gb(f+332|0,b);i=y[g>>2];c=(i+(b<<2)|0)-4|0;hb(f+24|0,c,d);h=0;hb:{if(!y[c>>2]){break hb}ta(d);c=y[d+8>>2];if(c>>>0<=4294967292){c=c+3|0;h=y[d+4>>2];y[d+8>>2]=c>>>0>>0?c:h}b=b-2|0;while(1){if((b|0)>=0){c=i+(b<<2)|0;hb(f+24|0,c,d);h=0;if(!y[c>>2]){break hb}ta(d);h=y[d+8>>2];if(h>>>0<=4294967292){h=h+3|0;l=y[d+4>>2];y[d+8>>2]=h>>>0>>0?h:l}fb(y[c>>2],0,0,0,0,y[c+4>>2],2);b=b-1|0;continue}break}h=uc(q,g)}b=h;$a(g);y[f+356>>2]=0;oa(m- -64|0,b);la(f+356|0);if(!y[m+64>>2]){break eb}ta(y[a+4>>2]);break gb}b=s?(s|0)==1?8192:1024:65536;d=ab(b,8);y[f+4>>2]=b;y[f>>2]=d;Q=Ra(y[a+4>>2]);y[f+308>>2]=Q;n=0;y[f+16>>2]=0;l=b;ib:{if(!(i&1)){break ib}b=xa(C,e);y[f+24>>2]=0;oa(f+16|0,b);b=r&255;O=1-b|0;D=0-(b>>>0>1)|0;b=g&255;P=1-b|0;H=0-(b>>>0>1)|0;la(f+24|0);n=y[f+16>>2];jb:while(1){if(!c&(e|0)==(h|0)){break ib}ja(f+24|0,n,h);b=y[q+44>>2];L=A[q+48>>1];g=se(h,c,L);r=b+g|0;b=Z+(b>>31)|0;V=g>>>0>r>>>0?b+1|0:b;b=y[q+40>>2];N=A[q+50>>1];g=se(h,c,N);I=b+g|0;b=Z+(b>>31)|0;U=g>>>0>I>>>0?b+1|0:b;g=0;i=0;W=y[f+28>>2];_=y[f+24>>2];while(1)if(!i&(g|0)==(C|0)){h=h+1|0;c=h?c:c+1|0;continue jb}else{S=y[n+8>>2];b=se(g,i,N);u=r-b|0;G=V-(Z+(b>>>0>r>>>0)|0)|0;b=G>>8;X=(G&255)<<24|u>>>8;T=se(g,i,L);u=T+I|0;G=Z+U|0;M=S;G=u>>>0>>0?G+1|0:G;S=(G&255)<<24|u>>>8;u=G>>8;La(M,g,_,W,k>>>0<=X>>>0&(b|0)>=0|(b|0)>0|(P>>>0>S>>>0&(H|0)>=(u|0)|(u|0)<(H|0)|((b|0)<=(D|0)&O>>>0>X>>>0|(b|0)<(D|0))|(v>>>0<=S>>>0&(u|0)>=0|(u|0)>0)));g=g+1|0;i=g?i:i+1|0;continue}}}g=d;b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}y[f+48>>2]=0;y[f+52>>2]=0;x[f+80>>1]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;y[f+36>>2]=n;w[f+26|0]=K;w[f+25|0]=0;w[f+27|0]=s;kb:{if(s>>>0>=2){x[f+40>>1]=65282;break kb}x[f+40>>1]=65283;if(s){break kb}x[f+46>>1]=65278;x[f+42>>1]=65533;x[f+44>>1]=65026}b=c&255;c=gb(f+356|0,b);h=y[c>>2];n=b-1|0;d=n;lb:{mb:{while(1){if((d|0)<0){break mb}y[f+352>>2]=0;y[f+348>>2]=0;y[f+340>>2]=g;y[f+344>>2]=l;y[f+336>>2]=Q;y[f+332>>2]=f+352;b=Wb(f+24|0,f+332|0);y[f+348>>2]=0;while(1){if((b|0)==3){b=Vb(f+24|0,f+332|0);continue}break}y[f+68>>2]=0;y[f+72>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;b=y[f+352>>2];nb:{if(!b){break nb}y[f+352>>2]=0;i=h+(d<<2)|0;oa(i,b);if((d|0)>=(n|0)){break nb}fb(y[i>>2],0,0,0,0,y[i+4>>2],2)}d=d-1|0;la(f+352|0);if(b){continue}break}b=0;break lb}b=uc(q,c)}$a(c);la(f+16|0);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break fb}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(f+308|0);Ha(f)}if((z[m+4|0]&63)==20){b=0;break db}ob:{if(z[a+50|0]){break ob}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ob}c=k+y[f+324>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ob}eb(d,c,z[b+16|0])}b=y[f+320>>2];g=b;h=b>>31;b=y[f+324>>2];c=b;d=b>>31;b=z[f+328|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);b=0;oa(m- -64|0,0);break db}ua(f+308|0);Ha(f)}b=1}ma(q);break u}b=1;if(z[a+49|0]!=1){break u}g=a+76|0;d=y[a+76>>2];if(!d){c=qb();y[f+24>>2]=c;pb:{qb:{if(tb(a,a+88|0)){break qb}if(va(y[a+4>>2],f+332|0)){break qb}d=y[a+92>>2];if((d|0)<0){break qb}i=y[a+88>>2];if((i|0)<0){break qb}y[c+8>>2]=d;y[c+4>>2]=i;d=z[f+332|0];i=d&1;w[c|0]=i;h=d>>>1&3;w[c+3|0]=h;w[c+1|0]=d>>>3&1;if(i){break pb}i=c+16|0;d=0;if(!h){while(1){if((d|0)==8){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break qb}}while(1){if((d|0)==2){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break}}ua(f+24|0);break u}w[c+2|0]=0;y[f+24>>2]=0;Va(g,c);ua(f+24|0);d=y[g>>2]}y[m+52>>2]=1;rb:{if(z[d|0]==1){hb(d,m- -64|0,y[a+4>>2]);if(!y[m+64>>2]){Va(g,0);break D}ta(y[a+4>>2]);break rb}if(y[a+60>>2]==y[a+64>>2]){b=z[d+3|0];kb(a+60|0,b?(b|0)==1?8192:1024:65536)}c=a+72|0;h=f;b=y[a+72>>2];if(b){d=b}else{d=Ra(y[a+4>>2]);y[f+24>>2]=0;Va(c,d);ua(f+24|0);d=y[a+72>>2]}y[h+28>>2]=d;d=m- -64|0;y[f+24>>2]=d;h=y[a+64>>2];i=y[a+60>>2];y[f+40>>2]=0;y[f+32>>2]=i;y[f+36>>2]=h-i>>3;i=y[a+76>>2];sb:{if(!b){b=Wb(i,f+24|0);break sb}b=Vb(i,f+24|0)}y[a+56>>2]=b;if((b|0)==3){if((z[m+4|0]&63)==36){break B}tb:{if(z[a+50|0]){break tb}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break tb}c=y[a+92>>2]+y[a+100>>2]|0;g=y[a+32>>2];if((c|0)<=y[g+12>>2]){break tb}eb(g,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;g=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],g,i,c,c>>31,y[d>>2],h,(b&7)==4?4:b&3);break B}b=y[a+76>>2];y[b+44>>2]=0;y[b+48>>2]=0;y[b+36>>2]=0;y[b+40>>2]=0;y[b+28>>2]=0;y[b+32>>2]=0;Va(c,0);y[a+64>>2]=y[a+60>>2];if(!y[d>>2]){y[a+56>>2]=-1;Va(g,0);break D}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0>4294967293){break rb}d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}if((z[m+4|0]&63)!=36){ub:{if(z[a+50|0]){break ub}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ub}c=y[a+92>>2]+y[a+100>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ub}eb(d,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;d=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],d,i,c,c>>31,y[m+64>>2],h,(b&7)==4?4:b&3);oa(m- -64|0,0)}b=0;Va(g,0);break u}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+24|0)){break u}if(va(y[a+4>>2],f+352|0)){break u}i=y[f+24>>2];if(i-1>>>0>65534){break u}g=y[f+28>>2];if(g-1>>>0>65534){break u}d=0;y[f+312>>2]=0;c=db();y[f+356>>2]=c;y[c+8>>2]=g;y[c+4>>2]=i;b=z[f+352|0];h=b&1;w[c|0]=h;w[c+1|0]=b>>>1&1;vb:{wb:{if(h){break wb}h=c+24|0;while(1){if((d|0)==4){break wb}b=1;k=d+h|0;d=d+1|0;if(!va(y[a+4>>2],k)){continue}break}break vb}h=y[m+8>>2];xb:{if((h|0)>0){d=0;b=1;while(1){if((d|0)==(h|0)){break vb}i=Ma(a,y[y[m+12>>2]>>2]);if(!i){break vb}k=(z[i+4|0]&63)-4|0;k=(k<<6|(k&252)>>>2)&255;if(!(1<>>0<=9:0)){d=d+1|0;continue}break}b=i- -64|0;break xb}d=sb(y[a+32>>2],y[f+32>>2],y[f+36>>2],i,g);y[f+332>>2]=0;b=f+312|0;oa(b,d);la(f+332|0)}b=y[b>>2];y[c+12>>2]=0;y[c+16>>2]=0;y[c+20>>2]=b;d=z[c|0];i=d?1024:8192;b=ab(i,8);y[f+336>>2]=i;y[f+332>>2]=b;i=Ra(y[a+4>>2]);y[f>>2]=i;y[m+52>>2]=1;c=cb(c,i,b,d?1024:8192);y[f+16>>2]=0;b=m- -64|0;oa(b,c);la(f+16|0);c=1;yb:{if(!y[m+64>>2]){break yb}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){h=c;d=d+2|0;c=y[c+4>>2];y[h+8>>2]=c>>>0>d>>>0?d:c}c=0;if((z[m+4|0]&63)==40){break yb}zb:{if(z[a+50|0]){break zb}c=y[y[a+24>>2]-4>>2];if(z[c+17|0]!=1){break zb}d=g+y[f+36>>2]|0;g=y[a+32>>2];if((d|0)<=y[g+12>>2]){break zb}eb(g,d,z[c+16|0])}c=y[f+32>>2];d=c;i=c>>31;c=y[f+36>>2];g=c;h=c>>31;c=z[f+40|0];fb(y[a+32>>2],d,i,g,h,y[b>>2],(c&7)==4?4:c&3);oa(b,0);c=0}b=c;ua(f);Ha(f+332|0)}Ua(f+356|0);la(f+312|0);break u}c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;y[c>>2]=0;y[c+4>>2]=0;y[f+24>>2]=c;if(ra(y[a+4>>2],c)){break E}if(ra(y[a+4>>2],c+4|0)){break E}if(ra(y[a+4>>2],c+8|0)){break E}if(ra(y[a+4>>2],c+12|0)){break E}if(va(y[a+4>>2],f+356|0)){break E}if(Wa(y[a+4>>2],f+312|0)){break E}w[c+16|0]=z[f+356|0]>>>2&1;g=A[f+312>>1];b=g&32767;x[c+18>>1]=b;w[c+17|0]=g>>>15;d=y[c+4>>2];if((d|0)!=-1){break J}if(g<<16>>16>=0){w[c+17|0]=1}if(z[a+50|0]){break F}d=b;break G}w[a+49|0]=0;break u}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}y[m+52>>2]=4;k=m+68|0;vb(k,0);g=y[a+4>>2];d=na(44);w[d+1|0]=0;t(d+4|0,0,40);if((va(g,f+356|0)|0)==-1){break I}b=1;i=z[f+356|0];w[d+1|0]=i&1;Ab:{Bb:{if((ra(g,f+332|0)|0)==-1){break Bb}if((ra(g,f+312|0)|0)==-1){break Bb}c=y[f+332>>2];h=y[f+312>>2];if((c|0)>(h|0)){break Bb}l=(i>>>4&7)+1|0;i=(i>>>1&7)+1|0;pb(d,0);y[f+28>>2]=c;w[f+24|0]=1;b=c;while(1){if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}if((Ia(g,l,y[d+20>>2]+(y[d+4>>2]<<2)|0)|0)==-1){break Ab}n=y[d+20>>2];q=y[d+4>>2]<<2;if(B[n+q>>2]>63){break Ab}y[q+y[d+32>>2]>>2]=b;b=y[n+(y[d+4>>2]<<2)>>2];if((b|0)>31){break Ab}if(z[Na(f+24|0,1<>2];if((h|0)>(b|0)){continue}break}if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;if((c|0)==-2147483648){break Ab}y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=c-1;pb(d,1);if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=h;pb(d,1);b=y[d+4>>2];if(z[d+1|0]==1){if((Ia(g,i,y[d+8>>2]+(b<<3)|0)|0)==-1){break Ab}b=y[d+4>>2]+1|0;y[d+4>>2]=b}c=y[d+8>>2];if(y[d+12>>2]-c>>3>>>0>>0){break t}c=ob(c,b);w[d|0]=c;y[f+24>>2]=d;b=1;if(!c){break H}b=0;y[f+24>>2]=0;vb(k,d);ta(y[a+4>>2]);break H}w[d|0]=0;y[f+24>>2]=d;break H}break I}if((d|0)!=62){break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}if(!z[a+50|0]){break G}break F}w[d|0]=0;y[f+24>>2]=d;b=1}pa(f+24|0);break u}b=xa(y[c>>2],d);y[f+332>>2]=0;oa(a+32|0,b);la(f+332|0)}if(qa(y[a+32>>2])){break C}y[a+56>>2]=-1}$b(f+24|0)}b=1;break u}Qa(y[a+32>>2],z[c+16|0]);Cb:{Db:{b=y[a+24>>2];h=y[a+28>>2];Eb:{if(b>>>0>>0){y[f+24>>2]=0;y[b>>2]=c;b=b+4|0;break Eb}d=y[a+20>>2];g=b-d|0;k=g>>2;i=k+1|0;if(i>>>0>=1073741824){break Db}b=0;h=h-d|0;l=h>>1;i=h>>>0>=2147483644?1073741823:i>>>0>>0?l:i;if(i){if(i>>>0>=1073741824){break Cb}b=na(i<<2)}y[f+24>>2]=0;h=b+g|0;y[h>>2]=c;c=h-(k<<2)|0;if(g){p(c,d,g)}y[a+28>>2]=(i<<2)+b;b=h+4|0;y[a+24>>2]=b;y[a+20>>2]=c;if(!d){break Eb}ma(d)}w[a+49|0]=1;y[a+24>>2]=b;$b(f+24|0);break B}Ba();o()}jb();o()}b=0;break u}la(f+356|0)}ua(f+312|0);y[f+24>>2]=0;Xb(m+60|0,c);Zb(f+24|0);if(y[m+60>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ua(f+16|0);Ha(f+332|0);b=0;break x}ua(f+16|0);Ha(f+332|0)}b=1}ma(g);break u}if(ra(y[a+4>>2],h+16|0)){break v}c=y[a+4>>2];g=y[c>>2];c=y[c+4>>2];if((c|0)<0){break t}d=c>>>27&15;c=((c&134217727)<<5|g>>>27)&-32;if(!d&c>>>0>=2147483648|d){break t}if(!d&B[h+16>>2]>c>>>0){break v}n=0;b=y[m+8>>2];c=(b|0)>0?b:0;d=0;while(1){if((c|0)==(d|0)){i=1;b=0;while(1)if((b|0)==(c|0)){if(!(i&1)){break t}y[h+24>>2]=n;l=Ub(f+356|0,n);k=y[l>>2];Fb:{if((k|0)==y[l+4>>2]){break Fb}b=y[m+8>>2];s=(b|0)>0?b:0;i=1;n=0;c=0;while(1){if((c|0)==(s|0)){break Fb}Gb:{b=Ma(a,y[y[m+12>>2]+(c<<2)>>2]);if(z[b+4|0]&63){break Gb}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;if(i&1){b=d+n|0;d=b>>>0>=d>>>0;g=d;n=d?b:0}else{n=0}i=g;break Gb}C=b+n|0;if(!(C>>>0>=b>>>0&i)){break t}y[k+(C<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}c=c+1|0;continue}}bb(h+40|0,l);Hb:{Ib:{Jb:{Kb:{if(!z[h|0]){c=y[h+24>>2];b=0;while(1){d=b;b=b+1|0;if(c>>>0>1<>>0){continue}break}break Kb}n=y[h+24>>2];b=0;while(1){if((b|0)!=35){c=b<<3;b=b+1|0;if(!Ia(y[a+4>>2],4,c+(f+24|0)|0)){continue}break Jb}break}if(!ob(f+24|0,35)){break Jb}i=Ed(f+312|0,n);k=y[i>>2];c=0;Lb:while(1){Mb:{Nb:{Ob:{if((c|0)<(n|0)){d=0;y[f+20>>2]=0;w[f+16|0]=1;Pb:while(1){if(wb(y[a+4>>2],f+352|0)){break Nb}g=Tb(f+16|0);if(z[g|0]!=1){break Nb}b=0;C=y[f+20>>2]|y[f+352>>2];s=(C|0)>=0;y[g>>2]=s;j=g;g=s?C:0;y[j+4>>2]=g;if(!s){break t}d=d+1|0;while(1){if((b|0)==35){continue Pb}s=(f+24|0)+(b<<3)|0;if(!(y[s>>2]==(d|0)&(g|0)==y[s+4>>2])){b=b+1|0;continue}break}break}if(b>>>0<=31){y[k+(c<<3)>>2]=b;break Mb}g=y[a+4>>2];Qb:{switch(b-33|0){default:if(Ia(g,2,f+352|0)){break Nb}d=3;break Ob;case 1:if(Ia(g,7,f+352|0)){break Nb}d=11;break Ob;case 0:break Qb}}d=3;if(!Ia(g,3,f+352|0)){break Ob}break Nb}b=y[i+4>>2];if(!ob(k,b-k>>3)){break Nb}y[f+4>>2]=b;y[f>>2]=k;y[f+8>>2]=y[i+8>>2];d=0;y[i+8>>2]=0;y[i>>2]=0;y[i+4>>2]=0;ya(i);if((b|0)==(k|0)){break Ib}ta(y[a+4>>2]);bb(h+28|0,f);ya(f);b=1;if(z[h|0]!=1){break Kb}c=A[f+14>>1];g=c>>>12&3;if((g|0)==2){break Hb}k=c>>>10&3;if((k|0)==2){break Hb}n=c>>>8&3;if((n|0)==2){break Hb}i=c&3;if((i|0)==2){break Hb}s=c>>>6&3;if((s|0)==2){break Hb}Rb:{Sb:{switch(i|0){case 0:i=0;j=sa(a,6);break Rb;case 1:i=0;j=sa(a,7);break Rb;default:break Sb}}C=Ga(a,m,0);if(!C){break Hb}i=1;j=y[C+68>>2]}y[h+60>>2]=j;Tb:{Ub:{switch((c>>>2&3)-1|0){default:j=sa(a,8);break Tb;case 0:j=sa(a,9);break Tb;case 1:j=sa(a,10);break Tb;case 2:break Ub}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+64>>2]=j;Vb:{Wb:{switch((c>>>4&3)-1|0){default:j=sa(a,11);break Vb;case 0:j=sa(a,12);break Vb;case 1:j=sa(a,13);break Vb;case 2:break Wb}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+68>>2]=j;Xb:{Yb:{switch(s|0){case 0:j=sa(a,14);break Xb;case 1:j=sa(a,15);break Xb;default:break Yb}}s=Ga(a,m,i);if(!s){break Hb}i=i+1|0;j=y[s+68>>2]}y[h+72>>2]=j;Zb:{_b:{switch(n|0){case 0:n=sa(a,14);break Zb;case 1:n=sa(a,15);break Zb;default:break _b}}n=Ga(a,m,i);if(!n){break Hb}i=i+1|0;n=y[n+68>>2]}y[h+76>>2]=n;$b:{ac:{switch(k|0){case 0:n=sa(a,14);break $b;case 1:n=sa(a,15);break $b;default:break ac}}k=Ga(a,m,i);if(!k){break Hb}i=i+1|0;n=y[k+68>>2]}y[h+80>>2]=n;bc:{cc:{switch(g|0){case 0:g=sa(a,14);break bc;case 1:g=sa(a,15);break bc;default:break cc}}g=Ga(a,m,i);if(!g){break Hb}i=i+1|0;g=y[g+68>>2]}y[h+84>>2]=g;if(!(c&16384)){fa=h,ga=sa(a,1),y[fa+88>>2]=ga;break Kb}c=Ga(a,m,i);if(!c){break Hb}y[h+88>>2]=y[c+68>>2];break Kb}s=y[f+352>>2]+d|0;if((s|0)<=0){break Mb}g=c+s|0;if((g|0)>(n|0)){break Nb}d=0;b=(b|0)==32&(c|0)>0;c=k+(c<<3)|0;C=c-8|0;while(1)if((d|0)==(s|0)){c=g;continue Lb}else{y[c+(d<<3)>>2]=b?y[C>>2]:0;d=d+1|0;continue}}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0;ya(i);break Ib}c=c+1|0;continue}}i=0;y[f+312>>2]=0;y[f+316>>2]=0;if(z[h+1|0]==1){b=z[h+2|0];c=b?1024:8192;g=ab(c,8);y[f+24>>2]=0;rc(f+312|0,g);y[f+316>>2]=c;y[f+28>>2]=0;Ha(f+24|0);i=b?1024:8192}y[m+52>>2]=1;dc:{ec:{fc:{gc:{if(z[h|0]==1){b=Dd(h,y[a+4>>2],y[f+312>>2],i);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break ec}ta(y[a+4>>2]);break gc}c=Ra(y[a+4>>2]);y[f>>2]=c;b=Cd(f+24|0,d&255);c=Bd(h,c,y[f+312>>2],i,b);y[f+16>>2]=0;oa(m- -64|0,c);la(f+16|0);if(!y[m+64>>2]){break fc}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){g=c;d=d+2|0;c=y[c+4>>2];y[g+8>>2]=c>>>0>d>>>0?d:c}qc(b);ua(f)}b=0;if((z[m+4|0]&63)==4){break dc}hc:{if(z[a+50|0]){break hc}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break hc}c=q+y[f+344>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break hc}eb(d,c,z[b+16|0])}b=y[f+340>>2];g=b;h=b>>31;b=y[f+344>>2];c=b;d=b>>31;b=z[f+348|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);oa(m- -64|0,0);b=0;break dc}qc(b);ua(f)}b=1}Ha(f+312|0);break Hb}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0}ya(f);b=1}ya(l);break v}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(i&1){d=y[d+56>>2];d=y[d+28>>2]-y[d+24>>2]>>2;g=d+n|0;i=g;g=d>>>0<=g>>>0;n=g?i:0}else{n=0}i=g}b=b+1|0;continue}}b=1;g=d<<2;d=d+1|0;if(Ma(a,y[g+y[m+12>>2]>>2])){continue}break}}pc(f+308|0)}Y=f+368|0;break s}o()}if(y[a+56>>2]!=3){break r}b=y[a+4>>2];c=y[b+8>>2];b=y[b+4>>2];if(c>>>0>b>>>0){break e}if((b|0)!=(c|0)){continue}break}y[a+52>>2]=2;break c}ic:{switch(b|0){default:ib(R,0);break i;case 0:break ic;case 2:break d}}g=y[R>>2];b=y[g+28>>2];if((b|0)==-1){break g}c=y[a+84>>2];b=b+c|0;if(b>>>0>=c>>>0){break h}}aa=1;break c}y[a+84>>2]=b;d=y[a+4>>2];c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c;break f}d=y[a+4>>2];b=y[d+8>>2];if(b>>>0>4294967291){break f}b=b+4|0;c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c}b=y[a+12>>2];i=y[a+16>>2];jc:{if(b>>>0>>0){y[R>>2]=0;y[b>>2]=g;b=b+4|0;break jc}c=y[a+8>>2];b=b-c|0;k=b>>2;d=k+1|0;if(d>>>0>=1073741824){break b}i=i-c|0;h=i>>1;d=i>>>0>=2147483644?1073741823:d>>>0>>0?h:d;if(d){if(d>>>0>=1073741824){break a}i=na(d<<2)}else{i=0}y[a+80>>2]=0;h=b+i|0;y[h>>2]=g;g=h-(k<<2)|0;if(b){p(g,c,b)}y[a+16>>2]=i+(d<<2);b=h+4|0;y[a+12>>2]=b;y[a+8>>2]=g;if(c){ma(c)}d=y[a+4>>2]}y[a+12>>2]=b;b=y[d+8>>2];i=y[d+4>>2];if(b>>>0<=i>>>0){continue}break}}o()}ib(R,0)}Y=J+16|0;return aa}Ba();o()}jb();o()}function cb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=Y-96|0;Y=e;f=y[a+8>>2];g=y[a+4>>2];a:{if(!(f-1>>>0<65535&g-1>>>0<=65534)){n=xa(g,f);break a}b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(!z[a|0]){l:{if(z[a+24|0]!=255|z[a+25|0]!=255|(z[a+26|0]!=255|z[a+27|0]!=255)){break l}if(y[a+12>>2]){break l}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break l}if(!qa(k)){break b}p=y[a+4>>2];f=y[a+8>>2];n=xa(p,f);y[e+44>>2]=n;if(!qa(n)){break d}q=d;A=c;c=y[a+20>>2];G=y[c+8>>2];x=y[c+12>>2];c=y[a+16>>2];if(!((1-x|0)<=(c|0)&(c|0)<(x|0))){y[a+16>>2]=0}K=(f|0)>0?f:0;L=x+1|0;E=x-1|0;H=A+128|0;while(1){if((l|0)!=(K|0)){if(z[a+1|0]==1){if(z[b|0]){break d}if((d|0)==16|d>>>0<16){break k}C=ka(b,H)^C}ja(e+32|0,n,l);i=0;m:{if(!l){u=0;s=0;k=0;break m}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}u=y[e+72>>2];k=z[u|0]<<4}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(x|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c&192}j=0;c=0;n:{if((g|0)<0){break n}c=0;if((g|0)>=(x|0)){break n}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>3&24}if(!((g|0)<-1|(g|0)>=(E|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}o:{if(!C){h=c|(k&3072|i)|j;r=0;v=y[e+32>>2];I=y[e+36>>2];m=0;p:while(1){if((m|0)>=(p|0)){break o}q:{if(!l){break q}k=k<<8;if((p|0)<=(m+8|0)){break q}c=(m>>>3|0)+1|0;if(c>>>0>=s>>>0){break k}k=z[c+u|0]<<4|k}r:{if((L+y[a+16>>2]|0)<(l|0)){y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=0;i=0;c=0;break r}c=(m>>>3|0)+1|0;i=e+8|0;f=0;g=(G|0)<=(m+8|0);while(1){if((f|0)!=24){j=(e+72|0)+f|0;t=y[j+4>>2];s:{if(!t){break s}D=y[i>>2]<<8;y[i>>2]=D;if(g){break s}if(c>>>0>=t>>>0){break k}y[i>>2]=D|z[c+y[j>>2]|0]}i=i+4|0;f=f+8|0;continue}break}g=y[e+12>>2];i=y[e+8>>2];c=y[e+16>>2]}f=0;j=r+p|0;j=(j|0)>0?j:0;D=(j|0)>=8?8:j;j=0;while(1){if((f|0)==(D|0)){c=m>>>3|0;if(c>>>0>=I>>>0){break k}w[c+v|0]=j;r=r-8|0;m=m+8|0;continue p}if(h>>>0>=q>>>0){break k}F=ka(b,A+(h<<3)|0);t=7-f|0;j=F<>>13-f&1|(g>>>10-f&8|(i>>>t&64|(k>>>t&1024|h<<1&6582|F<<9)));f=f+1|0;continue}}}Jb(e+48|0,a,l);i=c|(k&3072|i)|j;c=0;v=y[e+32>>2];I=y[e+36>>2];D=y[e+60>>2];F=y[e+56>>2];r=0;while(1){if((c|0)>=(p|0)){break o}t:{if(!l){g=c+8|0;break t}k=k<<8;g=c+8|0;if((p|0)<=(g|0)){break t}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+u|0]<<4|k}j=c>>>3|0;m=j+1|0;f=0;h=e+8|0;while(1){u:{if((f|0)==24){f=0;m=r+p|0;m=(m|0)>0?m:0;J=(m|0)>=8?8:m;N=y[e+16>>2];M=y[e+12>>2];O=y[e+8>>2];m=0;while(1){if((f|0)==(J|0)){break u}t=y[y[a+20>>2]+8>>2];P=c+f|0;h=ia(t,P,F,D);v:{if(z[a+1|0]==1){if(Ib(t,P,h,e+48|0)){break v}}if(z[b|0]){break d}if(i>>>0>=q>>>0){break k}h=ka(b,A+(i<<3)|0)}t=7-f|0;i=N>>>13-f&1|(M>>>10-f&8|(k>>>t&1024|i<<1&6582|h<<9|O>>>t&64));f=f+1|0;m=h<>2];w:{if(!J){break w}N=y[h>>2]<<8;y[h>>2]=N;if((g|0)>=(G|0)){break w}if(m>>>0>=J>>>0){break k}y[h>>2]=N|z[m+y[t>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(j>>>0>=I>>>0){break k}w[j+v|0]=m;r=r-8|0;c=g;continue}}l=l+1|0;continue}break}y[e+44>>2]=0;break c}n=xa(g,f);y[e+44>>2]=n;if(!qa(n)){break f}Qa(n,0);A=c;u=c+128|0;c=0;while(1){if(B[a+8>>2]>c>>>0){if(z[a+1|0]==1){if(z[b|0]){break f}if((d|0)==16|d>>>0<16){break k}m=ka(b,u)^m}ja(e+32|0,n,c);f=e+72|0;ja(f,n,c-1|0);g=y[e+76>>2];q=y[e+72>>2];dd(f,a,c);f=0;k=y[n+8>>2];f=!g|(k|0)<2?f:z[q|0]>>>6&1;if(!(!g|(k|0)<=0)){f=z[q|0]>>>6&2|f}y[e+8>>2]=f;y[e+12>>2]=0;r=y[a+20>>2];f=y[r+8>>2];k=y[a+12>>2];i=1-k|0;l=y[e+72>>2];j=y[e+76>>2];h=0-k|0;Q=e,R=ia(f,i,l,j)|ia(f,h,l,j)<<1,y[Q+16>>2]=R;l=y[e+80>>2];j=y[e+84>>2];s=ia(f,i,l,j);p=s|ia(f,h,l,j)<<1;s=k^-1;Q=e,R=p|ia(f,s,l,j)<<2,y[Q+20>>2]=R;j=i;k=y[e+88>>2];i=y[e+92>>2];l=ia(f,j,k,i);Q=e,R=l|ia(f,h,k,i)<<1|ia(f,s,k,i)<<2,y[Q+24>>2]=R;f=e+48|0;ja(f,r,w[a+27|0]+(c-y[a+16>>2]|0)|0);k=y[e+52>>2];h=y[e+48>>2];ja(f,n,w[a+25|0]+c|0);f=y[e+52>>2];i=y[e+48>>2];x:{if(!m){l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}p=e+8|0;h=cd(a,y[n+8>>2],p,f,r,g,j,i);if(z[b|0]){break f}if(d>>>0<=h>>>0){break k}bd(a,n,p,f,ka(b,A+(h<<3)|0),e+72|0,l,q,k,s);f=f+1|0;continue}}Jb(e+48|0,a,c);l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];p=y[e+60>>2];C=y[e+56>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}x=y[y[a+20>>2]+8>>2];h=ia(x,f,C,p);y:{if(z[a+1|0]==1){if(Ib(x,f,h,e+48|0)){break y}}h=cd(a,y[n+8>>2],e+8|0,f,r,g,j,i);if(z[b|0]==1){break f}if(d>>>0<=h>>>0){break k}h=ka(b,A+(h<<3)|0)}bd(a,n,e+8|0,f,h,e+72|0,l,q,k,s);f=f+1|0;continue}}c=c+1|0;continue}break}y[e+44>>2]=0;break e}z:{if(y[a+12>>2]){break z}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break z}if(!qa(k)){break b}q=y[a+4>>2];f=y[a+8>>2];n=xa(q,f);y[e+44>>2]=n;if(!qa(n)){break h}A=d;m=c;c=y[a+20>>2];x=y[c+8>>2];p=y[c+12>>2];c=y[a+16>>2];if(!((1-p|0)<=(c|0)&(c|0)<(p|0))){y[a+16>>2]=0}t=(f|0)>0?f:0;K=p-1|0;L=m- -64|0;while(1){A:{B:{if((l|0)!=(t|0)){if(z[a+1|0]==1){if(z[b|0]){break h}if((d|0)==8|d>>>0<8){break k}G=ka(b,L)^G}ja(e+32|0,n,l);i=0;C:{if(!l){C=0;s=0;k=0;break C}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}C=y[e+72>>2];k=z[C|0]<<1}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(p|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c>>>2&32}j=0;c=0;D:{if((g|0)<0){break D}c=0;if((g|0)>=(p|0)){break D}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>4&12}if(!((g|0)<-1|(g|0)>=(K|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}if(G){break B}h=c|(k&384|i)|j;f=0;u=y[e+32>>2];E=y[e+36>>2];r=0;E:while(1){if((f|0)>=(q|0)){break A}F:{if(!l){c=f+8|0;break F}k=k<<8;c=f+8|0;if((q|0)<=(c|0)){break F}g=(f>>>3|0)+1|0;if(g>>>0>=s>>>0){break k}k=z[g+C|0]<<1|k}g=f>>>3|0;j=g+1|0;i=e+8|0;f=0;while(1){if((f|0)==24){f=0;i=r+q|0;i=(i|0)>0?i:0;j=(i|0)>=8?8:i;H=y[e+16>>2];v=y[e+12>>2];I=y[e+8>>2];i=0;while(1){if((f|0)==(j|0)){if(g>>>0>=E>>>0){break k}w[g+u|0]=i;r=r-8|0;f=c;continue E}if(h>>>0>=A>>>0){break k}D=ka(b,m+(h<<3)|0);F=7-f|0;i=D<>>13-f&1|(v>>>11-f&4|(I>>>9-f&32|(k>>>F&128|h<<1&794|D<<6)));f=f+1|0;continue}}H=(e+72|0)+f|0;v=y[H+4>>2];G:{if(!v){break G}I=y[i>>2]<<8;y[i>>2]=I;if((c|0)>=(x|0)){break G}if(j>>>0>=v>>>0){break k}y[i>>2]=I|z[j+y[H>>2]|0]}i=i+4|0;f=f+8|0;continue}}}y[e+44>>2]=0;break g}Jb(e+48|0,a,l);i=c|(k&384|i)|j;c=0;E=y[e+32>>2];H=y[e+36>>2];v=y[e+60>>2];I=y[e+56>>2];u=0;while(1){if((c|0)>=(q|0)){break A}H:{if(!l){g=c+8|0;break H}k=k<<8;g=c+8|0;if((q|0)<=(g|0)){break H}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+C|0]<<1|k}r=c>>>3|0;j=r+1|0;f=0;h=e+8|0;while(1){I:{if((f|0)==24){f=0;h=q+u|0;h=(h|0)>0?h:0;D=(h|0)>=8?8:h;F=y[e+16>>2];J=y[e+12>>2];N=y[e+8>>2];j=0;while(1){if((f|0)==(D|0)){break I}M=y[y[a+20>>2]+8>>2];O=c+f|0;h=ia(M,O,I,v);J:{if(z[a+1|0]==1){if(Ib(M,O,h,e+48|0)){break J}}if(z[b|0]){break h}if(i>>>0>=A>>>0){break k}h=ka(b,m+(i<<3)|0)}M=7-f|0;i=F>>>13-f&1|(J>>>11-f&4|(N>>>9-f&32|(k>>>M&128|i<<1&794|h<<6)));f=f+1|0;j=h<>2];K:{if(!F){break K}J=y[h>>2]<<8;y[h>>2]=J;if((g|0)>=(x|0)){break K}if(j>>>0>=F>>>0){break k}y[h>>2]=J|z[j+y[D>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(r>>>0>=H>>>0){break k}w[r+E|0]=j;u=u-8|0;c=g;continue}}l=l+1|0;continue}}n=xa(g,f);y[e+32>>2]=n;if(!qa(n)){break j}Qa(n,0);g=c;t=c- -64|0;while(1){if(B[a+8>>2]>u>>>0){if(z[a+1|0]==1){if(z[b|0]){break j}if((d|0)==8|d>>>0<8){break k}r=ka(b,t)^r}ja(e+8|0,n,u);c=e+72|0;ja(c,n,u-1|0);k=y[e+76>>2];A=y[e+72>>2];dd(c,a,u);h=0;c=y[n+8>>2];h=!k|(c|0)<2?h:z[A|0]>>>6&1;h=!k|(c|0)<=0?h:z[A|0]>>>6&2|h;c=y[y[a+20>>2]+8>>2];m=y[a+12>>2];f=0-m|0;p=y[e+72>>2];C=y[e+76>>2];ia(c,f,p,C);l=ia(c,f,p,C);j=1-m|0;q=y[e+80>>2];s=y[e+84>>2];i=ia(c,j,q,s)|ia(c,f,q,s)<<1|ia(c,m^-1,q,s)<<2;x=y[e+88>>2];G=y[e+92>>2];j=ia(c,j,x,G)|ia(c,f,x,G)<<1;L:{if(!r){m=0;K=y[e+12>>2];L=y[e+8>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}if(z[b|0]){break j}c=i<<2|l<<5|m<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0);La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];E=f-l|0;l=ia(c,E+1|0,p,C);E=E+2|0;i=ia(c,E,q,s)|i<<1&6;j=ia(c,E,x,G)|j<<1&2;f=f+1|0;continue}}Jb(e+48|0,a,u);c=0;K=y[e+12>>2];L=y[e+8>>2];E=y[e+60>>2];H=y[e+56>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}v=y[y[a+20>>2]+8>>2];m=ia(v,f,H,E);M:{if(z[a+1|0]==1){if(Ib(v,f,m,e+48|0)){break M}}if(z[b|0]==1){break j}c=i<<2|l<<5|c<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0)}La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];v=f-l|0;l=ia(c,v+1|0,p,C);v=v+2|0;i=ia(c,v,q,s)|i<<1&6;j=ia(c,v,x,G)|j<<1&2;f=f+1|0;c=m;continue}}u=u+1|0;continue}break}y[e+32>>2]=0;break i}o()}n=0}la(e+32|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}}Y=e+96|0;return n}function Zc(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;i=Y-32|0;Y=i;j=d-(c>>>0<1048577)|0;l=f-(e>>>0<1048577)|0;a:{if((j|0)==-1&c-1048577>>>0<4292870143|(j|0)!=-1|((l|0)==-1&e-1048577>>>0<4292870143|(l|0)!=-1)){break a}p=y[h>>2];q=y[h+8>>2];j=y[h+4>>2];m=y[h+12>>2];y[i+28>>2]=y[b+8>>2];w[i+24|0]=1;l=Yc(i+24|0,c);v=z[l|0];k=y[i+28>>2];h=y[b+12>>2];y[l>>2]=1;y[l+4>>2]=h;l=Yc(l,e);h=m-j|0;m=y[i+28>>2];x=z[l|0]?(h|0)<(m|0)?h:m:h;l=0-e&f>>31;if((x|0)<=(l|0)){break a}h=q-p|0;m=v?(h|0)<(k|0)?h:k:h;h=0-c&d>>31;if((m|0)<=(h|0)){break a}b:{c:{p=h+p|0;if((p|0)<0){break c}c=!!c&(d|0)>=0|(d|0)>0?c:0;n=c+(m-h|0)|0;D=-1<<0-n;E=-1>>>c|0;v=j+l|0;k=h&31;j=x-l|0;q=c&31;d=!!e&(f|0)>=0|(f|0)>0?e:0;l=c>>>5|0;p=p>>>5|0;if((c^n-1)>>>0<=31){c=D&E;if((h^m-1)>>>0>=32){h=0;j=(j|0)>0?j:0;k=k-q|0;q=32-k|0;m=p<<2;while(1){if((h|0)==(j|0)){break a}f=i+8|0;Ca(f,a,h+v|0);e=y[i+12>>2];n=y[i+8>>2];Ca(f,b,d+h|0);if(!e){break b}f=y[i+12>>2];if(!f){break b}if(e>>>0

    >>0){break c}y[i+20>>2]=e-p;y[i+16>>2]=m+n;e=_a(i+16|0);if(!y[i+20>>2]|f>>>0>>0|(f|0)==(l|0)){break c}f=y[i+8>>2]+(l<<2)|0;n=(te(e,24)&16711935|te(e&16711935,8))<>2]>>2];n=n|(te(e&16711935,8)|te(e,24)&16711935)>>>q;e=y[f>>2];e=Oa(g,n,te(e&16711935,8)|te(e,24)&16711935,c);I=f,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}h=0;f=(j|0)>0?j:0;if(k>>>0>q>>>0){k=k-q|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

    >>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)<>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}k=q-k|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

    >>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)>>>k|0;e=y[e>>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}x=n&31;A=(y[a+16>>2]>>>2)-(h>>>5)|0;if(k>>>0<=q>>>0){if((k|0)==(q|0)){k=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}A=(j|0)>0?j:0;t=p<<2;d:while(1){if((k|0)==(A|0)){break a}f=i+8|0;Ca(f,a,k+v|0);c=y[i+12>>2];j=y[i+8>>2];Ca(f,b,d+k|0);if(!c){break b}h=y[i+12>>2];if(!h){break b}if(c>>>0

    >>0){break c}y[i+20>>2]=c-p;y[i+16>>2]=j+t;if(h>>>0>>0){break c}j=h-l|0;y[i+12>>2]=j;y[i+8>>2]=y[i+8>>2]+(l<<2);if(q){c=_a(i+16|0);f=gc(f);h=te(c,24)&16711935|te(c&16711935,8);c=y[f>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;j=y[i+12>>2]}if(e>>>0>j>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];u=e<<2;m=h+u|0;n=y[i+20>>2];f=c;while(1)if((h|0)==(m|0)){if(x){if((e|0)==(n|0)|e>>>0>n>>>0|(e|0)==(j|0)){break c}c=y[f+u>>2];f=te(c&16711935,8)|te(c,24)&16711935;c=y[m>>2];c=Oa(g,f,te(c&16711935,8)|te(c,24)&16711935,D);I=m,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}k=k+1|0;continue d}else{r=y[c>>2];s=te(r&16711935,8)|te(r,24)&16711935;r=y[h>>2];r=Eb(g,s,te(r&16711935,8)|te(r,24)&16711935);I=h,J=te(r&16711935,8)|te(r,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=q-k|0;u=32-n|0;F=(j|0)>0?j:0;G=p<<2;e:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

    >>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=_a(i+16|0);j=te(c&16711935,8)|te(c,24)&16711935;if(q){c=gc(i+8|0);f=y[c>>2];f=Oa(g,j>>>n|0,te(f&16711935,8)|te(f,24)&16711935,E);h=te(f&16711935,8);I=c,J=te(f,24)&16711935|h,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;t=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(t|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>n|h}if((e|0)==(k|0)){break c}c=y[t>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=t,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue e}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>n,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=k-q|0;t=32-n|0;F=(j|0)>0?j:0;G=p<<2;f:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

    >>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=i+16|0;f=_a(c);j=te(f&16711935,8)|te(f,24)&16711935;if(q){c=_a(c);f=gc(i+8|0);h=j<>2];c=Oa(g,h|j>>>t,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;u=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(u|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>t|h}if((e|0)==(k|0)){break c}c=y[u>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=u,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue f}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>t,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}o()}}Y=i+32|0}function Dd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;f=Y-128|0;Y=f;n=xa(y[a+8>>2],y[a+12>>2]);y[f+124>>2]=n;if(qa(n)){Qa(n,z[a+4|0]);k=qd(b);y[f+116>>2]=k;e=0;a:{if(za(k,y[a+68>>2],f+120|0)){break a}y[f+108>>2]=y[f+120>>2];w[f+104|0]=1;q=Db(f+104|0,y[a+20>>2]);e=q;g=y[f+108>>2];h=0-g|0;y[e>>2]=z[e|0]&(g|0)!=-2147483648;y[e+4>>2]=h;y[f+100>>2]=0;w[f+96|0]=1;b:{c:{d:{e:while(1){if(B[a+16>>2]>r>>>0){if(za(k,y[a+68>>2],f+92|0)){break b}y[f+84>>2]=y[f+92>>2];e=1;w[f+80|0]=1;g=Db(f+80|0,y[a+20>>2]);s=Vc(q,y[g>>2],y[g+4>>2]);y[f+76>>2]=0;w[f+72|0]=1;while(1){f:{if(e&1){if(za(k,y[a+60>>2],f+8|0)){break b}h=Na(f+96|0,y[f+8>>2]);e=y[h+4>>2];y[f+72>>2]=y[h>>2];y[f+76>>2]=e;break f}g:{switch(za(k,y[a+64>>2],f+8|0)|0){case 0:break g;case 1:continue e;default:break b}}Na(Na(f+72|0,y[f+8>>2]),w[a+5|0])}e=1;j=0;g=y[a+20>>2];if((g|0)!=1){while(1){h=e;e=e+1|0;if(g>>>0>1<>>0){continue}break}if(Ia(b,h,f+8|0)){break b}j=z[f+8|0]}e=y[s+4>>2];if(!(y[s>>2]&1)){break b}h=e+j|0;e=h&(e^-1);if((e|0)<0){break b}t=(e|0)>=0?h:0;j=0;y[f+68>>2]=0;w[f+64|0]=1;h:while(1){if(wb(b,f+8|0)){break b}e=Tb(f- -64|0);if(z[e|0]!=1){break b}h=y[f+68>>2]|y[f+8>>2];g=(h|0)>=0;y[e>>2]=g;h=g?h:0;y[e+4>>2]=h;if(!g){break d}j=j+1|0;l=y[a+28>>2];i=y[a+24>>2];e=0;while(1){if((e|0)==(i|0)){continue h}g=l+(e<<3)|0;if(!(y[g>>2]==(j|0)&(h|0)==y[g+4>>2])){e=e+1|0;continue}break}break}i:{j:{k:{if(!z[a+1|0]){w[f+60|0]=0;y[f+56>>2]=0;break k}h=y[b>>2];g=y[b+8>>2];if(g>>>0>=B[b+4>>2]){break b}g=z[g+h|0];h=y[b+12>>2];_b(b);w[f+60|0]=0;y[f+56>>2]=0;if(g>>>7-h&1){break j}}Uc(f+56|0,y[y[a+40>>2]+(e<<2)>>2]);break i}if(za(k,y[a+72>>2],f+52|0)){break c}if(za(k,y[a+76>>2],f+48|0)){break c}if(za(k,y[a+80>>2],f+44|0)){break c}if(za(k,y[a+84>>2],f+40|0)){break c}if(za(k,y[a+88>>2],f+36|0)){break c}ta(b);j=y[y[a+40>>2]+(e<<2)>>2];if(!j){break c}l=y[f+52>>2];h=l>>31;e=y[j+8>>2]+l|0;if(e>>>0>>0?h+1|0:h){break c}i=y[f+48>>2];g=i>>31;h=i+y[j+12>>2]|0;if(h>>>0>>0?g+1|0:g){break c}g=y[b+8>>2];Cb(f+8|0,l,2,y[f+44>>2]);Cb(f+28|0,i,2,y[f+40>>2]);if(!(w[f+32|0]&1)|z[f+12|0]!=1){break c}i=db();y[f+24>>2]=i;y[i+8>>2]=h;y[i+4>>2]=e;e=z[a+2|0];y[i+20>>2]=j;w[i|0]=e;y[i+12>>2]=y[f+8>>2];e=y[f+28>>2];j=0;w[i+1|0]=0;y[i+16>>2]=e;w[i+24|0]=z[a+92|0];w[i+25|0]=z[a+93|0];w[i+26|0]=z[a+94|0];w[i+27|0]=z[a+95|0];e=Ra(b);y[f+20>>2]=e;if(fc(Tc(f+56|0,cb(i,e,c,d)))){ta(b);e=y[b+8>>2];if(e>>>0<=4294967293){h=e+2|0;e=y[b+4>>2];e=e>>>0>h>>>0?h:e;y[b+8>>2]=e}j=y[f+36>>2]==(e-g|0)}ua(f+20|0);Ua(f+24|0);if(!j){break c}}e=f+56|0;if(fc(e)){i=y[Xa(e)+8>>2];e=Xa(e);p=y[a+56>>2];j=y[e+12>>2];l:{m:{l=z[a+3|0];if(!l){e=z[f+72|0];if((p&-2)!=2){break m}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=i-1|0;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(!g){break c}break l}e=z[f+72|0];n:{switch(p|0){default:if(!(e&1)){break c}break l;case 0:case 2:break n}}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=j-1|0;m=e;e=e+g|0;h=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(g){break l}break c}if(!(e&1)){break c}}g=y[f+76>>2];Rc(f+8|0,l,p,g,t,i,j);m=Xa(f+56|0);e=y[f+8>>2];h=e;i=e>>31;e=y[f+12>>2];Hb(m,n,h,i,e,e>>31,y[a+52>>2]);e=y[f+16>>2];if(e){h=g>>31;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;h=e;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;e=0;y[f+72>>2]=e|g;y[f+76>>2]=g?h:0}r=r+1|0}mb(f+56|0);e=0;continue}}break}y[f+124>>2]=0;e=n;break a}o()}mb(f+56|0)}e=0}Ua(f+116|0)}la(f+124|0);Y=f+128|0;return e}function Bd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;f=Y-112|0;Y=f;k=xa(y[a+8>>2],y[a+12>>2]);y[f+108>>2]=k;g=0;a:{if(!qa(k)){break a}o=y[e>>2];g=0;if(!Aa(o,b,f+104|0)){break a}t=y[e+36>>2];u=y[e+32>>2];v=y[e+28>>2];x=y[e+24>>2];A=y[e+20>>2];C=y[e+16>>2];D=y[e+12>>2];E=y[e+8>>2];F=y[e+4>>2];Qa(k,z[a+4|0]);y[f+100>>2]=y[f+104>>2];w[f+96|0]=1;p=Db(f+96|0,y[a+20>>2]);e=p;h=y[f+100>>2];g=0-h|0;y[e>>2]=z[e|0]&(h|0)!=-2147483648;y[e+4>>2]=g;y[f+92>>2]=0;w[f+88|0]=1;e=y[a+16>>2];b:{c:while(1){if(e>>>0>m>>>0){y[f+84>>2]=0;w[f+80|0]=1;if(!Aa(o,b,f+76|0)){break b}y[f+68>>2]=y[f+76>>2];e=1;w[f+64|0]=1;g=Db(f- -64|0,y[a+20>>2]);q=Vc(p,y[g>>2],y[g+4>>2]);while(1){d:{if(e&1){Aa(F,b,f+4|0);e=Na(f+88|0,y[f+4>>2]);g=y[e+4>>2];y[f+80>>2]=y[e>>2];y[f+84>>2]=g;break d}if(!Aa(E,b,f+4|0)){e=y[a+16>>2];continue c}Na(Na(f+80|0,y[f+4>>2]),w[a+5|0])}e=y[a+16>>2];if(m>>>0>=e>>>0){continue c}y[f+60>>2]=0;if(y[a+20>>2]!=1){Aa(D,b,f+60|0)}e=y[q+4>>2];if(!(y[q>>2]&1)){break b}g=y[f+60>>2];n=e+g|0;if(((e^n)&(g^n))<0){break b}Ac(t,b,f+56|0);e=y[f+56>>2];if(e>>>0>=B[a+24>>2]){break b}e:{f:{g:{h:{i:{if(!z[a+1|0]){y[f+52>>2]=0;w[f+48|0]=0;y[f+44>>2]=0;break i}Aa(C,b,f+52|0);g=y[f+52>>2];w[f+48|0]=0;y[f+44>>2]=0;if(g){break h}}Uc(f+44|0,y[y[a+40>>2]+(e<<2)>>2]);break g}Aa(A,b,f+40|0);Aa(x,b,f+36|0);Aa(v,b,f+32|0);Aa(u,b,f+28|0);h=y[y[a+40>>2]+(e<<2)>>2];if(!h){break f}i=y[f+40>>2];g=i>>31;e=y[h+8>>2]+i|0;if(e>>>0>>0?g+1|0:g){break f}j=y[f+36>>2];g=j>>31;l=j+y[h+12>>2]|0;g=l>>>0>>0?g+1|0:g;if((g|0)==1|g>>>0>1){break f}Cb(f+4|0,i,1,y[f+32>>2]);Cb(f+20|0,j,1,y[f+28>>2]);if(!(w[f+24|0]&1)|z[f+8|0]!=1){break f}g=db();y[f+16>>2]=g;y[g+8>>2]=l;y[g+4>>2]=e;e=z[a+2|0];y[g+20>>2]=h;w[g|0]=e;y[g+12>>2]=y[f+4>>2];e=y[f+20>>2];w[g+1|0]=0;y[g+16>>2]=e;w[g+24|0]=z[a+92|0];w[g+25|0]=z[a+93|0];w[g+26|0]=z[a+94|0];w[g+27|0]=z[a+95|0];Tc(f+44|0,cb(g,b,c,d));Ua(f+16|0)}i=0;e=f+44|0;if(!fc(e)){break e}l=y[Xa(e)+8>>2];e=Xa(e);j=y[a+56>>2];r=y[e+12>>2];j:{k:{l:{s=z[a+3|0];if(!s){e=z[f+80|0];if((j&-2)!=2){break l}if(!(e&1)){break j}g=y[f+84>>2];e=g>>31;h=l-1|0;g=g+h|0;h=h>>>0>g>>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}e=z[f+80|0];m:{switch(j|0){default:if(e&1){break k}break e;case 0:case 2:break m}}if(!(e&1)){break j}e=y[f+84>>2];g=e>>31;h=r-1|0;e=e+h|0;g=h>>>0>e>>>0?g+1|0:g;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}if(!(e&1)){break e}}g=y[f+84>>2];Rc(f+4|0,s,j,g,n,l,r);i=Xa(f+44|0);e=y[f+4>>2];h=e;j=e>>31;e=y[f+8>>2];Hb(i,k,h,j,e,e>>31,y[a+52>>2]);h=y[f+12>>2];if(h){e=g>>31;g=g+h|0;h=g>>>0>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;h=0;y[f+80>>2]=g|h;y[f+84>>2]=g?e:0}i=1;m=m+1|0;break e}y[f+80>>2]=0;y[f+84>>2]=0;break e}i=0}mb(f+44|0);e=0;if(i){continue}break}break b}break}y[f+108>>2]=0;g=k;break a}g=0}la(f+108|0);Y=f+112|0;return g}function eb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0;j=Y-32|0;Y=j;a:{b:{c:{if(!qa(a)){break c}k=y[a+12>>2];if((k|0)>=(b|0)){break c}g=y[a+16>>2];if((268435452/(g|0)|0)<(b|0)){break c}if((k|0)<0){break b}d=g>>31;q=se(g,d,k);k=Z;if((k|0)==1|k>>>0>1){break b}g=se(g,d,b);d=Z;if((d|0)==1|d>>>0>1){break b}d:{if(z[a+4|0]==1){k=y[a>>2];y[a>>2]=0;y[j+20>>2]=0;_c(a,j+20|0);y[j+28>>2]=0;if(!d&g>>>0>2147479550|d){break a}e:{if(!k){g=Ya(g);break e}if(!g){ma(k);g=0;break e}f:{if(g>>>0>4294967239){break f}m=g>>>0<=8?8:g+3&-4;d=m+8|0;g=k;r=g-4|0;i=r;f=y[i>>2];e=f+i|0;h=y[e>>2];g:{h:{i:{if((h|0)!=y[(e+h|0)-4>>2]){h=f+h|0;if(h>>>0>=d+16>>>0){f=y[e+4>>2];e=y[e+8>>2];y[f+8>>2]=e;y[e+4>>2]=f;f=d+i|0;e=h-d|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e|1;e=y[f>>2]-8|0;j:{if(e>>>0<=127){n=(e>>>3|0)-1|0;break j}h=H(e);n=((e>>>29-h^4)-(h<<2)|0)+110|0;if(e>>>0<=4095){break j}e=((e>>>30-h^2)-(h<<1)|0)+71|0;n=e>>>0>=63?63:e}e=n;h=e<<4;y[f+4>>2]=h+6080;h=h+6088|0;y[f+8>>2]=y[h>>2];y[h>>2]=f;y[y[f+8>>2]+4>>2]=f;h=y[1779];f=e&31;if((e&63)>>>0>=32){f=1<>>32-f}y[1778]=e|y[1778];y[1779]=f|h;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;e=1;break g}if(d>>>0>h>>>0){break i}d=y[e+4>>2];f=y[e+8>>2];y[d+8>>2]=f;y[f+4>>2]=d;y[i>>2]=h;y[(i+(h&-4)|0)-4>>2]=h;e=1;break g}if(f>>>0>=d+16>>>0){y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;i=d+i|0;d=f-d|0;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d|1;d=y[i>>2]-8|0;k:{if(d>>>0<=127){e=(d>>>3|0)-1|0;break k}f=H(d);e=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break k}d=((d>>>30-f^2)-(f<<1)|0)+71|0;e=d>>>0>=63?63:d}f=e;d=f<<4;y[i+4>>2]=d+6080;d=d+6088|0;y[i+8>>2]=y[d>>2];y[d>>2]=i;y[y[i+8>>2]+4>>2]=i;i=y[1779];d=f&31;if((f&63)>>>0>=32){f=1<>>32-d}y[1778]=e|y[1778];y[1779]=f|i;e=1;break g}e=1;if(d>>>0<=f>>>0){break h}}e=0}}if(e){break e}g=Ya(m);if(!g){break f}l=y[r>>2]-8|0;l=l>>>0>m>>>0?m:l;if(l){p(g,k,l)}ma(k);l=g}g=l}if(!g){break a}nb(a,g);Ha(j+28|0);break d}Da(j+20|0,a);k=y[j+20>>2];l=y[j+24>>2];nb(a,ab(g,1));Da(j+12|0,a);if(l>>>0>B[j+16>>2]){break b}if(!l){break d}p(y[j+12>>2],k,l)}y[a+12>>2]=b;Da(j+20|0,a);a=y[j+24>>2];if(q>>>0>a>>>0){break b}c=0-c|0;b=q+y[j+20>>2]|0;a=a-q|0;while(1){if((a|0)<=0){break c}w[b|0]=c;a=a-1|0;b=b+1|0;continue}}Y=j+32|0;return}o()}rb();o()}function nc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;f=Y-48|0;Y=f;v=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=v;a:{b:{if(!qa(v)){break b}c:{m=y[a+4>>2];if(!m){break c}n=y[a+8>>2];L=e?n:n&2147483647;e=e<<1;B=e+2448|0;G=e+2466|0;C=e+2442|0;H=e+2436|0;I=e+2430|0;M=e+2460|0;N=e+2454|0;O=e+2424|0;e=m-1|0;p=e>>>3|0;J=(e&7)+1|0;n=0;m=0;e=0;while(1){d:{e:{if((x|0)!=(L|0)){ja(f+36|0,v,x);r=y[f+40>>2];s=y[f+36>>2];if(z[a+1|0]!=1){t=e;break e}if(z[b|0]){break b}h=A[O>>1];if(h>>>0>=d>>>0){break c}t=0;h=ka(b,(h<<3)+c|0);if((h|0)==(e|0)){break e}y[f+32>>2]=r;y[f+28>>2]=s;y[f+24>>2]=m;y[f+20>>2]=n;t=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=t;t=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=t;Pa(f+8|0,f);e=e^h;break d}y[f+44>>2]=0;break a}f:{g:{h:{if(x>>>0<=1){i=0;k=0;l=(x|0)!=1;if(!l){if(!m){break c}k=z[n|0]}q=A[I>>1];g=A[H>>1]&k>>>q;while(1){if((i|0)!=(p|0)){if(!l){e=i+1|0;if(e>>>0>=m>>>0){break c}k=z[e+n|0]|k<<8}j=0;e=7;while(1){if((e|0)>=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}u=A[B>>1]&k>>>e+q|(A[C>>1]&g)<<1;h=ka(b,(g<<3)+c|0);g=u|h;j=h<>>0<=g>>>0){break c}u=A[B>>1]&h>>>l-e|(A[C>>1]&g)<<1;i=ka(b,(g<<3)+c|0);g=u|i;j=i<<7-e|j;e=e+1|0;continue}}if(!g|!m|(m-1>>>0

    >>0|p>>>0>r>>>0)|g-1>>>0

    >>0){break c}k=z[n|0];F=A[I>>1];K=A[N>>1];D=z[i|0]<>1]&k>>>F|D&A[M>>1];u=p+s|0;h=n;l=s;while(1){i:{E=D<<8;if((l|0)==(u|0)){break i}h=h+1|0;k=z[h|0]|k<<8;i=i+1|0;D=E|z[i|0]<=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}E=A[B>>1]&k>>>e+F|(A[G>>1]&D>>>e|(A[C>>1]&g)<<1);q=ka(b,(g<<3)+c|0);g=E|q;j=q<>>0<=g>>>0){break c}h=ka(b,(g<<3)+c|0);i=7-j|0;e=h<>1]&l>>>q-j|(A[G>>1]&E>>>i|(A[C>>1]&g)<<1));j=j+1|0;continue}}if(p>>>0>=r>>>0){break c}w[p+s|0]=j;break f}if(p>>>0>=r>>>0){break c}w[u|0]=e}e=t}x=x+1|0;i=n;g=m;n=s;m=r;continue}}o()}v=0}la(f+44|0);Y=f+48|0;return v}function ic(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{if(!z[a+1|0]){g=y[a+60>>2];break d}f=y[b+4>>2];if(z[f|0]){break a}h=y[c>>2];if(h>>>0>=B[b+12>>2]){break c}g=y[a+60>>2]^ka(f,y[b+8>>2]+(h<<3)|0);y[a+60>>2]=g}if(g){ed(a,y[y[b>>2]>>2]);break b}f=y[a+24>>2];if(f>>>0<=1){if((f|0)==1){if(!y[a+40>>2]){break c}j=z[y[a+36>>2]]}i=y[c+12>>2]&j>>>y[c+8>>2];h=(f|0)!=1;while(1){if((d|0)!=(k|0)){if(!h){f=k+1|0;if(f>>>0>=B[a+40>>2]){break c}j=z[f+y[a+36>>2]|0]|j<<8}g=7;l=0;while(1){if((g|0)>=0){f=y[b+4>>2];if(z[f|0]){break a}if(B[b+12>>2]<=i>>>0){break c}f=ka(f,y[b+8>>2]+(i<<3)|0);i=f|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+4>>2]&i)<<1);l=f<>2]<=k>>>0){break c}w[y[a+44>>2]+k|0]=l;k=k+1|0;continue}break}f=j<<8;g=0;l=0;while(1){if((e|0)!=(g|0)){h=y[b+4>>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}h=ka(h,y[b+8>>2]+(i<<3)|0);j=7-g|0;l=h<>2]&f>>>j+y[c+8>>2]|(y[c+4>>2]&i)<<1);g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=l;break b}if(!y[a+32>>2]|!y[a+40>>2]){break c}j=z[y[a+36>>2]];k=z[y[a+28>>2]]<>2];i=y[c+12>>2]&j>>>y[c+8>>2]|k&y[c+24>>2];f=0;while(1){e:{if((d|0)!=(f|0)){h=f+1|0;if(h>>>0>=B[a+32>>2]|h>>>0>=B[a+40>>2]){break c}k=z[h+y[a+28>>2]|0]<>2]|k<<8;j=z[h+y[a+36>>2]|0]|j<<8;g=7;l=0;while(1){if((g|0)<0){break e}m=y[b+4>>2];if(z[m|0]){break a}if(B[b+12>>2]<=i>>>0){break c}m=ka(m,y[b+8>>2]+(i<<3)|0);i=m|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+28>>2]&k>>>g|(y[c+4>>2]&i)<<1));l=m<>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}k=ka(h,y[b+8>>2]+(i<<3)|0);h=7-g|0;f=k<>2]&l>>>h+y[c+8>>2]|(y[c+28>>2]&j>>>h|(y[c+4>>2]&i)<<1));g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;break b}if(B[a+48>>2]<=f>>>0){break c}w[y[a+44>>2]+f|0]=l;f=h;continue}}o()}return 1}return 0}function pe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=Y-48|0;Y=c;m=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];g=y[y[b>>2]>>2];ja(c+40|0,g,y[a+24>>2]-1|0);ja(c+32|0,g,y[a+24>>2]-2|0);A=u+317736|0;n=y[c+36>>2];p=y[c+32>>2];d=y[a+24>>2];C=t>>>0>39717;q=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,g,d);h=y[c+36>>2];r=y[c+32>>2];y[c+40>>2]=r;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[m|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(m,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=r;y[c+28>>2]=h;y[c+8>>2]=r;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}i=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+36>>2];v=y[c+32>>2]}d=c+32|0;ja(d,g,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+19|0]|0);F=y[c+36>>2];G=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+21|0]|0);H=y[c+36>>2];I=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+23|0]|0);J=y[c+36>>2];K=y[c+32>>2];e=y[g+8>>2];i=!n|(e|0)<2?i:z[p|0]>>>6&1;i=!n|(e|0)<=0?i:z[p|0]>>>6&2|i;f=0;f=!j|(e|0)<3?f:z[k|0]>>>5&1;f=!j|(e|0)<2?f:z[k|0]>>>5&2|f;f=!j|(e|0)<=0?f:z[k|0]>>>5&4|f;s=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,x)){break h}}l=ia(e,w[a+16|0]+d|0,E,D);L=ia(e,w[a+18|0]+d|0,G,F);M=ia(e,w[a+20|0]+d|0,I,H);e=ia(e,w[a+22|0]+d|0,K,J);if(z[m|0]){break b}e=f<<5|i<<12|l<<4|L<<10|M<<11|e<<15|s;if(e>>>0>=t>>>0){break e}l=ka(m,(e<<3)+u|0);e=y[g+8>>2];if(!l){break h}La(e,d,r,h,1);e=y[g+8>>2];l=1;break g}l=0}i=ia(e,d+2|0,p,n)|i<<1&6;f=ia(e,d+3|0,k,j)|f<<1&30;d=d+1|0;s=s<<1&14|l;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;q=3}y[a+52>>2]=q;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;p=k;n=j;continue}break}q=-1}Y=c+48|0;return q|0} +function mc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=Y-48|0;Y=f;i=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=i;a:{b:{if(!qa(i)){break b}Qa(i,0);K=e|2;L=5-e|0;M=4-e|0;k=e>>>1|0;N=k^3;j=e<<1;O=j+2490|0;P=j+2484|0;Q=j+2478|0;R=j+2472|0;S=k^1;T=2-k|0;x=e&1;U=x+1|0;V=j+2424|0;j=0;k=0;while(1){c:{d:{e:{if(B[a+8>>2]>m>>>0){ja(f+36|0,i,m);t=y[f+40>>2];u=y[f+36>>2];if(z[a+1|0]!=1){n=g;break e}if(z[b|0]){break b}h=A[V>>1];if(h>>>0>=d>>>0){break d}n=0;h=ka(b,(h<<3)+c|0);if((h|0)==(g|0)){break e}y[f+32>>2]=t;y[f+28>>2]=u;y[f+24>>2]=k;y[f+20>>2]=j;n=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=n;n=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=n;g=g^h;i=y[f+44>>2];Pa(f+8|0,f);break c}y[f+44>>2]=0;break a}C=0;D=0;E=0;if(z[a+2|0]==1){ja(f+36|0,y[a+12>>2],m);E=y[f+40>>2];D=y[f+36>>2]}g=f+36|0;i=y[f+44>>2];ja(g,i,w[a+17|0]+m|0);W=y[f+40>>2];X=y[f+36>>2];F=0;G=0;H=0;I=0;J=0;if(!e){ja(g,i,w[a+19|0]+m|0);C=y[f+40>>2];F=y[f+36>>2];ja(g,i,w[a+21|0]+m|0);G=y[f+40>>2];H=y[f+36>>2];ja(g,i,w[a+23|0]+m|0);J=y[f+36>>2];I=y[f+40>>2]}h=y[i+8>>2];p=ia(h,U,r,s)|ia(h,x,r,s)<<1;p=!s|(e|0)!=1|(h|0)<=0?p:z[r|0]>>>5&4|p;q=ia(h,T,j,k)|ia(h,S,j,k)<<1;q=!k|e>>>0>1|(h|0)<=0?q:z[j|0]>>>5&4|q;v=0;g=0;while(1){if(B[a+4>>2]<=g>>>0){g=n;break c}f:{g:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],g,D,E)){break g}}if(z[b|0]){break b}l=q<>1]|v;if(!e){l=ia(h,w[a+18|0]+g|0,F,C)<<10|ia(h,w[a+20|0]+g|0,H,G)<<11|ia(h,w[a+22|0]+g|0,J,I)<<15|l}if(d>>>0<=l>>>0){break d}l=ka(b,(l<<3)+c|0);h=y[i+8>>2];if(!l){break g}La(h,g,u,t,1);h=y[i+8>>2];l=1;break f}l=0}p=(ia(h,g+K|0,r,s)|p<<1)&A[Q>>1];q=(ia(h,g+N|0,j,k)|q<<1)&A[P>>1];g=g+1|0;v=A[O>>1]&(l|v<<1);continue}}o()}m=m+1|0;r=j;s=k;j=u;k=t;continue}}i=0}la(f+44|0);Y=f+48|0;return i}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0;k=Y-16|0;Y=k;h=y[b+4>>2];l=y[b+12>>2];m=y[b+8>>2];n=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(k+8|0,n);d=y[k+12>>2];y[a+44>>2]=y[k+8>>2];y[a+48>>2]=d}a:{b:{c:{d=y[a+4>>2];if(!d){break c}r=m+3240|0;d=d-1|0;i=d>>>3|0;p=(d&7)+1|0;c=y[a+24>>2];s=l>>>0>405;while(1){d:{if(B[a+8>>2]<=c>>>0){c=4}else{e:{if(!z[a+1|0]){c=y[a+60>>2];break e}if(z[h|0]){break b}if(!s){break c}c=y[a+60>>2]^ka(h,r);y[a+60>>2]=c}f:{if(c){ed(a,n);break f}c=0;g=0;g:{if(!y[a+24>>2]){h:{while(1){e=7;f=0;if((g|0)==(i|0)){break h}i:{while(1){if((e|0)>=0){if(z[h|0]){break i}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<>2]<=g>>>0){break c}w[y[a+44>>2]+g|0]=f;g=g+1|0;continue}break}if(g>>>0>>0){break b}}e=0;f=0;while(1){if((e|0)==(p|0)){break g}if(z[h|0]){break b}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<<7-e|f;e=e+1|0;continue}}if(!y[a+40>>2]){break c}g=z[y[a+36>>2]];e=g>>>1&112;d=0;while(1){j:{if((d|0)!=(i|0)){j=d+1|0;if(j>>>0>=B[a+40>>2]){break c}g=z[j+y[a+36>>2]|0]|g<<8;c=7;f=0;while(1){if((c|0)<0){break j}if(z[h|0]){break b}if(e>>>0>=l>>>0){break c}q=ka(h,(e<<3)+m|0);e=q|(g>>>c+1&16|e<<1&1006);f=q<>>0>=l>>>0){break c}j=ka(h,(e<<3)+m|0);e=j|(d>>>8-c&16|e<<1&1006);f=j<<7-c|f;c=c+1|0;continue}break}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f;break f}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;d=j;continue}}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f}Kb(a,n);d=y[b+16>>2];if(!d){break d}if(!(_[y[y[d>>2]+8>>2]](d)|0)){break d}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c;break a}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}c=-1}Y=k+16|0;return c|0}function $d(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=Y-80|0;Y=g;w[g+72|0]=0;y[g+68>>2]=0;i=c+31>>>3&536870908;k=E(i,d);h=yd(k,1);y[g>>2]=0;j=g+68|0;nb(j,h);Ha(g);a:{b:{if(!qa(j)){break b}j=Nb(j);h=g+56|0;y[g+60>>2]=h;y[g+56>>2]=h;y[g+64>>2]=0;y[g+48>>2]=0;y[g+52>>2]=0;l=a;y[g+32>>2]=a;y[g+36>>2]=b;y[g>>2]=c;h=e;y[g+24>>2]=h;y[g+28>>2]=f;y[g+16>>2]=0;y[g+20>>2]=0;y[g+40>>2]=j;y[g+44>>2]=k;y[g+8>>2]=0;y[g+12>>2]=0;y[g+4>>2]=d;y[g+48>>2]=i;a=se(d,0,i);if(Z|a>>>0>k>>>0){break a}e=j;while(1){if((a|0)>0){w[e|0]=0;a=a-1|0;e=e+1|0;continue}break}a=b;b=g+56|0;a=zc(na(116),l,a,b,0);if(f){b=zc(na(116),h,f,b,1);y[g+76>>2]=0;zb(a,b);Ab(g+76|0)}e=c+7>>>3|0;y[g+76>>2]=0;f=g+52|0;zb(f,a);Ab(g+76|0);c:{d:{b=y[g+52>>2];a=y[b>>2];if(!a){break d}if(!yc(a)){break d}y[b+56>>2]=-1;a=0;break c}y[b+52>>2]=0;a=na(20);y[a+16>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;w[a+4|0]=0;y[a>>2]=0;e:{if((c|d)<0|i>>>0>268435452){break e}h=i<<3;if((h|0)<(c|0)|(!(!i|(d|0)<=0|k)|(2147483616/(h>>>0)|0)<(d|0))){break e}y[a+16>>2]=i;y[a+12>>2]=d;y[a+8>>2]=c;y[g+76>>2]=j;_c(a,g+76|0)}y[g+76>>2]=0;oa(b+32|0,a);la(g+76|0);w[b+50|0]=1;a=id(b)}f:{while(1){g:{a=a&1;h:{b=y[y[g+52>>2]+56>>2];if((b|0)!=4){break h}zb(g+52|0,0);b=-1;if(!a){break h}i:{b=E(y[g+48>>2],y[g+4>>2]);if(b>>>0>B[g+44>>2]){break i}a=y[g+40>>2];if(a&3){break i}c=(b&-4)+a|0;b=4;while(1){if((a|0)==(c|0)){break h}y[a>>2]=y[a>>2]^-1;a=a+4|0;continue}}o()}j:{switch(b-3|0){case 0:break j;case 1:break g;default:break f}}a=id(y[g+52>>2]);continue}break}X(Nb(g+68|0)|0,e|0,i|0,d|0)}Ab(f);if(!y[g+64>>2]){break b}a=y[g+60>>2];b=y[a>>2];c=y[y[g+56>>2]+4>>2];y[b+4>>2]=c;y[c>>2]=b;y[g+64>>2]=0;while(1){if((g+56|0)==(a|0)){break b}b=y[a+4>>2];oc(a);a=b;continue}}ub(g+68|0);Y=g+80|0;return}o()}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{while(1){if(a>>>0>4294967239){break b}b=y[1779];c=b;f=y[1778];a=a>>>0<=8?8:a+3&-4;c:{if(a>>>0<=127){d=(a>>>3|0)-1|0;break c}e=H(a);d=((a>>>29-e^4)-(e<<2)|0)+110|0;if(a>>>0<=4095){break c}e=((a>>>30-e^2)-(e<<1)|0)+71|0;d=e>>>0>=63?63:e}g=d;d=g&31;if((g&63)>>>0>=32){e=0;b=b>>>d|0}else{e=b>>>d|0;b=((1<>>d}if(b|e){while(1){d=e;d:{if(d|b){c=d-1|0;e=c+1|0;f=c;c=b-1|0;f=(c|0)!=-1?e:f;e=H(d^f);e=(e|0)==32?H(b^c)+32|0:e;c=63-e|0;Z=0-(e>>>0>63)|0;break d}Z=0;c=64}f=c;c=f&31;if((f&63)>>>0>=32){e=0;h=d>>>c|0}else{e=d>>>c|0;h=((1<>>c}g=f+g|0;b=g<<4;d=y[b+6088>>2];c=b+6080|0;e:{if((d|0)!=(c|0)){b=dc(d,a);if(b){break a}b=y[d+4>>2];f=y[d+8>>2];y[b+8>>2]=f;y[f+4>>2]=b;y[d+8>>2]=c;y[d+4>>2]=y[c+4>>2];y[c+4>>2]=d;y[y[d+4>>2]+8>>2]=d;g=g+1|0;b=(e&1)<<31|h>>>1;e=e>>>1|0;break e}j=y[1779];f=g&63;b=f;d=b&31;if(b>>>0>=32){b=0;c=-1>>>d|0}else{b=-1>>>d|0;c=b|(1<>>0>=32){b=c<>>32-d|b<>>0>=32){b=-1<>>32-b}k=c&-2;c=f&31;if(f>>>0>=32){f=0;c=b>>>c|0}else{f=b>>>c|0;c=((1<>>c}b=c|i;Z=d|f;y[1778]=y[1778]&b;y[1779]=Z&j;b=h^1}if(b|e){continue}break}f=y[1778];c=y[1779]}e=H(c);d=63-((e|0)==32?H(f)+32|0:e)|0;f:{if(!(c|f)){g=0;break f}b=d<<4;g=y[b+6088>>2];if(!c&f>>>0<1073741824){break f}e=98;c=b+6080|0;if((c|0)==(g|0)){break f}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((c|0)==(g|0)){break f}b=e;e=b-1|0;if(b){continue}break}}if(Fd(a+48|0)){continue}break}if(!g){break b}e=(d<<4)+6080|0;if((e|0)==(g|0)){break b}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((e|0)!=(g|0)){continue}break}}b=0}return b}function Ld(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=a<<3;o=c+7136|0;i=D[c+7168>>3];if(i!=0){l=D[o>>3];m=J(l,b);b=m-l;if(b<0x10000000000000000&b>=0){d=~~b>>>0;if(G(b)>=1){c=~~(b>0?I(K(b*2.3283064365386963e-10),4294967295):L((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(i<0x10000000000000000&i>=0){h=~~i>>>0;if(G(i)>=1){e=~~(i>0?I(K(i*2.3283064365386963e-10),4294967295):L((i-+(~~i>>>0>>>0))*2.3283064365386963e-10))>>>0}else{e=0}}else{e=0}a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(c){if(!h){break k}if(!e){break j}f=H(e)-H(c)|0;if(f>>>0<=31){break i}break c}if((e|0)==1|e>>>0>1){break c}Z=0;c=(d>>>0)/(h>>>0)|0;break a}if(!d){break h}if(!e|e-1&e){break g}c=c>>>ue(e)|0;Z=0;break a}if(!(h-1&h)){break f}k=(H(h)+33|0)-H(c)|0;j=0-k|0;break d}k=f+1|0;j=63-f|0;break d}Z=0;c=(c>>>0)/(e>>>0)|0;break a}f=H(e)-H(c)|0;if(f>>>0<31){break e}break c}if((h|0)==1){break b}h=ue(h);e=h&31;if((h&63)>>>0>=32){c=c>>>e|0}else{f=c>>>e|0;c=((1<>>e}Z=f;break a}k=f+1|0;j=63-f|0}f=k&63;g=f&31;if(f>>>0>=32){f=0;n=c>>>g|0}else{f=c>>>g|0;n=((1<>>g}j=j&63;g=j&31;if(j>>>0>=32){c=d<>>32-g|c<>>31;f=n<<1|c>>>31;g=s-(p+(f>>>0>j>>>0)|0)>>31;q=g&h;n=f-q|0;f=p-((e&g)+(f>>>0>>0)|0)|0;c=c<<1|d>>>31;d=r|d<<1;r=g&1;k=k-1|0;if(k){continue}break}}Z=c<<1|d>>>31;c=r|d<<1;break a}d=0;c=0}Z=c;c=d}d=Z;c=c+1|0;d=c?d:d+1|0;l=(+(c>>>0)+ +(d>>>0)*4294967296)*i+l;m=l-m}D[o>>3]=l;Q(a|0,+m)|0;a=(a|0)==2?27:(a|0)==1?26:14;c=a-1|0;l:{if(y[1780]>>>c&1){y[1782]=y[1782]|1<>2];if(c){_[c|0](a)}}}function ne(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;c=Y-48|0;Y=c;n=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);C=u+15528|0;l=y[c+36>>2];m=y[c+32>>2];e=y[a+24>>2];D=t>>>0>1941;p=4;a:{while(1){b:{c:{if(B[a+8>>2]>e>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,e);h=y[c+36>>2];q=y[c+32>>2];y[c+40>>2]=q;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){e=y[a+60>>2];break f}if(z[n|0]){break b}if(!D){break e}e=y[a+60>>2]^ka(n,C);y[a+60>>2]=e}if(e){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=q;y[c+28>>2]=h;y[c+8>>2]=q;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}f=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+32>>2];v=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);E=y[c+36>>2];F=y[c+32>>2];d=y[i+8>>2];f=!l|(d|0)<3?f:z[m|0]>>>5&1;f=!l|(d|0)<2?f:z[m|0]>>>5&2|f;f=!l|(d|0)<=0?f:z[m|0]>>>5&4|f;g=0;g=!j|(d|0)<3?g:z[k|0]>>>5&1;g=!j|(d|0)<2?g:z[k|0]>>>5&2|g;g=!j|(d|0)<=0?g:z[k|0]>>>5&4|g;s=0;e=0;while(1){if(B[a+4>>2]<=e>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],e,x,v)){break h}}d=ia(d,w[a+16|0]+e|0,F,E);if(z[n|0]){break b}d=g<<4|f<<9|d<<3|s;if(d>>>0>=t>>>0){break e}r=ka(n,(d<<3)+u|0);d=y[i+8>>2];if(!r){break h}La(d,e,q,h,1);d=y[i+8>>2];r=1;break g}r=0}A=e+3|0;f=ia(d,A,m,l)|f<<1&14;g=ia(d,A,k,j)|g<<1&30;e=e+1|0;s=s<<1&6|r;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;p=3}y[a+52>>2]=p;break a}e=y[a+24>>2]+1|0;y[a+24>>2]=e;m=k;l=j;continue}break}p=-1}Y=c+48|0;return p|0}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0;c=Y-48|0;Y=c;l=y[b+4>>2];s=y[b+12>>2];t=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);A=t+1832|0;m=y[c+36>>2];n=y[c+32>>2];d=y[a+24>>2];C=s>>>0>229;a:{while(1){b:{c:{if(B[a+8>>2]<=d>>>0){d=4}else{j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,d);f=y[c+36>>2];p=y[c+32>>2];y[c+40>>2]=p;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[l|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(l,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=p;y[c+28>>2]=f;y[c+8>>2]=p;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;u=0;v=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);v=y[c+32>>2];u=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];e=y[i+8>>2];g=!m|(e|0)<2?g:z[n|0]>>>6&1;g=!m|(e|0)<=0?g:z[n|0]>>>6&2|g;h=0;h=!j|(e|0)<2?h:z[k|0]>>>6&1;h=!j|(e|0)<=0?h:z[k|0]>>>6&2|h;r=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,u)){break h}}e=ia(e,w[a+16|0]+d|0,E,D);if(z[l|0]){break b}e=h<<3|g<<7|e<<2|r;if(e>>>0>=s>>>0){break e}q=ka(l,(e<<3)+t|0);e=y[i+8>>2];if(!q){break h}La(e,d,p,f,1);e=y[i+8>>2];q=1;break g}q=0}x=d+2|0;g=ia(e,x,n,m)|g<<1&6;h=ia(e,x,k,j)|h<<1&14;d=d+1|0;r=r<<1&2|q;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;d=3}y[a+52>>2]=d;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;n=k;m=j;continue}break}d=-1}Y=c+48|0;return d|0}function ec(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,C=0,D=0,E=0;k=((b&536870911)<<3|a>>>29)&-8;m=e;n=g;p=d;q=f;r=1;e=-1;a:{b:{c:while(1){j=r&1;u=j?326:325;v=j?1392:1056;w=j?325:326;x=j?1056:1392;d:while(1){A=e+1|0;t=e>>>3|0;C=t+q|0;D=1<<((e^-1)&7);d=y[c>>2];E=(e|0)<0;while(1){if(d>>>0>=k>>>0){break b}if(E){f=1}else{if(n>>>0<=t>>>0){break a}f=(z[C|0]&D)!=0}d=h;g=d;l=f^1;i=cc(q,n,d,A,l);s=d;e:{if((i|0)>=(d|0)){break e}f:{if((f|0)==(j|0)){l=f;break f}i=cc(q,n,h,i+1|0,f)}s=h;if((d|0)<=(i|0)){break e}g=i;s=cc(q,n,d,i+1|0,l)}d=s;g:{f=0;h:{if(Ka(a,b,c)){break h}if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}l=Ka(a,b,c);f=l?1:-1;if(i){break h}if(l){d=0;while(1){f=bc(x,w,a,b,c);d=f+d|0;if((f|0)>63){continue}break}d=(e>>>31|0)+d|0;if((d|0)<0){break b}f=d+e|0;if(!j){lb(p,m,h,e,f)}d=0;while(1){e=bc(v,u,a,b,c);d=e+d|0;if((e|0)>63){continue}break}if((d|0)<0){break b}e=d+f|0;if(j){lb(p,m,h,f,e)}if((e|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}if(Ka(a,b,c)){if(!j){lb(p,m,h,e,d)}e=d;if((d|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}d=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);f=i?2:-2;if(d){break h}d=y[c>>2];if(!i){break g}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c)?3:-3}d=f+g|0;if(!j){lb(p,m,h,e,d)}if((d|0)<=(e|0)|(d|0)>=(h|0)){break b}r=r^1;e=d;continue c}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c);d=y[c>>2];if(f){d=d+3|0;y[c>>2]=d;continue}break}break}break}y[c>>2]=d+5}return}o()}function uc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0;f=Y-32|0;Y=f;m=xa(y[a>>2],y[a+4>>2]);y[f+28>>2]=m;a:{if(!qa(m)){break a}Qa(m,z[a+20|0]);b:{while(1){if(!k&l>>>0>=B[a+36>>2]|k){y[f+28>>2]=0;d=m;break a}d=y[b>>2];g=y[b+4>>2];e=0;y[f+24>>2]=0;y[f+16>>2]=0;y[f+20>>2]=0;c=g-d|0;h=c>>2;c:{d:{if((d|0)==(g|0)){j=0;break d}if(h>>>0>=536870912){break c}j=na(c<<1);y[f+16>>2]=j;e=(h<<3)+j|0;y[f+24>>2]=e;c=j;while(1){if((c|0)!=(e|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}y[f+20>>2]=e}if(h>>>0>e-j>>3>>>0){break b}c=j;while(1){if((d|0)==(g|0)){e:{c=y[a+44>>2];d=se(l,k,A[a+48>>1]);e=c+d|0;q=e;c=Z+(c>>31)|0;r=d>>>0>e>>>0?c+1|0:c;c=y[a+40>>2];d=se(l,k,A[a+50>>1]);e=c+d|0;s=e;c=Z+(c>>31)|0;t=d>>>0>e>>>0?c+1|0:c;g=0;e=0;f:while(1){if(!e&B[a+32>>2]<=g>>>0|e){break e}i=y[b>>2];p=y[b+4>>2]-i>>2;c=0;d=0;while(1){h=c&255;if(h>>>0>=p>>>0){c=y[a+12>>2]-1|0;h=y[y[y[a+16>>2]>>2]+((c>>>0>>0?c:d)<<2)>>2];d=se(g,e,A[a+48>>1]);c=d+s|0;i=Z+t|0;d=c>>>0>>0?i+1|0:i;i=se(g,e,A[a+50>>1]);p=q-i|0;u=(d&255)<<24|c>>>8;n=d>>8;c=r-(Z+(i>>>0>q>>>0)|0)|0;d=c>>8;Hb(h,m,u,n,(c&255)<<24|p>>>8,d,y[a+24>>2]);g=g+1|0;e=g?e:e+1|0;continue f}else{n=(h<<3)+j|0;d=d|ia(y[y[i+(h<<2)>>2]+8>>2],g,y[n>>2],y[n+4>>2])<>2],l);e=y[f+12>>2];y[c>>2]=y[f+8>>2];y[c+4>>2]=e;c=c+8|0;d=d+4|0;continue}break}l=l+1|0;k=l?k:k+1|0;ya(f+16|0);continue}break}Ba()}o()}la(f+28|0);Y=f+32|0;return d}function sb(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;f=Y-16|0;Y=f;a:{j=xa(d,e);if(!qa(j)){break a}if(!qa(a)|(b|0)<0|(c|0)<0|y[a+8>>2]<=(b|0)){break a}g=y[a+12>>2];if((g|0)<=(c|0)){break a}b:{if(!(b&7)){d=y[a+16>>2];b=b>>>3|0;if(d>>>0<=b>>>0){break b}d=d-b|0;e=y[j+16>>2];d=d>>>0>>0?d:e;if(!d){break b}e=0;h=g-c|0;i=y[j+12>>2];h=(h|0)<(i|0)?h:i;h=(h|0)>0?h:0;while(1){if((e|0)==(h|0)){break a}ja(f+8|0,a,c+e|0);i=y[f+12>>2];if(i>>>0>>0|d>>>0>i-b>>>0){break b}i=y[f+8>>2];ja(f,j,e);if(d>>>0>B[f+4>>2]){break b}if(d){p(y[f>>2],b+i|0,d)}e=e+1|0;continue}}h=b>>>5|0;e=y[a+16>>2]>>>2|0;if(h>>>0>=e>>>0){break b}d=y[j+16>>2]>>>2|0;if(!d){break b}e=e-h|0;i=d>>>0>e>>>0?e:d;q=b&31;d=g-c|0;e=y[j+12>>2];d=(d|0)<(e|0)?d:e;r=(d|0)>0?d:0;s=b^-1;c:while(1){if((l|0)==(r|0)){break a}d=f+8|0;ja(d,a,c+l|0);e=y[f+8>>2];if(e&3){break b}g=y[f+12>>2]>>>2|0;if(g>>>0>>0){break b}y[f+12>>2]=g-h;y[f+8>>2]=e+(h<<2);Ca(f,j,l);if(B[f+4>>2]>>0){break b}e=y[f>>2];g=_a(d);d=y[f+8>>2];n=y[f+12>>2];k=i>>>0>n>>>0?n:i;if(k>>>0>B[f+12>>2]){break b}k=(k<<2)+e|0;g=te(g,24)&16711935|te(g&16711935,8);while(1)if((e|0)==(k|0)){if(i>>>0>n>>>0){d=g<>2]=u}l=l+1|0;continue c}else{m=g<>2];g=te(g&16711935,8)|te(g,24)&16711935;m=m|g>>>1>>>s;t=e,u=te(m&16711935,8)|te(m,24)&16711935,y[t>>2]=u;d=d+4|0;e=e+4|0;continue}}}o()}Y=f+16|0;return j}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;c=Y-48|0;Y=c;i=y[b+4>>2];q=y[b+12>>2];r=y[b+8>>2];h=y[y[b>>2]>>2];ja(c+40|0,h,y[a+24>>2]-1|0);u=r+3240|0;d=y[a+24>>2];v=q>>>0>405;j=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){k=y[c+44>>2];l=y[c+40>>2];ja(c+32|0,h,d);f=y[c+36>>2];m=y[c+32>>2];y[c+40>>2]=m;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[i|0]){break b}if(!v){break e}d=y[a+60>>2]^ka(i,u);y[a+60>>2]=d}if(d){y[c+20>>2]=k;y[c+16>>2]=l;y[c+24>>2]=m;y[c+28>>2]=f;y[c+8>>2]=m;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;s=0;t=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);t=y[c+36>>2];s=y[c+32>>2]}ja(c+32|0,h,y[a+24>>2]+w[a+17|0]|0);x=y[c+36>>2];A=y[c+32>>2];e=y[h+8>>2];g=!k|(e|0)<2?g:z[l|0]>>>6&1;g=!k|(e|0)<=0?g:z[l|0]>>>6&2|g;p=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,s,t)){break h}}e=ia(e,w[a+16|0]+d|0,A,x);if(z[i|0]){break b}e=g<<5|e<<4|p;if(e>>>0>=q>>>0){break e}n=ka(i,(e<<3)+r|0);e=y[h+8>>2];if(!n){break h}La(e,d,m,f,1);e=y[h+8>>2];n=1;break g}n=0}g=ia(e,d+2|0,l,k)|g<<1&30;d=d+1|0;p=p<<1&14|n;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;j=3}y[a+52>>2]=j;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;continue}break}j=-1}Y=c+48|0;return j|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=y[b+56>>2];d=y[b+60>>2];f=b+48|0;Hc(c,d,f);h=((d&536870911)<<3|c>>>29)&-8;if(h>>>0<=B[b+48>>2]){y[a>>2]=0;y[a+4>>2]=0;return}Ic(y[b+64>>2],y[b+68>>2]);i=b- -64|0;c=y[b+44>>2];a:{if((c|0)<0){e=y[b+64>>2];c=y[b+68>>2]-e|0;d=0;l=c;g=y[b+76>>2];c=y[b+80>>2]-g|0;ec(y[b+56>>2],y[b+60>>2],f,e|d,l,d|g,c,y[b+4>>2]);Gc(b+76|0,i);break a}if(!c){d=y[b+64>>2];c=y[b+68>>2]-d|0;Fc(y[b+56>>2],y[b+60>>2],f,d,c,y[b+4>>2]);break a}e=Ka(y[b+56>>2],y[b+60>>2],f);g=y[b+64>>2];c=y[b+68>>2]-g|0;d=y[b+56>>2];j=y[b+60>>2];b:{if(e){Fc(d,j,f,g,c,y[b+4>>2]);break b}l=d;d=0;e=c;k=y[b+76>>2];c=y[b+80>>2]-k|0;ec(l,j,f,d|g,e,d|k,c,y[b+4>>2])}Gc(b+76|0,i)}if(z[b+53|0]==1){Hc(y[b+56>>2],y[b+60>>2],f)}c:{d:{e:{if(z[b+52|0]!=1){break e}d=y[f>>2];if(h>>>0<=d>>>0){break e}e=d+7&-8;i=y[b+56>>2];g=y[b+60>>2];while(1){c=d>>>3|0;h=c+i|0;j=1<<((d^-1)&7);k=c>>>0>>0;c=1;f:{while(1){if(!c|d>>>0>=e>>>0){break f}if(!k){break d}if(z[h|0]&j){c=0;w[b+52|0]=0;continue}break}d=d+1|0;continue}break}if(!c){break e}y[f>>2]=e}c=y[b+64>>2];if(!z[b+54|0]){d=y[b+68>>2]-c|0;break c}if(c&3){break d}d=y[b+68>>2]-c|0;e=c+(d&-4)|0;b=c;while(1){if((b|0)==(e|0)){break c}y[b>>2]=y[b>>2]^-1;b=b+4|0;continue}}o()}y[a+4>>2]=d;y[a>>2]=c}function hd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Y-32|0;Y=d;i=y[a+24>>2];y[d+16>>2]=0;a:{b:{switch(z[a+3|0]){case 0:c=xd(a)?3:4;break a;case 1:c=wd(a)?5:6;break a;case 2:c=Qb(a)?7:8;break a;default:break b}}c=Qb(a)?9:10}e=Y-48|0;Y=e;y[e+24>>2]=0;if(c){y[e+16>>2]=0;y[e+12>>2]=c;y[e+8>>2]=2600;g=e+8|0;y[e+24>>2]=g}h=e+8|0;c:{if((h|0)==(d|0)){break c}c=y[d+16>>2];if((g|0)==(h|0)){if((d|0)==(c|0)){f=e+32|0;_[y[y[g>>2]+12>>2]](g,f);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=0;c=y[d+16>>2];_[y[y[c>>2]+12>>2]](c,h);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=0;y[e+24>>2]=h;_[y[y[e+32>>2]+12>>2]](f,d);_[y[y[e+32>>2]+16>>2]](f);y[d+16>>2]=d;break c}_[y[y[g>>2]+12>>2]](g,d);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=y[d+16>>2];y[d+16>>2]=d;break c}if((d|0)==(c|0)){f=e+8|0;_[y[y[c>>2]+12>>2]](c,f);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=y[e+24>>2];y[e+24>>2]=f;break c}y[e+24>>2]=c;y[d+16>>2]=g}gd(e+8|0);Y=e+48|0;c=y[y[b>>2]>>2];f=y[d+16>>2];y[d+28>>2]=b;if(f){f=_[y[y[f>>2]+24>>2]](f,a,d+28|0)|0;y[a+64>>2]=0;y[a+52>>2]=f;b=y[c+8>>2];y[a+68>>2]=i;y[a+72>>2]=b;y[a+76>>2]=y[a+24>>2];if((f|0)==4){y[a+24>>2]=0}gd(d);Y=d+32|0;return f}a=Fb(4);y[a>>2]=5228;P(a|0,5240,11);o()}function hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;d=Y-32|0;Y=d;h=xa(y[a+4>>2],y[a+8>>2]);y[d+8>>2]=h;Da(d,h);a:{l=y[d+4>>2];if(!l){oa(b,0);y[a+52>>2]=-1;break a}b:{f=y[h+16>>2];if((f|0)<0|!f){break b}j=y[c+12>>2]+(y[c+8>>2]<<3)|0;i=y[a+8>>2];n=y[a+4>>2];q=y[c>>2];r=y[c+4>>2];k=y[d>>2];y[d+20>>2]=0;y[d+12>>2]=0;y[d+16>>2]=0;g=d+12|0;y[d+24>>2]=g;jc(g,f);e=y[d+16>>2];g=f+e|0;while(1){if((e|0)!=(g|0)){w[e|0]=255;e=e+1|0;continue}break}w[d+28|0]=1;y[d+16>>2]=g;fd(d+24|0);m=y[d+12>>2];g=y[d+16>>2];y[d+24>>2]=j;j=0;s=(i|0)>0?i:0;e=0;g=g-m|0;t=e|m;while(1){if((j|0)!=(s|0)){i=k;e=f;if(l>>>0>>0){break b}while(1){if((e|0)>0){w[i|0]=255;e=e-1|0;i=i+1|0;continue}break}ec(q,r,d+24|0,k|u,f,t,g,n);if(f>>>0>g>>>0){break b}if(f){p(m,k,f)}j=j+1|0;l=l-f|0;k=f+k|0;continue}break}f=y[d+24>>2];g=d+12|0;ya(g);y[c+12>>2]=f&7;y[c+8>>2]=f>>>3;Da(g,h);e=y[d+12>>2];c=e+y[d+16>>2]|0;while(1)if((c|0)==(e|0)){y[a+64>>2]=0;y[a+52>>2]=4;c=y[h+8>>2];y[a+68>>2]=0;y[a+72>>2]=c;y[a+76>>2]=y[h+12>>2];y[d+8>>2]=0;oa(b,h);break a}else{w[e|0]=z[e|0]^-1;e=e+1|0;continue}}o()}la(d+8|0);Y=d+32|0}function ae(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=Y-16|0;Y=k;l=i?i:c;a:{if((l|0)<=0){break a}j=j?j:d;if((j|0)<=0|(j|l)>>>0>65535){break a}i=na(88);y[i+40>>2]=0;y[i+32>>2]=-1;y[i+36>>2]=0;y[i+20>>2]=1;y[i+24>>2]=1;y[i+16>>2]=j;y[i+12>>2]=l;y[i+8>>2]=j;y[i+4>>2]=l;y[i+56>>2]=a;y[i+60>>2]=b;w[i+54|0]=(h|0)!=0;w[i+53|0]=(f|0)!=0;w[i+52|0]=(g|0)!=0;y[i+48>>2]=0;y[i+44>>2]=e;y[i>>2]=2e3;a=l+31>>>3&16380;y[i+28>>2]=a;od(i- -64|0,a);od(i+76|0,y[i+28>>2]);e=c+7>>>3|0;W(E(e,d)|0);a=0;while(1){b:{if((a|0)==(d|0)){break b}c:{j=y[i+32>>2];b=a+1|0;if((j|0)==(b|0)){j=y[i+40>>2];c=y[i+36>>2];break c}d:{if(!((j|0)>=0&(a|0)>=(j|0))){j=0;if(!(_[y[y[i>>2]+12>>2]](i)|0)){break b}c=0;break d}c=1}while(1){if(!c){y[i+32>>2]=j;c=1;continue}e:{if((a|0)>(j|0)){_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[i+32>>2]+1|0;break e}_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[k+12>>2];c=y[k+8>>2];y[i+36>>2]=c;y[i+40>>2]=j;y[i+32>>2]=y[i+32>>2]+1;break c}c=0;continue}}if(!j){break b}V(c|0,e|0,E(a,e)|0);a=b;continue}break}_[y[y[i>>2]+4>>2]](i)}Y=k+16|0}function Fd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=y[1508];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=$()<<16>>>0){break b}if(R(a|0)|0){break b}}y[1516]=48;b=-1;break a}y[1508]=a}d=b;if((d|0)!=-1){a=d+c|0;y[a-4>>2]=16;f=a-16|0;y[f>>2]=16;b=y[1776];if(b){e=y[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=y[d-4>>2]&-2;g=d-e|0;h=y[g-4>>2];y[b+8>>2]=a;b=h&-2;a=g-b|0;if(y[(a+y[a>>2]|0)-4>>2]&1){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;y[a>>2]=b;break c}a=d-16|0;break d}y[d>>2]=16;y[d+8>>2]=a;y[d+4>>2]=b;y[d+12>>2]=16;y[1776]=d;a=d+16|0}b=f-a|0;y[a>>2]=b}y[((b&-4)+a|0)-4>>2]=b|1;c=y[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=H(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;y[a+4>>2]=c+6080;c=c+6088|0;y[a+8>>2]=y[c>>2];y[c>>2]=a;y[y[a+8>>2]+4>>2]=a;c=y[1779];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}y[1778]=e|y[1778];y[1779]=b|c}return(d|0)!=-1}function Bb(a,b){var c=0,d=0,e=0;c=Y+-64|0;Y=c;d=y[a>>2];e=y[d-8>>2];d=y[d-4>>2];a:{if(y[d+4>>2]==y[b+4>>2]){a=e?0:a;break a}e=a+e|0;if((e|0)<=(a|0)){y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=b;y[c+8>>2]=a;y[c+4>>2]=d;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+60>>2]=0;y[c+52>>2]=1;y[c+56>>2]=16777216;_[y[y[d>>2]+20>>2]](d,c+4|0,e,e,1,0);if(y[c+28>>2]){break a}}y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=5336;y[c+8>>2]=a;y[c+4>>2]=b;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;a=0;w[c+55|0]=0;w[c+56|0]=0;w[c+57|0]=0;w[c+58|0]=0;y[c+60>>2]=0;w[c+59|0]=1;_[y[y[d>>2]+24>>2]](d,c+4|0,e,1,0);b:{switch(y[c+40>>2]){case 0:a=y[c+44>>2]==1?y[c+32>>2]==1?y[c+36>>2]==1?y[c+24>>2]:0:0:0;break a;case 1:break b;default:break a}}if(y[c+28>>2]!=1){if(y[c+44>>2]|y[c+32>>2]!=1|y[c+36>>2]!=1){break a}}a=y[c+20>>2]}Y=c- -64|0;return a}function ud(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-32|0;Y=d;a:{b:{c:{d:{e:{c=y[a+4>>2];if(c>>>0>>0){g=b-c|0;f=y[a+8>>2];e=f<<5;if(!(g>>>0>e>>>0|c>>>0>e-g>>>0)){y[a+4>>2]=b;e=c&31;b=y[a>>2]+(c>>>3&536870908)|0;break b}y[d+16>>2]=0;y[d+8>>2]=0;y[d+12>>2]=0;if((b|0)<0){break e}c=2147483647;if(e>>>0<=1073741822){e=f<<6;b=b+31&-32;c=b>>>0>>0?e:b;if((c|0)<0){break e}}e=(c-1>>>5|0)+1|0;b=na(e<<2);y[d+24>>2]=0;y[d+28>>2]=0;y[d+8>>2]=b;y[d+20>>2]=0;y[d+16>>2]=e;y[d+24>>2]=0;Ob(d+20|0);e=y[a+4>>2];y[d+12>>2]=e+g;if((e|0)<=0){break d}f=y[a>>2];h=e>>>5|0;c=h<<2;if(!(!h|!c)){p(b,f,c)}b=(h<<2)+b|0;e=e&31;if(!e){break d}f=y[c+f>>2];c=y[b>>2];y[b>>2]=(f^c)&-1>>>32-e^c;break c}y[a+4>>2]=b;break a}Ba();o()}e=0}c=y[a>>2];y[a>>2]=y[d+8>>2];y[d+8>>2]=c;c=y[a+4>>2];y[a+4>>2]=y[d+12>>2];y[d+12>>2]=c;c=y[a+8>>2];y[a+8>>2]=y[d+16>>2];y[d+16>>2]=c;Ob(d+8|0)}Xc(b,e,g);Pb(d+20|0,b,e,g)}Y=d+32|0}function cc(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{b:{if((c|0)<=(d|0)){break b}h=e-1|0;c:{f=(d|0)/8|0;g=f<<3;if((g|0)!=(d|0)){if(b>>>0<=f>>>0){break a}f=(z[a+f|0]^h)&255>>>d-g;if(f){break c}f=(d+7|0)/8|0}g=(c+7|0)/8|0;d:{if((c|0)<57){break d}i=g-8|0;if((i|0)<=(f|0)){break d}d=e?1718:1726;while(1){if((f|0)>=(i|0)){break d}if(b>>>0>>0|b-f>>>0<=7){break a}e=a+f|0;if((z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24))!=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))|(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))!=(z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24))){break d}f=f+8|0;continue}}b=b>>>0>>0?f:b;d=(f|0)>(g|0)?f:g;e=h&255;while(1){if((d|0)==(f|0)){break b}if((b|0)==(f|0)){break a}g=z[a+f|0];if((g|0)!=(e|0)){a=z[((g^h)&255)+1734|0]+(f<<3)|0;return(a|0)>(c|0)?c:a}else{f=f+1|0;continue}}}c=g+z[f+1734|0]|0}return c}o()}function dc(a,b){var c=0,d=0,e=0,f=0,g=0;e=a+4|0;d=e+7&-8;c=y[a>>2];if(d+b>>>0<=(c+a|0)-4>>>0){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(y[a-4>>2]&-2)|0;e=d+y[f>>2]|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;c=c-d|0;y[a>>2]=c}a:{if(b+24>>>0<=c>>>0){e=a+b|0;c=(c-b|0)-8|0;y[e+8>>2]=c;g=e+8|0;y[(g+(c&-4)|0)-4>>2]=c|1;d=y[e+8>>2]-8|0;b:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break b}f=H(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;y[e+12>>2]=d+6080;d=d+6088|0;y[e+16>>2]=y[d>>2];y[d>>2]=g;y[y[e+16>>2]+4>>2]=g;d=y[1778];f=y[1779];e=c&31;if((c&63)>>>0>=32){c=1<>>32-e}y[1778]=g|d;y[1779]=c|f;c=b+8|0;y[a>>2]=c;b=(c&-4)+a|0;break a}b=a+c|0}y[b-4>>2]=c;a=a+4|0}else{a=0}return a}function ma(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=y[b>>2];c=f;d=b;e=y[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=y[d+4>>2];e=y[d+8>>2];y[c+8>>2]=e;y[e+4>>2]=c;c=a+f|0}a=b+f|0;b=y[a>>2];if((b|0)!=y[(a+b|0)-4>>2]){f=y[a+4>>2];a=y[a+8>>2];y[f+8>>2]=a;y[a+4>>2]=f;c=b+c|0}y[d>>2]=c;y[((c&-4)+d|0)-4>>2]=c|1;b=y[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=H(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;y[d+4>>2]=b+6080;b=b+6088|0;y[d+8>>2]=y[b>>2];y[b>>2]=d;y[y[d+8>>2]+4>>2]=d;b=y[1778];c=y[1779];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}y[1778]=e|b;y[1779]=a|c}}function ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Y-32|0;Y=d;g=(b<<3)+a|0;b=a;while(1){if((b|0)==(g|0)){a:{b=f+1|0;i=md(d+20|0,b);j=md(d+8|0,b);h=y[i>>2];b=a;while(1)if((b|0)==(g|0)){y[h>>2]=0;k=((f|0)>0?f:0)+1|0;l=y[j>>2];c=1;while(1){if((c|0)==(k|0)){c=k;break a}b=c<<2;e=b-4|0;y[d+4>>2]=y[e+l>>2];w[d|0]=1;if(z[Tb(Na(d,y[e+h>>2]))|0]!=1){break a}e=y[d+4>>2];y[b+l>>2]=e;b=a;while(1){if((b|0)!=(g|0)){if(y[b>>2]==(c|0)){y[b+4>>2]=e;e=e+1|0}b=b+8|0;continue}break}c=c+1|0;continue}}else{c=(y[b>>2]<<2)+h|0;y[c>>2]=y[c>>2]+1;b=b+8|0;continue}}}else{c=y[b>>2];f=(c|0)>(f|0)?c:f;b=b+8|0;continue}break}ya(j);ya(i);Y=d+32|0;return(c|0)>(f|0)}function za(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Y-16|0;Y=e;y[e+12>>2]=0;w[e+8|0]=1;h=-1;a:{b:while(1){if((wb(y[a>>2],e+4|0)|0)==-1){break a}d=Tb(e+8|0);if(z[d|0]!=1){break a}g=y[e+12>>2]|y[e+4>>2];f=(g|0)>=0;y[d>>2]=f;g=f?g:0;y[d+4>>2]=g;if(f){i=i+1|0;f=y[b+4>>2];d=0;while(1){if((d|0)==(f|0)){continue b}j=y[b+8>>2]+(d<<3)|0;if(y[j>>2]!=(i|0)|y[j+4>>2]!=(g|0)){d=d+1|0;continue}else{if((f-1|0)==(d|0)){h=1;if(w[b+1|0]&1){break a}}h=-1;f=y[a>>2];a=d<<2;if((Ia(f,y[a+y[b+20>>2]>>2],e+4|0)|0)==-1){break a}h=0;f=y[a+y[b+32>>2]>>2];a=y[e+4>>2];y[c>>2]=f+((y[b+4>>2]+(z[b+1|0]?-3:-2)|0)==(d|0)?0-a|0:a);break a}}}break}o()}Y=e+16|0;return h}function lb(a,b,c,d,e){var f=0,g=0,h=0;a:{d=(d|0)>0?d:0;f=(e|0)>=0?(c|0)<(e|0)?c:e:0;if((d|0)>=(f|0)){break a}b:{h=d>>>3|0;if(h>>>0>=b>>>0){break b}e=d&7;c=a+h|0;g=f-1|0;f=g>>>3|0;if((f|0)==(h|0)){a=g&7;while(1){if(a>>>0>>0){break a}w[c|0]=z[c|0]+(-1<<7-e);e=e+1|0;continue}}d=z[c|0];while(1)if((e|0)==8){w[c|0]=d;if(b>>>0<=f>>>0){break b}d=(g&7)+1|0;g=a+f|0;c=z[g|0];e=0;while(1)if((d|0)==(e|0)){w[g|0]=c;c=h+1|0;if(c>>>0>=f>>>0){break a}e=f+(h^-1)|0;if(e>>>0>b-c>>>0){break b}c=a+c|0;while(1){if((e|0)<=0){break a}w[c|0]=0;e=e-1|0;c=c+1|0;continue}}else{c=(-1<<7-e)+c|0;e=e+1|0;continue}}else{d=(-1<<7-e)+d|0;e=e+1|0;continue}}o()}}function ka(a,b){var c=0,d=0,e=0,f=0;c=y[b+4>>2];if(c>>>0<47){c=E(c,6);e=A[c+2080>>1];d=y[a+8>>2]-e|0;y[a+8>>2]=d;c=c+2080|0;f=y[a+4>>2];a:{if(d>>>0>f>>>16>>>0){if(d&32768){return z[b|0]}if(d>>>0>>0){d=z[b|0]^1;e=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=e;b=d&1;break a}y[b+4>>2]=z[c+2|0];b=z[b|0];break a}y[a+4>>2]=f-(d<<16);b:{if(d>>>0>>0){y[b+4>>2]=z[c+2|0];b=z[b|0];break b}d=z[b|0]^1;f=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=f;b=d&1}y[a+8>>2]=e}c=y[a+12>>2];while(1){if(!c){Dc(a);c=y[a+12>>2]}c=c-1|0;y[a+12>>2]=c;d=y[a+8>>2];y[a+8>>2]=d<<1;y[a+4>>2]=y[a+4>>2]<<1;if(!(d&16384)){continue}break}return b}o()}function xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{b:{c=y[a+4>>2];e=y[a>>2];g=c-e|0;h=g>>2;c:{if(h>>>0>>0){f=b-h|0;d=y[a+8>>2];if(f>>>0<=d-c>>2>>>0){b=(f<<2)+c|0;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b;return}if(b>>>0>=1073741824){break b}c=d-e|0;d=c>>1;d=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;if(d>>>0>=1073741824){break a}i=na(d<<2);b=i+g|0;f=b+(f<<2)|0;c=b;while(1){if((c|0)!=(f|0)){y[c>>2]=0;c=c+4|0;continue}break}b=b-(h<<2)|0;if(g){p(b,e,g)}y[a+8>>2]=(d<<2)+i;y[a+4>>2]=f;y[a>>2]=b;if(!e){break c}ma(e);return}if(b>>>0>=h>>>0){break c}y[a+4>>2]=(b<<2)+e}return}Ba();o()}jb();o()}function Td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(Sa(a,y[b>>2],e)){if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+32>>2]=d;b:{if(y[b+44>>2]==4){break b}x[b+52>>1]=0;a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,c,1,e);if(z[b+53|0]==1){y[b+44>>2]=3;if(!z[b+52|0]){break b}break a}y[b+44>>2]=4}y[b+20>>2]=c;y[b+40>>2]=y[b+40>>2]+1;if(y[b+36>>2]!=1|y[b+24>>2]!=2){break a}w[b+54|0]=1;return}a=y[a+8>>2];_[y[y[a>>2]+24>>2]](a,b,c,d,e)}}function kb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=y[a+4>>2];d=y[a>>2];e=c-d>>3;if(e>>>0>>0){g=b-e|0;f=y[a+8>>2];if(g>>>0<=f-c>>3>>>0){b=(g<<3)+c|0;while(1){if((b|0)!=(c|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}y[a+4>>2]=b;return}d=Bc(d,f,b);b=y[a+4>>2]-y[a>>2]|0;e=0;if(d){e=yb(d)}b=b+e|0;g=b+(g<<3)|0;c=b;while(1){if((c|0)!=(g|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}f=b;b=y[a>>2];c=y[a+4>>2]-b|0;f=f-c|0;if(c){p(f,b,c)}y[a+4>>2]=g;y[a>>2]=f;y[a+8>>2]=(d<<3)+e;if(!b){break a}ma(b);return}if(b>>>0>=e>>>0){break a}y[a+4>>2]=d+(b<<3)}}function ad(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>3;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>3>>>0){ld(a,d);return}if(b>>>0>=536870912){break a}h=d<<3;e=f;c=g-c|0;d=c>>2;f=c>>>0>=2147483640?536870911:b>>>0>>0?d:b;g=yb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;y[b+4>>2]=0;b=b+8|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<3);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<3)}return}Ba();o()}function Gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>2;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>2>>>0){kd(a,d);return}if(b>>>0>=1073741824){break a}h=d<<2;e=f;c=g-c|0;d=c>>1;f=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;g=Lb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;b=b+4|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<2);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<2)}return}Ba();o()}function Rc(a,b,c,d,e,f,g){y[a+8>>2]=0;a:{b:{if(!(b&255)){c:{switch(c|0){case 1:y[a+4>>2]=e;y[a>>2]=d;y[a+8>>2]=f-1;return;case 3:y[a+4>>2]=e;break a;case 0:y[a>>2]=d;y[a+8>>2]=f-1;y[a+4>>2]=(e-g|0)+1;return;case 2:break c;default:break b}}y[a+4>>2]=(e-g|0)+1;break a}d:{switch(c|0){case 1:y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g-1;return;case 3:y[a+4>>2]=d;y[a+8>>2]=g-1;y[a>>2]=(e-f|0)+1;return;case 0:y[a>>2]=e;y[a+4>>2]=(d-g|0)+1;return;case 2:break d;default:break b}}y[a+4>>2]=(d-g|0)+1;y[a>>2]=(e-f|0)+1}return}y[a>>2]=(d-f|0)+1}function bc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;k=((d&536870911)<<3|c>>>29)&-8;a:{b:while(1){c:{if(b>>>0<=f>>>0){break c}g=-1;i=z[a+f|0];if((i|0)==255){break a}h=y[e>>2];if(h>>>0>=k>>>0){break a}g=h>>>3|0;if(g>>>0>=d>>>0){break c}g=z[c+g|0];y[e>>2]=h+1;j=g>>>((h^-1)&7)&1|j<<1;f=f+1|0;h=f+E(i,3)|0;while(1){if((f|0)>=(h|0)){continue b}if(b>>>0<=f>>>0){break c}if(z[a+f|0]==(j|0)){c=f+1|0;if(c>>>0>=b>>>0){break c}d=b;b=f+2|0;if(d>>>0<=b>>>0){break c}g=z[a+c|0]|z[a+b|0]<<8;break a}else{f=f+3|0;continue}}}break}o()}return g}function Ia(a,b,c){var d=0,e=0,f=0,g=0;e=-1;g=y[a>>2];a:{f=y[a+8>>2];d=y[a+4>>2];if(f>>>0>=d>>>0){break a}b:{if((d|0)==536870912|d>>>0>536870912){break b}f=y[a+12>>2]+(f<<3)|0;if(f>>>0>(((d&536870911)<<3|g>>>29)&-8)>>>0){break a}y[c>>2]=0;g=y[a>>2];d=y[a+4>>2];if((d|0)==536870912|d>>>0>536870912){break b}d=((d&536870911)<<3|g>>>29)&-8;e=d>>>0>>0?d-f|0:b;while(1){if(!e){e=0;break a}b=y[a+8>>2];if(b>>>0>=B[a+4>>2]){break b}y[c>>2]=z[b+y[a>>2]|0]>>>7-y[a+12>>2]&1|y[c>>2]<<1;_b(a);e=e-1|0;continue}}o()}return e}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=Y-16|0;Y=f;i=ka(b,y[a>>2]+8|0);d=i|2;while(1){a:{if((e|0)==5){e=5;break a}g=ka(b,y[a>>2]+(d<<3)|0);d=g|d<<1;if(!g){break a}e=e+1|0;continue}break}g=0;e=e<<3;h=y[e+2364>>2];h=(h|0)>0?h:0;k=e+2364|0;e=0;while(1){if((e|0)!=(h|0)){j=ka(b,y[a>>2]+(d<<3)|0);d=j|d<<1;d=(d|0)>255?d&255|256:d;g=g<<1|j;e=e+1|0;continue}break}w[f+8|0]=1;y[f+12>>2]=y[k+4>>2];d=0;e=0;if(z[Na(f+8|0,g)|0]){a=y[f+12>>2];b=a>>31;d=i?b-(a^b)|0:a;e=!i|(d|0)!=0}y[c>>2]=d;Y=f+16|0;return e}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];d=y[b>>2];b=f-d|0;c=y[a>>2];if(b>>>0<=y[a+8>>2]-c>>>0){e=y[a+4>>2];g=e-c|0;if(b>>>0>g>>>0){if((c|0)!=(e|0)){if(g){p(c,d,g)}e=y[a+4>>2]}b=d+g|0;d=f-b|0;if(!(!d|(b|0)==(f|0))){p(e,b,d)}y[a+4>>2]=d+e;return a}if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c;return a}jd(a);e=Bc(y[a>>2],y[a+8>>2],b>>3);if(e>>>0>=536870912){break a}c=yb(e);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=c+(e<<3);if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c}return a}Ba();o()}function me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;f=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,f);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2560,g,h)){c=-1;break b}Kb(a,f);e=y[b+16>>2];c=y[a+24>>2];if(!e|(c>>>0)%50){break a}e=_[y[y[e>>2]+8>>2]](e)|0;c=y[a+24>>2];if(!e){break a}y[a+24>>2]=c+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=c+1|0;y[a+24>>2]=c;continue}}o()}function qe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){f=y[a+8>>2]&2147483647;c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(c>>>0>=f>>>0){c=4}else{if(!ic(a,b,2496,g,h)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function zc(a,b,c,d,e){var f=0,g=0;y[a>>2]=0;f=na(24);y[f+8>>2]=0;y[f+12>>2]=0;g=b;b=(c|0)==268435456|c>>>0<268435456;y[f>>2]=b?g:0;y[f+4>>2]=b?c:0;y[f+16>>2]=0;y[f+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a+4>>2]=f;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;c=na(64);y[a+36>>2]=c;b=c- -64|0;y[a+44>>2]=b;f=0;while(1){if((f|0)!=64){y[c+f>>2]=0;f=f+4|0;continue}break}y[a+52>>2]=10;w[a+49|0]=0;w[a+50|0]=0;w[a+48|0]=e;y[a+40>>2]=b;t(a+56|0,0,49);w[a+112|0]=0;y[a+108>>2]=d;return a}function Wc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=y[a+4>>2];d=y[a+8>>2];b:{if(c>>>0>>0){e=y[b>>2];y[b>>2]=0;y[c>>2]=e;b=c+4|0;break b}f=y[a>>2];e=c-f|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break a}d=d-f|0;g=d>>1;g=d>>>0>=2147483644?1073741823:c>>>0>>0?g:c;c:{if(!g){c=e;d=0;break c}d=Lb(g);f=y[a>>2];c=y[a+4>>2]-f|0;h=c>>2}i=y[b>>2];y[b>>2]=0;b=d+e|0;y[b>>2]=i;e=b-(h<<2)|0;if(c){p(e,f,c)}y[a+8>>2]=(g<<2)+d;b=b+4|0;y[a+4>>2]=b;y[a>>2]=e;if(!f){break b}ma(f)}y[a+4>>2]=b;return}Ba();o()}function zb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ac(c+80|0);ua(c+76|0);ua(c+72|0);Ja(c+60|0);b=y[c+36>>2];if(b){a=y[c+40>>2];while(1){if((a|0)!=(b|0)){a=pa(a-4|0);continue}break}y[c+40>>2]=b;ma(y[c+36>>2])}la(c+32|0);b=y[c+20>>2];if(b){a=y[c+24>>2];while(1){if((a|0)!=(b|0)){a=$b(a-4|0);continue}break}y[c+24>>2]=b;ma(y[c+20>>2])}b=y[c+8>>2];if(b){a=y[c+12>>2];while(1){if((a|0)!=(b|0)){a=ac(a-4|0);continue}break}y[c+12>>2]=b;ma(y[c+8>>2])}a=y[c+4>>2];y[c+4>>2]=0;if(a){ma(a)}ma(Ab(c))}}function oe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;f=c>>>3|0;g=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2528,f,g)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(y[b+4>>2]==5604){b=y[a+12>>2];a:{if(b){a=5592;if(Bb(b,5480)){break a}}a=5600}y[c>>2]=a;return 1}e=y[a+8>>2];b:{c:{if(!(e&24)){d=Bb(b,5432);if(!d){break c}c=1;if(!Sa(a,b,(y[d+8>>2]&24)!=0)){break c}break b}c=1;if(Sa(a,b,1)){break b}}c=0;b=Bb(b,5532);if(!b){break b}d=y[b+8>>2];if(d&(e^-1)&7|(d^-1)&e&96|y[y[a+12>>2]+4>>2]!=y[y[b+12>>2]+4>>2]){break b}c=y[y[a+16>>2]+4>>2]==y[y[b+16>>2]+4>>2]}return c|0}function Wb(a,b){var c=0,d=0,e=0,f=0,g=0;e=Y-16|0;Y=e;a:{b:{f=y[a+4>>2];if(f-1>>>0<=65534){g=y[a+8>>2];if(g-1>>>0<65535){break b}}y[a+52>>2]=4;a=4;break a}y[a+52>>2]=2;c=y[b>>2];d=y[c>>2];if(!d){d=xa(f,g);y[e+12>>2]=0;oa(c,d);la(e+12|0);d=y[c>>2]}if(!qa(d)){oa(c,0);y[a+52>>2]=-1;a=-1;break a}Qa(y[c>>2],0);y[a+60>>2]=0;x[a+56>>1]=1;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;a=hd(a,b)}Y=e+16|0;return a}function Ba(){var a=0,b=0,c=0,d=0;c=Fb(8);y[c>>2]=5828;a=4883;b=0;a:{if(!z[4883]){break a}b:{c:{while(1){a=a+1|0;if(!(a&3)){break c}if(z[a|0]){continue}break}break b}while(1){b=a;a=a+4|0;d=y[b>>2];if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}while(1){a=b;b=a+1|0;if(z[a|0]){continue}break}}b=a-4883|0}a=na(b+13|0);y[a+8>>2]=0;y[a+4>>2]=b;y[a>>2]=b;a=a+12|0;b=b+1|0;if(b){p(a,4883,b)}y[c>>2]=5876;y[c+4>>2]=a;P(c|0,5888,1);o()}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];e=y[b>>2];d=f-e|0;c=y[a+8>>2];b=y[a>>2];if(d>>>0<=c-b>>>0){g=y[a+4>>2];c=g-b|0;if(c>>>0>>0){if(!(!c|(b|0)==(g|0))){p(b,e,c)}Ec(a,c+e|0,f);return}if(!(!d|(e|0)==(f|0))){p(b,e,d)}y[a+4>>2]=b+d;return}if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;c=0}if((d|0)<0){break a}b=c<<1;jc(a,c>>>0>=1073741823?2147483647:b>>>0>d>>>0?b:d);Ec(a,e,f)}return}Ba();o()}function Dc(a){var b=0,c=0,d=0,e=0,f=0;e=255;b=y[a+16>>2];a:{if(z[a+1|0]==255){f=8;d=y[b+8>>2];c=d+1|0;if(c>>>0>=B[b+4>>2]){break a}c=z[c+y[b>>2]|0];if(c>>>0>143){break a}Cc(b);w[a+1|0]=c;y[a+4>>2]=(y[a+4>>2]-(c<<9)|0)+65024;b=y[a+16>>2];d=y[b+8>>2];f=7;break a}Cc(b);f=8;b=y[a+16>>2];d=y[b+8>>2];c=y[b>>2];e=B[b+4>>2]>d>>>0?z[c+d|0]:e;w[a+1|0]=e;y[a+4>>2]=(y[a+4>>2]-(e<<8)|0)+65280}y[a+12>>2]=f;if(B[b+4>>2]<=d>>>0){w[a|0]=1}}function Ib(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;f=b-1|0;g=y[d>>2];e=y[d+4>>2];a:{if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,b,g,e)|0)!=(c|0)){break a}h=b+1|0;if((ia(a,h,g,e)|0)!=(c|0)){break a}g=y[d+8>>2];e=y[d+12>>2];if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,h,g,e)|0)!=(c|0)){break a}e=f;f=y[d+16>>2];d=y[d+20>>2];if((ia(a,e,f,d)|0)!=(c|0)){break a}if((ia(a,b,f,d)|0)!=(c|0)){break a}i=(ia(a,h,f,d)|0)==(c|0)}return i}function ja(a,b,c){var d=0,e=0;d=Y-16|0;Y=d;a:{b:{c:{if(!(!(!qa(b)|(c|0)<0)&y[b+12>>2]>(c|0))){w[d+8|0]=0;break c}e=y[b+16>>2];if((e|0)<0){break b}c=se(e,0,c);if(Z){break b}y[d+8>>2]=c;e=1}w[d+12|0]=e;break a}o()}d:{e:{if(!z[d+12|0]){y[a>>2]=0;y[a+4>>2]=0;break e}Da(d,b);e=y[d+4>>2];c=y[d+8>>2];if(e>>>0>>0){break d}b=y[b+16>>2];if(b>>>0>e-c>>>0){break d}e=y[d>>2];y[a+4>>2]=b;y[a>>2]=c+e}Y=d+16|0;return}o()}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=a+8|0;t(d,0,36);b=E(b,12);c=y[b+3072>>2];y[a+4>>2]=c;w[a+1|0]=z[b+3064|0];ad(d,c);Gb(a+20|0,c);Gb(a+32|0,c);b=y[b+3068>>2];d=b+(c<<3)|0;g=y[a+32>>2];h=y[a+20>>2];c=y[a+8>>2];while(1){if((b|0)!=(d|0)){y[c+(e<<3)>>2]=z[b|0];f=e<<2;y[f+h>>2]=z[b+1|0];y[g+f>>2]=y[b+4>>2];b=b+8|0;e=e+1|0;continue}break}i=a,j=ob(c,y[a+12>>2]-c>>3),w[i|0]=j;return a}function bd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;La(y[b+8>>2],d,i,j,e);i=y[a+12>>2];j=y[c>>2];b=ia(y[b+8>>2],d+2|0,g,h);y[c+4>>2]=e;y[c>>2]=b|j<<1&2;e=y[c+8>>2];a=y[a+20>>2];b=(d-i|0)+2|0;k=c,l=ia(y[a+8>>2],b,y[f>>2],y[f+4>>2])|e<<1&2,y[k+8>>2]=l;d=y[c+12>>2];k=c,l=ia(y[a+8>>2],b,y[f+8>>2],y[f+12>>2])|d<<1&6,y[k+12>>2]=l;d=y[c+16>>2];k=c,l=ia(y[a+8>>2],b,y[f+16>>2],y[f+20>>2])|d<<1&6,y[k+16>>2]=l}function Fc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=((b&536870911)<<3|a>>>29)&-8;h=1;while(1){a:{if(B[c>>2]>=l>>>0){break a}i=h&1;n=i?325:326;g=i?1056:1392;j=0;while(1){k=bc(g,n,a,b,c);if((k|0)<0){while(1){if(B[c>>2]>=l>>>0){break a}if(!Ka(a,b,c)){continue}break}break a}j=j+k|0;if(k>>>0>63){continue}break}g=j+m|0;if(!i){lb(d,e,f,m,g)}h=h^1;m=g;if((f|0)>(g|0)){continue}}break}}function Pd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(!Sa(a,y[b>>2],e)){break a}if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+20>>2]=c;y[b+32>>2]=d;y[b+40>>2]=y[b+40>>2]+1;if(!(y[b+36>>2]!=1|y[b+24>>2]!=2)){w[b+54|0]=1}y[b+44>>2]=4}}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Y+-64|0;Y=d;a:{e=1;b:{if(y[a+4>>2]==y[b+4>>2]){break b}b=Bb(b,5384);e=0;if(!b){break b}e=y[c>>2];if(!e){break a}t(d+8|0,0,56);w[d+59|0]=1;y[d+16>>2]=-1;y[d+12>>2]=a;y[d+4>>2]=b;y[d+52>>2]=1;_[y[y[b>>2]+28>>2]](b,d+4|0,e,1);a=y[d+28>>2];if((a|0)==1){y[c>>2]=y[d+20>>2]}e=(a|0)==1}Y=d- -64|0;return e|0}Qc();o()}function Pc(a,b,c,d){w[a+53|0]=1;a:{if(y[a+4>>2]!=(c|0)){break a}w[a+52|0]=1;c=y[a+16>>2];b:{if(!c){y[a+36>>2]=1;y[a+24>>2]=d;y[a+16>>2]=b;if((d|0)!=1){break a}if(y[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=y[a+24>>2];if((c|0)==2){y[a+24>>2]=d;c=d}if(y[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}y[a+36>>2]=y[a+36>>2]+1}w[a+54|0]=1}}function Cd(a,b){var c=0,d=0,e=0;d=a,e=Fa(),y[d>>2]=e;d=a,e=Fa(),y[d+4>>2]=e;d=a,e=Fa(),y[d+8>>2]=e;d=a,e=Fa(),y[d+12>>2]=e;d=a,e=Fa(),y[d+16>>2]=e;d=a,e=Fa(),y[d+20>>2]=e;d=a,e=Fa(),y[d+24>>2]=e;d=a,e=Fa(),y[d+28>>2]=e;d=a,e=Fa(),y[d+32>>2]=e;c=na(16);w[c+12|0]=b;y[c+8>>2]=0;y[c>>2]=0;y[c+4>>2]=0;kb(c,1<>2]=c;return a}function kc(a){var b=0,c=0,d=0,e=0;b=Y-16|0;Y=b;c=na(20);w[c+4|0]=0;y[c>>2]=0;y[c+8>>2]=y[a+8>>2];d=y[a+12>>2];y[c+12>>2]=d;e=y[a+16>>2];y[c+16>>2]=e;Da(b+8|0,a);a:{b:{if(!y[b+12>>2]){break b}nb(c,td(e,d));Da(b,c);a=y[b+8>>2];e=0;d=y[b+12>>2];if(d>>>0>B[b+4>>2]){break a}if(!d|!(d|e)){break b}p(y[b>>2],a,d)}Y=b+16|0;return c}o()}function sd(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{if(!d){break a}if(e&1){f=b;g=d;if(c){e=32-c|0;f=d>>>0>>0?d:e;y[b>>2]=y[b>>2]|-1<>>e-f;g=d-f|0;f=b+4|0}i=g>>>5|0;e=i;h=f;while(1){if(e){y[h>>2]=-1;e=e-1|0;h=h+4|0;continue}break}e=g&31;if(!e){break a}f=(i<<2)+f|0;y[f>>2]=y[f>>2]|-1>>>32-e;break a}Xc(b,c,d)}Pb(a,b,c,d)}function ed(a,b){var c=0,d=0,e=0;c=Y-32|0;Y=c;a:{d=y[a+40>>2];if(d){e=y[a+48>>2];y[c+24>>2]=y[a+44>>2];y[c+28>>2]=e;b=y[b+16>>2];if(b>>>0>d>>>0){break a}a=y[a+36>>2];y[c+20>>2]=b;y[c+16>>2]=a;a=y[c+28>>2];y[c+8>>2]=y[c+24>>2];y[c+12>>2]=a;a=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=a;Pa(c+8|0,c)}Y=c+32|0;return}o()}function ra(a,b){var c=0,d=0,e=0,f=0,g=0;a:{d=y[a+8>>2];f=d+3|0;c=y[a+4>>2];if(f>>>0>>0){if(c>>>0<=d>>>0){break a}g=d+1|0;if(g>>>0>=c>>>0){break a}e=c;c=d+2|0;if(e>>>0<=c>>>0){break a}e=b;b=y[a>>2];y[e>>2]=z[b+g|0]<<16|z[b+d|0]<<24|z[b+c|0]<<8|z[b+f|0];y[a+8>>2]=y[a+8>>2]+4;a=0}else{a=-1}return a}o()}function dd(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],(y[b+16>>2]^-1)+c|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c-y[b+16>>2]|0);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],(c-y[b+16>>2]|0)+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function xa(a,b){var c=0,d=0;c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;w[c+4|0]=0;y[c>>2]=0;a:{if(a-2147483617>>>0<2147483680|(b|0)<=0){break a}d=a+31&2147483616;if(2147483616/(d>>>0)>>>0>>0){break a}y[c+12>>2]=b;y[c+8>>2]=a;a=d>>>3|0;y[c+16>>2]=a;nb(c,td(a,b))}return c}function Sa(a,b,c){var d=0;if(!c){return y[a+4>>2]==y[b+4>>2]}if((a|0)==(b|0)){return 1}c=y[a+4>>2];a=z[c|0];b=y[b+4>>2];d=z[b|0];a:{if(!a|(d|0)!=(a|0)){break a}while(1){d=z[b+1|0];a=z[c+1|0];if(!a){break a}b=b+1|0;c=c+1|0;if((a|0)==(d|0)){continue}break}}return(a|0)==(d|0)}function Pa(a,b){var c=0,d=0,e=0;a:{c=y[a+4>>2];b:{if(!c){break b}if(!y[b+4>>2]){a=y[a>>2];while(1){if((c|0)<=0){break b}w[a|0]=0;c=c-1|0;a=a+1|0;continue}}e=y[b>>2];d=y[b+4>>2];c=y[a>>2];b=0;if(1&B[a+4>>2]>>0){break a}if(!(b|d)|!d){break b}p(c,e,d)}return}o()}function Ad(a){var b=0,c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=lc();f=e+24|0;g=y[a+28>>2];c=y[a+24>>2];while(1){if((c|0)!=(g|0)){b=y[c>>2];if(b){b=kc(b)}else{b=0}y[d+12>>2]=b;b=d+12|0;Wc(f,b);c=c+4|0;la(b);continue}break}c=Sb(e,a);Sb(c+12|0,a+12|0);Y=d+16|0;return c}function Jb(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],c-1|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],c+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function Oc(a,b,c){var d=0;d=y[a+36>>2];if(!d){y[a+24>>2]=c;y[a+16>>2]=b;y[a+36>>2]=1;y[a+20>>2]=y[a+56>>2];return}a:{if(!(y[a+20>>2]!=y[a+56>>2]|y[a+16>>2]!=(b|0))){if(y[a+24>>2]!=2){break a}y[a+24>>2]=c;return}w[a+54|0]=1;y[a+24>>2]=2;y[a+36>>2]=d+1}}function Ra(a){var b=0,c=0,d=0,e=0;b=na(20);y[b+16>>2]=a;w[b|0]=0;c=255;d=y[a>>2];e=y[a+4>>2];a=y[a+8>>2];if(e>>>0>a>>>0){c=z[a+d|0]}w[b+1|0]=c;y[b+4>>2]=((c^-1)&255)<<16;Dc(b);y[b+8>>2]=32768;y[b+4>>2]=y[b+4>>2]<<7;y[b+12>>2]=y[b+12>>2]-7;return b}function Xc(a,b,c){var d=0,e=0;if(b){d=32-b|0;e=c>>>0>>0?c:d;y[a>>2]=y[a>>2]&(-1<>>d-e^-1);c=c-e|0;a=a+4|0}e=c>>>5|0;b=e;d=a;while(1){if(b){y[d>>2]=0;b=b-1|0;d=d+4|0;continue}break}b=c&31;if(b){a=(e<<2)+a|0;y[a>>2]=y[a>>2]&(-1>>>32-b^-1)}}function tb(a,b){var c=0;c=1;a:{if(ra(y[a+4>>2],b)){break a}if(ra(y[a+4>>2],b+4|0)){break a}if(ra(y[a+4>>2],b+8|0)){break a}if(ra(y[a+4>>2],b+12|0)){break a}if(va(y[a+4>>2],b+16|0)|(y[b>>2]>4096|y[b+4>>2]>4096)&z[a+112|0]==1){break a}c=0}return c}function zd(a,b,c){var d=0,e=0;d=na(32);e=y[b+12>>2];y[d+16>>2]=y[b+8>>2];y[d+20>>2]=e;e=y[b+4>>2];y[d+8>>2]=y[b>>2];y[d+12>>2]=e;b=y[c>>2];y[c>>2]=0;y[d>>2]=a;y[d+24>>2]=b;b=y[a+4>>2];y[d+4>>2]=b;y[b>>2]=d;y[a+4>>2]=d;y[a+8>>2]=y[a+8>>2]+1}function Ga(a,b,c){var d=0,e=0,f=0,g=0;d=y[b+8>>2];g=(d|0)>0?d:0;d=0;while(1){a:{if((d|0)==(g|0)){e=0;break a}e=Ma(a,y[y[b+12>>2]+(d<<2)>>2]);if(!(!e|(z[e+4|0]&63)!=53)){if((c|0)==(f|0)){break a}f=f+1|0}d=d+1|0;continue}break}return e}function Ub(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=b<<2;b=na(c);y[a>>2]=b;c=b+c|0;y[a+8>>2]=c;while(1){if((b|0)!=(c|0)){y[b>>2]=0;b=b+4|0;continue}break}y[a+4>>2]=c}return a}Ba();o()}function gb(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=Lb(b);y[a>>2]=c;b=(b<<2)+c|0;y[a+8>>2]=b;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b}return a}Ba();o()}function od(a,b){var c=0,d=0;c=Y-16|0;Y=c;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[c+8>>2]=a;if(b){jc(a,b);d=b;b=y[a+4>>2];d=d+b|0;while(1){if((b|0)!=(d|0)){w[b|0]=0;b=b+1|0;continue}break}y[a+4>>2]=d}w[c+12|0]=1;fd(c+8|0);Y=c+16|0}function Kc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)==255){a=Fb(4);y[a>>2]=5288;P(a|0,5300,2);o()}y[c+4>>2]=c+3;e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;a=_[y[(c+8|0)+(d<<2)>>2]](c+4|0,a)|0;Y=c+16|0;return a}function qb(){var a=0;a=na(80);x[a+56>>1]=0;y[a+12>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;return a}function Yb(){var a=0;a=na(96);y[a+44>>2]=0;y[a+48>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=0;y[a+84>>2]=0;y[a+88>>2]=0;return a}function La(a,b,c,d,e){a:{if(!(!d|(b|0)<0|(a|0)<=(b|0))){a=b>>>3|0;b=1<<((b^-1)&7);if(e){if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=b|z[a|0];return}if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=z[a|0]&(b^-1)}return}o()}function id(a){var b=0,c=0,d=0;y[a+56>>2]=2;c=1;b=4;d=y[a+52>>2];a:{b:{if((d|0)==5){break b}if((d|0)>=3){y[a+52>>2]=5;break b}b=yc(a);c=!b;if(y[a+56>>2]==3){break a}y[a+52>>2]=5;b=b?-1:4}y[a+56>>2]=b}return c}function se(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=E(e,d);f=c&65535;a=a&65535;g=E(f,a);d=(g>>>16|0)+E(d,f)|0;a=(d&65535)+E(a,e)|0;Z=h+E(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Ma(a,b){var c=0,d=0;c=y[a>>2];a:{if(c){c=Ma(c,b);if(c){break a}}d=y[a+12>>2];a=y[a+8>>2];while(1){if((a|0)==(d|0)){return 0}c=y[a>>2];a=a+4|0;if(y[c>>2]!=(b|0)){continue}break}}return c}function xd(a){var b=0;a:{if(z[a+16|0]!=3|z[a+17|0]!=255|(z[a+18|0]!=253|z[a+19|0]!=255)){break a}if(z[a+20|0]!=2|z[a+21|0]!=254|(z[a+22|0]!=254|z[a+23|0]!=254)){break a}b=z[a+2|0]^1}return b&1}function Wa(a,b){var c=0,d=0,e=0;a:{c=y[a+8>>2];e=c+1|0;d=y[a+4>>2];if(e>>>0>>0){if(c>>>0>=d>>>0){break a}d=b;b=y[a>>2];x[d>>1]=z[b+c|0]<<8|z[b+e|0];y[a+8>>2]=c+2;a=0}else{a=-1}return a}o()}function Kb(a,b){var c=0;c=y[a+40>>2];y[a+28>>2]=y[a+36>>2];y[a+32>>2]=c;c=y[a+48>>2];b=y[b+16>>2];if(c>>>0>>0){o()}y[a+40>>2]=c;y[a+48>>2]=c-b;c=y[a+44>>2];y[a+36>>2]=c;y[a+44>>2]=b+c}function cd(a,b,c,d,e,f,g,h){return y[c+16>>2]|y[c+12>>2]<<3|y[c+8>>2]<<6|ia(y[y[a+20>>2]+8>>2],w[a+26|0]+(d-y[a+12>>2]|0)|0,e,f)<<8|y[c+4>>2]<<9|y[c>>2]<<10|ia(b,w[a+24|0]+d|0,g,h)<<12}function sa(a,b){var c=0,d=0,e=0;d=Y-16|0;Y=d;e=b<<2;c=y[e+y[a+36>>2]>>2];if(!c){b=nd(na(44),b);c=y[a+36>>2];y[d+12>>2]=0;vb(c+e|0,b);pa(d+12|0);c=y[y[a+36>>2]+e>>2]}Y=d+16|0;return c}function bb(a,b){var c=0;c=y[a>>2];if(c){y[a+4>>2]=c;ma(c);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function Hc(a,b,c){var d=0,e=0;e=((b&536870911)<<3|a>>>29)&-8;d=y[c>>2];a:{while(1){if(B[c>>2]>=e>>>0){break a}if(!Ka(a,b,c)){continue}break}if(y[c>>2]-d>>>0>11){break a}y[c>>2]=d}}function Ed(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=536870912){break a}c=yb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<3)+c;ld(a,b)}return a}Ba();o()}function Jc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)!=255){e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;_[y[(c+8|0)+(d<<2)>>2]](c+7|0,a)}w[a+4|0]=255;Y=c+16|0}function Tc(a,b){var c=0;c=Y-16|0;Y=c;y[c+8>>2]=0;a:{if(z[a+4|0]==1){oa(a,b);break a}mb(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;la(c+12|0);la(c+8|0);Y=c+16|0;return a}function Db(a,b){var c=0;if(z[a|0]==1){c=y[a+4>>2];b=se(c,c>>31,b);c=Z;c=!(b- -2147483648>>>0<2147483648?c+1|0:c);b=c?b:0}else{b=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Ac(a,b,c){var d=0,e=0,f=0;d=1;while(1){e=z[a+12|0];if(e>>>0<=(f&255)>>>0){y[c>>2]=(-1<>2]+(d<<3)|0)|d<<1;f=f+1|0;continue}break}}function Hb(a,b,c,d,e,f,g){var h=0,i=0;h=Y-16|0;Y=h;if(qa(a)){i=y[a+12>>2];y[h+8>>2]=y[a+8>>2];y[h+12>>2]=i;y[h>>2]=0;y[h+4>>2]=0;Zc(a,b,c,d,e,f,g,h)}Y=h+16|0}function Cb(a,b,c,d){var e=0;e=Y-16|0;Y=e;y[e+12>>2]=d;d=1;w[e+8|0]=1;a:{if(!z[Na(e+8|0,b>>c)|0]){d=0;w[a|0]=0;break a}y[a>>2]=y[e+12>>2]}w[a+4|0]=d;Y=e+16|0}function qc(a){var b=0;b=y[a+36>>2];y[a+36>>2]=0;if(b){ma(Ja(b))}Ea(a+32|0);Ea(a+28|0);Ea(a+24|0);Ea(a+20|0);Ea(a+16|0);Ea(a+12|0);Ea(a+8|0);Ea(a+4|0);Ea(a)}function Qa(a,b){var c=0,d=0;c=Y-16|0;Y=c;Da(c+8|0,a);d=0-b|0;a=y[c+12>>2];b=y[c+8>>2];while(1){if((a|0)>0){w[b|0]=d;a=a-1|0;b=b+1|0;continue}break}Y=c+16|0}function md(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;if(b>>>0>=1073741824){Ba();o()}c=Lb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<2)+c;kd(a,b);return a}function pb(a,b){var c=0;c=y[a+4>>2];if(b){c=c+1|0;y[a+4>>2]=c}b=y[a+12>>2]-y[a+8>>2]>>3;if(b>>>0<=c>>>0){b=b+16|0;ad(a+8|0,b);Gb(a+20|0,b);Gb(a+32|0,b)}}function jc(a,b){var c=0;a:{if((b|0)>=0){if(b>>>0>2147479550){break a}c=Ya(b);if(!c){break a}y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=b+c;return}Ba();o()}rb();o()}function _c(a,b){var c=0;a:{if(!z[a+4|0]){c=y[b>>2];if((c|0)==y[a>>2]){break a}y[b>>2]=0;y[a>>2]=c;return}ub(a);c=y[b>>2];y[b>>2]=0;w[a+4|0]=0;y[a>>2]=c}}function Ud(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e);return}a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,d,e,f)}function Eb(a,b,c){a:{switch(a|0){case 1:return b&c;case 2:return b^c;case 3:return b^c^-1;default:o();case 0:b=b|c;break;case 4:break a}}return b}function wc(a){var b=0,c=0,d=0;c=E(z[a+1|0],y[a+4>>2]+1|0);if(c>>>0<=65535){d=z[a+2|0];b=qb();a=z[a|0];y[b+8>>2]=d;y[b+4>>2]=c;w[b|0]=a}return b}function Tb(a){var b=0,c=0,d=0;a:{if(z[a|0]!=1){break a}b=y[a+4>>2];if((b|0)<0){break a}c=b>>>0<1073741824;d=b<<1}y[a>>2]=c;y[a+4>>2]=d;return a}function Vc(a,b,c){var d=0;if(!(b&1)|z[a|0]!=1){b=0;c=0}else{b=y[a+4>>2];d=b;b=b+c|0;c=((d^b)&(b^c))>=0;b=c?b:0}y[a>>2]=c;y[a+4>>2]=b;return a}function ld(a,b){var c=0;c=y[a+4>>2];b=c+(b<<3)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}}function fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=y[a+4>>2];a=y[a+8>>2];b=(a>>1)+b|0;c=y[c>>2];if(a&1){d=y[d+y[b>>2]>>2]}return _[d|0](b,c)|0}function Da(a,b){var c=0,d=0;d=Nb(b);a:{c=y[b+16>>2];if((c|0)>=0){b=y[b+12>>2];b=se(b,b>>31,c);if(!Z){break a}}o()}y[a+4>>2]=b;y[a>>2]=d}function Sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(y[a+4>>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d);return}a=y[a+8>>2];_[y[y[a>>2]+28>>2]](a,b,c,d)}function vd(a,b,c,d){if(b>>>0<=d>>>0){b=(b<<2)+a|0;while(1){if((a|0)!=(b|0)){y[c>>2]=y[a>>2];c=c+4|0;a=a+4|0;continue}break}return}o()}function ia(a,b,c,d){a:{if(!d|(b|0)<0|(a|0)<=(b|0)){a=0}else{a=b>>>3|0;if(a>>>0>=d>>>0){break a}a=z[a+c|0]>>>((b^-1)&7)&1}return a}o()}function wb(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){y[b>>2]=z[d+c|0]>>>7-y[a+12>>2]&1;_b(a);a=0}else{a=-1}return a}function Yc(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c-b|0;c=((c^d)&(b^c))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Na(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c+b|0;c=((d^c)&(b^d))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function nb(a,b){var c=0;c=Y-16|0;Y=c;a:{if(z[a+4|0]==1){rc(a,b);break a}ub(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;Ha(c+12|0);Y=c+16|0}function $a(a){var b=0,c=0;b=y[a>>2];if(b){c=y[a+4>>2];while(1){if((c|0)!=(b|0)){c=la(c-4|0);continue}break}y[a+4>>2]=b;ma(y[a>>2])}}function va(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){w[b|0]=z[d+c|0];y[a+8>>2]=y[a+8>>2]+1;a=0}else{a=-1}return a}function re(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+6080|0;y[b+6084>>2]=c;y[b+6088>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Fd(48)}function Sc(a){a=a|0;var b=0,c=0,d=0;y[a>>2]=5828;b=y[a+4>>2];c=b-4|0;d=y[c>>2]-1|0;y[c>>2]=d;if((d|0)<0){ma(b-12|0)}return a|0}function kd(a,b){var c=0;c=y[a+4>>2];b=c+(b<<2)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;c=c+4|0;continue}break}}function Ca(a,b,c){var d=0;d=Y-16|0;Y=d;ja(d+8|0,b,c);b=y[d+8>>2];if(b&3){o()}c=y[d+12>>2];y[a>>2]=b;y[a+4>>2]=c>>>2;Y=d+16|0}function Ec(a,b,c){var d=0;d=y[a+4>>2];while(1){if((b|0)!=(c|0)){w[d|0]=z[b|0];d=d+1|0;b=b+1|0;continue}break}y[a+4>>2]=d}function Pb(a,b,c,d){a:{if((d|0)>=0){d=c+d|0;c=d>>>5|0;break a}d=c+d|0;c=(d-31|0)/32|0}y[a+4>>2]=d&31;y[a>>2]=(c<<2)+b}function Ka(a,b,c){var d=0;d=c;c=y[c>>2];y[d>>2]=c+1;d=b;b=c>>>3|0;if(d>>>0<=b>>>0){o()}return z[a+b|0]>>>((c^-1)&7)&1}function ta(a){var b=0,c=0;if(y[a+12>>2]){b=y[a+8>>2]+1|0;if(b){c=y[a+4>>2];y[a+8>>2]=b>>>0>>0?b:c}y[a+12>>2]=0}}function yd(a,b){var c=0;c=se(b,0,a);if(Z|c>>>0>2147479550){a=0}else{b=E(a,b);a=Ya(b);if(b?a:0){t(a,0,b)}}return a}function ib(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){pa(c+68|0);la(c- -64|0);Zb(c+60|0);Za(c+56|0);Ja(c+12|0);ma(c)}}function Bc(a,b,c){if(c>>>0>=536870912){Ba();o()}a=b-a|0;b=a>>2;return a>>>0>=2147483640?536870911:b>>>0>c>>>0?b:c}function pd(a,b){jd(a);y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function gd(a){var b=0;a:{b=a;a=y[a+16>>2];if((b|0)==(a|0)){b=16}else{if(!a){break a}b=20}_[y[b+y[a>>2]>>2]](a)}}function Vb(a,b){var c=0;c=y[a+52>>2];if((c|0)==3){if(A[a+56>>1]!=1){y[a+52>>2]=-1;return-1}c=hd(a,b)}return c}function ie(a){a=a|0;var b=0,c=0;b=na(12);y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c;return b|0}function _b(a){var b=0;b=y[a+12>>2];a:{if((b|0)==7){y[a+8>>2]=y[a+8>>2]+1;b=0;break a}b=b+1|0}y[a+12>>2]=b}function _a(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return y[c>>2]}function Uc(a,b){a:{b:{if(!z[a+4|0]){if(y[a>>2]!=(b|0)){break b}break a}mb(a);w[a+4|0]=0}y[a>>2]=b}}function Od(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e)}}function gc(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return c}function he(a,b){a=a|0;b=b|0;var c=0;y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c}function rd(a,b){var c=0;c=Y-16|0;Y=c;y[c+12>>2]=b;b=a+24|0;a=c+12|0;Wc(b,a);la(a);Y=c+16|0}function jd(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}}function Cc(a){var b=0,c=0;b=y[a+8>>2]+1|0;if(b){c=a;a=y[a+4>>2];y[c+8>>2]=a>>>0>b>>>0?b:a}}function tc(a,b,c,d,e,f,g,h){a:{if(!qa(a)){break a}if(!qa(f)){break a}Zc(f,a,b,c,d,e,h,g)}}function vb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ya(c+32|0);ya(c+20|0);ya(c+8|0);ma(c)}}function te(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d)}}function Jd(a){a=a|0;var b=0;b=y[a+60>>2];a=y[a+48>>2]+7>>>3|0;return(a>>>0>b>>>0?b:a)|0}function Ic(a,b){b=b-a|0;while(1){if((b|0)>0){w[a|0]=255;b=b-1|0;a=a+1|0;continue}break}}function Rb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+24|0);Ja(c+12|0);ma(Ja(c))}}function Fa(){var a=0;a=na(12);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;kb(a,512);return a}function Nc(a){a=a|0;y[a+36>>2]=0;y[a+40>>2]=0;ya(a+76|0);ya(a- -64|0);return a|0}function td(a,b){if(4294967295/(b>>>0)>>>0<=a>>>0){rb();o()}return ab(E(a,b),1)}function Lc(a,b){var c=0;return(z[a+16|0]!=(b|0)|z[a+17|0]!=255?c:z[a+2|0]^1)&1}function pc(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ya(b+40|0);ya(b+28|0);ma(b)}}function Id(a){a=a|0;Ic(y[a+76>>2],y[a+80>>2]);y[a+48>>2]=0;return 1}function Xb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+4|0);ma(c)}}function Ja(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}return a}function oa(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ub(c);ma(c)}}function $b(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}return a}function vc(a){var b=0;b=na(16);y[b>>2]=a;gb(b+4|0,a);return b}function ee(a,b){a=a|0;b=b|0;return(y[b+4>>2]==2888?a+4|0:0)|0}function Lb(a){if(a>>>0>=1073741824){jb();o()}return na(a<<2)}function yb(a){if(a>>>0>=536870912){jb();o()}return na(a<<3)}function jb(){var a=0;a=Fb(4);y[a>>2]=5724;P(a|0,5780,2);o()}function Ea(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(Ja(b))}}function na(a){a=Ya(a>>>0<=1?1:a);if(!a){Qc();o()}return a}function ya(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}}function Va(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ma(c)}}function fb(a,b,c,d,e,f,g){if(qa(a)){Hb(f,a,b,c,d,e,g)}}function Ua(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}}function ue(a){if(a){return 31-H(a-1^a)|0}return 32} +function db(){var a=0;a=na(28);y[a+20>>2]=0;return a}function ab(a,b){a=yd(a,b);if(!a){rb();o()}return a}function rc(a,b){var c=0;c=y[a>>2];y[a>>2]=b;ma(c)}function qd(a){var b=0;b=na(4);y[b>>2]=a;return b}function lc(){var a=0;a=na(36);t(a,0,36);return a}function rb(){y[(Y-16|0)+12>>2]=6036;sc();o()}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Oa(a,b,c,d){return(Eb(a,b,c)^c)&d^c}function Mb(a,b){a=a|0;b=b|0;return y[b>>2]}function ge(a){a=a|0;_[y[y[a>>2]+4>>2]](a)}function fd(a){if(!z[a+4|0]){ya(y[a>>2])}}function Zd(a){a=a|0;T();S(a+128|0);o()}function Ob(a){a=y[a>>2];if(a){ma(a)}}function Md(a){a=a|0;return y[a+4>>2]}function Gd(a){a=a|0;return Ya(a)|0}function Fb(a){return Ya(a|80)+80|0}function wa(a){return nd(na(44),a)}function ce(a,b){a=a|0;b=b|0;Ha(b)}function be(a,b){a=a|0;b=b|0;la(b)}function qa(a){return(Nb(a)|0)!=0}function fc(a){return(Xa(a)|0)!=0}function de(a){a=a|0;return 2868}function Yd(a){a=a|0;return 4890}function Xd(a){a=a|0;return 4864}function Xa(a){return Kc(a,4944)}function Nd(a){a=a|0;return 4913}function Nb(a){return Kc(a,2416)}function xb(a){a=a|0;return a|0}function pa(a){vb(a,0);return a}function oc(a){Za(a+24|0);ma(a)}function la(a){oa(a,0);return a}function ac(a){ib(a,0);return a}function Ab(a){zb(a,0);return a}function Mc(a){a=a|0;ma(Sc(a))}function Kd(a){a=a|0;ma(Nc(a))}function wd(a){return Lc(a,3)}function _d(a){a=a|0;sc();o()}function Qb(a){return Lc(a,2)}function $c(a,b){a=a|0;b=b|0}function Ta(a){a=a|0;ma(a)}function ub(a){Jc(a,4856)}function mb(a){Jc(a,4936)}function ua(a){Va(a,0)}function Zb(a){Xb(a,0)}function Za(a){Rb(a,0)}function Qc(){sc();o()}function Ha(a){rc(a,0)}function sc(){U();o()}function hc(a){a=a|0} +// EMSCRIPTEN_END_FUNCS +a=z;m(n);var _=[null,Sc,xb,qe,pe,oe,ne,me,le,ke,je,xb,Nc,Kd,Jd,Id,Hd,Mb,Mb,xb,Ta,ie,he,hc,ge,fe,ee,de,$c,ce,$c,be,Mb,Mb,Zd,_d,Ta,Yd,Ta,Xd,xb,Ta,hc,hc,Wd,Ta,Qd,Ta,Nd,Mc,Md,Mc,Ta,Vd,Od,Pd,Rd,Ta,Ud,Td,Sd];function $(){return v.byteLength>>16}function ea(fa){fa=fa|0;var aa=$()|0;var ba=aa+fa|0;if(aa{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);uncaughtExceptionCount++;abort()};var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _createImageData(size){Module.imageData=new Uint8Array(size)}var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,_ccitt_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["l"];_free=Module["_free"]=wasmExports["m"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["n"];_ccitt_decode=Module["_ccitt_decode"]=wasmExports["o"];__emscripten_timeout=wasmExports["p"];memory=wasmMemory=wasmExports["j"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,f:__abort_js,e:__emscripten_runtime_keepalive_clear,b:__setitimer_js,h:_createImageData,c:_emscripten_resize_heap,d:_proc_exit,i:_setImageData,g:_setLineData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default JBig2; diff --git a/web/public/vendor/pdfjs/wasm/openjpeg.wasm b/web/public/vendor/pdfjs/wasm/openjpeg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5acce73fd95c1baa3aa68cfe9d29aa3f97b7ce18 GIT binary patch literal 252032 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 literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/wasm/openjpeg_nowasm_fallback.js b/web/public/vendor/pdfjs/wasm/openjpeg_nowasm_fallback.js new file mode 100644 index 00000000..0df96aed --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/openjpeg_nowasm_fallback.js @@ -0,0 +1,17 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function OpenJPEG(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(Aa){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function za(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=94240;var oa=0;var pa=0;var qa=0; +// EMSCRIPTEN_START_FUNCS +function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=O(0),ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0;Y=na-96|0;na=Y;C=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){g=N(H[C+16>>2]-H[C+8>>2]|0,H[C+20>>2]-H[C+12>>2]|0)<<2;c=Ia(g);H[C+60>>2]=c;if(!c){Ba(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!g){break c}y(c,0,g);break c}c=H[C+60>>2];if(!c){break c}Ca(c);H[C+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}oa=H[a+16>>2];c=H[oa+28>>2]+N(H[oa+24>>2],152)|0;va=H[c-152>>2];wa=H[c-144>>2];pa=H[a+20>>2];qa=H[a+12>>2];ua=H[a+4>>2];d=a+28|0;d:{q=H[b+4>>2];f=0;e:{if((q|0)<=0){break e}k=H[b>>2];c=0;f:{while(1){g=k+N(c,12)|0;if(!H[g>>2]){break f}c=c+1|0;if((q|0)!=(c|0)){continue}break}f=0;break e}f=H[g+4>>2]}if(f){break d}f=Ea(1,156);if(!f){Ba(H[a+32>>2],1,6313,0);break b}H[f+140>>2]=0;c=0;k=H[b+4>>2];g:{if((k|0)==2147483647){break g}g=H[b>>2];if((k|0)>0){while(1){q=g+N(c,12)|0;if(!H[q>>2]){k=H[q+8>>2];if(k){ra[k|0](H[q+4>>2]);g=H[b>>2]}b=g+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=f;c=1;break g}c=c+1|0;if((k|0)!=(c|0)){continue}break}}g=Ha(g,N(k,12)+12|0);c=0;if(!g){break g}H[b>>2]=g;c=H[b+4>>2];g=g+N(c,12)|0;H[g+8>>2]=15;H[g+4>>2]=f;H[g>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ba(H[a+32>>2],1,8338,0);b=H[f+116>>2];if(b){Ca(b);H[f+116>>2]=0}b=H[f+120>>2];if(b){Ca(b);H[f+120>>2]=0}Ca(H[f+148>>2]);Ca(f);break b}H[f+144>>2]=H[a+24>>2];E=H[a+40>>2];_=H[a+36>>2];S=H[a+32>>2];j=H[pa+808>>2];b=H[qa+16>>2];h:{V=H[pa+16>>2];i:{if(V&64){k=na-304|0;na=k;j:{if(j){if(_){Ba(S,1,3219,0);break j}Ba(S,1,3219,0);break j}i=H[f+116>>2];c=H[C+20>>2]-H[C+12>>2]|0;b=H[C+16>>2]-H[C+8>>2]|0;g=N(c,b);k:{l:{if(g>>>0>K[f+132>>2]){Ca(i);j=g<<2;i=Ia(j);H[f+116>>2]=i;if(!i){i=0;break j}H[f+132>>2]=g;break l}if(!i){break k}j=g<<2}if(!j){break k}y(i,0,j)}i=H[f+120>>2];m:{if(K[f+136>>2]>2639){break m}Ca(i);i=Ia(10560);H[f+120>>2]=i;if(i){break m}i=0;break j}H[f+136>>2]=2640;y(i,0,10560);H[f+128>>2]=c;H[f+124>>2]=b;n=H[C+24>>2];if(!n){i=1;break j}q=H[C+28>>2];i=1;n:{o:{p:{q:{j=H[C+52>>2];r:{if(j){g=j&3;c=H[C+4>>2];i=0;s:{if(j>>>0>=4){b=j&-4;while(1){o=c+(i<<3)|0;h=H[o+28>>2]+(H[o+20>>2]+(H[o+12>>2]+(H[o+4>>2]+h|0)|0)|0)|0;i=i+4|0;z=z+4|0;if((b|0)!=(z|0)){continue}break}if(!g){break s}}while(1){h=H[(c+(i<<3)|0)+4>>2]+h|0;i=i+1|0;l=l+1|0;if((g|0)!=(l|0)){continue}break}}if(!H[f+144>>2]&(j|0)==1){break o}if(K[f+152>>2]>=h>>>0){break r}z=Ha(H[f+148>>2],h);if(z){break q}i=0;break j}if(!H[f+144>>2]){break j}}z=H[f+148>>2];if(z){break p}i=0;break j}H[f+152>>2]=h;H[f+148>>2]=z}if(!H[C+52>>2]){h=0;break n}j=H[C+4>>2];h=0;i=0;while(1){g=i<<3;c=g+j|0;b=H[c+4>>2];if(b){B(h+z|0,H[c>>2],b)}j=H[C+4>>2];h=H[(g+j|0)+4>>2]+h|0;i=i+1|0;if(i>>>0>2]){continue}break}break n}z=H[H[C+4>>2]>>2]}i=0;j=0;c=H[C+40>>2];g=0;t:{if(!c){break t}b=H[C>>2];j=H[b+8>>2];g=0;if((c|0)==1){break t}g=H[b+32>>2]}c=n-q|0;j=g+j|0;u:{if(!j){l=0;break u}i=1;b=H[C>>2];p=H[b>>2];l=0;if((j|0)==1){i=0;break u}l=H[b+24>>2]}P=c+1|0;ha=H[f+116>>2];s=H[f+120>>2];X=H[C+12>>2];x=H[C+20>>2];ca=H[C+8>>2];D=H[C+16>>2];v:{w:{x:{y:{z:{A:{B:{C:{if(!(!i|l)){if(!_){break C}Ba(S,2,10806,0);j=1;break B}if(j>>>0<4){break B}if(_){H[k+112>>2]=j;Ba(S,1,9590,k+112|0);break v}H[k+96>>2]=j;Ba(S,1,9590,k+96|0);i=0;break j}Ba(S,2,10806,0);i=H[C+24>>2];if(i>>>0>30){break A}e=1;if(i>>>0>=P>>>0){break y}break w}i=H[C+24>>2];if(i>>>0<=30){break z}if(!_){break A}H[k+32>>2]=H[C+24>>2];Ba(S,1,12302,k+32|0);break v}H[k>>2]=i;Ba(S,1,12302,k);i=0;break j}if(i>>>0

    >>0){break x}if(j>>>0<2){e=j;break y}if((i|0)!=(P|0)){e=j;break y}e=1;if(I[26384]){break y}if(!_){F[26384]=1;H[k+64>>2]=j;Ba(S,2,10299,k- -64|0);break y}if(!I[26384]){F[26384]=1;H[k+80>>2]=j;Ba(S,2,10299,k+80|0)}}if(!(!(p>>>0<2|h>>>0

    >>0)&l+p>>>0<=h>>>0)){if(_){i=0;Ba(S,1,9532,0);break j}i=0;Ba(S,1,9532,0);break j}U=p+z|0;b=I[U-1|0];i=b<<4|I[U-2|0]&15;if(!(!(i>>>0<2|(b|0)==255)&(i|0)<=(p|0))){if(_){i=0;Ba(S,1,15305,0);break j}i=0;Ba(S,1,15305,0);break j}sa=H[C+28>>2];H[k+272>>2]=0;H[k+280>>2]=0;H[k+264>>2]=0;H[k+268>>2]=0;H[k+296>>2]=0;H[k+300>>2]=0;H[k+284>>2]=0;H[k+288>>2]=0;b=i-1|0;H[k+276>>2]=b;o=(p+z|0)-i|0;H[k+256>>2]=o;q=I[o|0];c=8;H[k+272>>2]=8;j=o+1|0;H[k+256>>2]=j;g=i-2|0;H[k+276>>2]=g;n=(b|0)==1?q|15:q;b=0;q=b;H[k+264>>2]=n;H[k+268>>2]=b;H[k+280>>2]=!b&(n|0)==255;u=o&3;D:{E:{if((u|0)==3){break E}v=0;if(!((n|0)!=255|(b|0)!=0|I[j|0]<=143)){break D}b=255;b=i>>>0>=3?I[j|0]:b;h=i-3|0;H[k+276>>2]=h;o=!q&(n|0)==255;c=o?15:16;H[k+272>>2]=c;R=j+(i>>>0>2)|0;H[k+256>>2]=R;b=(g|0)==1?b|15:b;g=0;H[k+280>>2]=!g&(b|0)==255;g=b;j=n;b=o?7:8;o=b&31;if((b&63)>>>0>=32){m=j<>>32-o|q<>2]=n;H[k+268>>2]=b;if((u|0)==2){break E}o=255;v=0;if(!((g|0)!=255|(r|0)!=0|I[R|0]<=143)){break D}o=i>>>0>=4?I[R|0]:o;j=i-4|0;H[k+276>>2]=j;R=R+(i>>>0>3)|0;H[k+256>>2]=R;b=(h|0)==1?o|15:o;o=0;m=o;H[k+280>>2]=!m&(b|0)==255;o=!r&(g|0)==255;c=(o?7:8)+c|0;H[k+272>>2]=c;g=b;h=n;b=o?7:8;r=b&31;if((b&63)>>>0>=32){o=h<>>32-r|q<>2]=n;H[k+268>>2]=b;if((u|0)==1){break E}v=0;if(!((g|0)!=255|(m|0)!=0|I[R|0]<=143)){break D}b=255;b=i>>>0>=5?I[R|0]:b;H[k+276>>2]=i-5;H[k+256>>2]=R+(i>>>0>4);o=0;b=(j|0)==1?b|15:b;H[k+280>>2]=1&(b|0)==255;g=!m&(g|0)==255;c=(g?7:8)+c|0;H[k+272>>2]=c;j=n;g=g?7:8;h=g&31;if((g&63)>>>0>=32){E=j<>>32-h|q<>2]=n;H[k+268>>2]=b}b=n;c=64-c|0;g=c&31;if((c&63)>>>0>=32){w=b<>>32-g|q<>2]=b;H[k+268>>2]=w;v=1}if(!v){if(_){i=0;Ba(S,1,11470,0);break j}i=0;Ba(S,1,11470,0);break j}A=D-ca|0;o=0;m=i;r=i-2|0;H[k+244>>2]=r;c=p+z|0;b=c-3|0;H[k+224>>2]=b;g=I[c-2|0];c=g>>>0>143;H[k+248>>2]=c;q=0;n=g>>>4|0;H[k+232>>2]=n;H[k+236>>2]=0;h=(n&7)==7?3:4;H[k+240>>2]=h;g=(b&3)+1|0;R=g>>>0>>0?g:r;F:{G:{if(r){while(1){i=c;u=b;b=b-1|0;H[k+224>>2]=b;g=I[u|0];c=g>>>0>143;H[k+248>>2]=c;j=h&31;if((h&63)>>>0>=32){E=g<>>32-j;j=g<>2]=n;q=q|E;H[k+236>>2]=q;h=(i&1?(g&127)==127?7:8:8)+h|0;H[k+240>>2]=h;o=o+1|0;if((R|0)!=(o|0)){continue}break}j=r-R|0;H[k+244>>2]=j;if(h>>>0>32){break F}if((j|0)>=4){o=H[u-4>>2];H[k+224>>2]=u-5;H[k+244>>2]=j-4;break G}if((j|0)<=0){o=0;break G}H:{if((R|0)==(m-3|0)){i=24;o=0;break H}E=j&1;r=j&2147483646;i=24;o=0;g=0;while(1){u=b-1|0;H[k+224>>2]=u;R=I[b|0];b=b-2|0;H[k+224>>2]=b;H[k+244>>2]=j-1;u=I[u|0];j=j-2|0;H[k+244>>2]=j;o=R<>2]=b-1;b=I[b|0];H[k+244>>2]=j-1;o=b<>2]=r-R}u=o&255;H[k+248>>2]=u>>>0>143;g=c?(o&2130706432)==2130706432?7:8:8;c=g+(o>>>0<=2415919103?8:(o&8323072)==8323072?7:8)|0;i=o>>>16&255;b=c+(i>>>0<=143?8:(o&32512)==32512?7:8)|0;j=o>>>8&255;H[k+240>>2]=b+((j>>>0<=143?8:(o&127)==127?7:8)+h|0);b=i<>>24|j<>>0>=32){o=b<>>32-c;b=b<>2]=b|n;H[k+236>>2]=o|q}Zb(k+192|0,z,p-m|0,255);b=0;I:{if(e>>>0<2){break I}Zb(k+160|0,U,l,0);b=0;if((e|0)==2){break I}n=0;q=0;o=0;H[k+152>>2]=1;H[k+144>>2]=0;H[k+136>>2]=0;H[k+140>>2]=0;c=l;i=c-1|0;H[k+148>>2]=i;b=(p+z|0)+c|0;g=b-1|0;H[k+128>>2]=g;R=g&3;J:{if((c|0)<=0){b=g;break J}b=b-2|0;H[k+128>>2]=b;n=I[g|0]}H[k+136>>2]=n;H[k+140>>2]=0;p=n>>>0>143;H[k+152>>2]=p;l=(n&127)==127?7:8;H[k+144>>2]=l;K:{if(!R){break K}u=c-2|0;H[k+148>>2]=u;L:{if((c|0)<2){g=b;break L}g=b-1|0;H[k+128>>2]=g;o=I[b|0]}p=o>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){m=o<>>32-b;b=o<>2]=q;H[k+140>>2]=m;l=(n>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==1){b=g;n=q;q=m;c=i;i=u;break K}h=c-3|0;H[k+148>>2]=h;M:{if((c|0)<3){j=g;break M}j=g-1|0;H[k+128>>2]=j;aa=I[g|0]}p=aa>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){E=aa<>>32-b;b=aa<>2]=n;H[k+140>>2]=b;l=(o>>>0<=143?8:(aa&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==2){b=j;c=u;i=h;break K}i=c-4|0;H[k+148>>2]=i;o=0;N:{if((c|0)<4){b=j;break N}b=j-1|0;H[k+128>>2]=b;o=I[j|0]}p=o>>>0>143;H[k+152>>2]=p;c=l&31;if((l&63)>>>0>=32){w=o<>>32-c;c=o<>2]=n;H[k+140>>2]=c;l=(aa>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;c=h}if(l>>>0<=32){O:{if((c|0)>=5){g=H[b-3>>2];H[k+148>>2]=c-5;H[k+128>>2]=b-4;break O}g=0;if((c|0)<2){break O}c=24;while(1){j=b-1|0;H[k+128>>2]=j;b=I[b|0];o=i-1|0;H[k+148>>2]=o;g=b<>>0>1;b=j;c=c-8|0;i=o;if(h){continue}break}}h=g&255;H[k+152>>2]=h>>>0>143;i=p?(g&2130706432)==2130706432?7:8:8;c=i+(g>>>0<=2415919103?8:(g&8323072)==8323072?7:8)|0;o=g>>>16&255;b=c+(o>>>0<=143?8:(g&32512)==32512?7:8)|0;j=g>>>8&255;H[k+144>>2]=b+((j>>>0<=143?8:(g&127)==127?7:8)+l|0);b=o<>>24|j<>>0>=32){m=b<>>32-c;b=b<>2]=b|n;H[k+140>>2]=m|q}b=1}aa=b;$=x-X|0;ta=P+1|0;F[s+2112|0]=0;u=s+2112|0;g=Ya(k+256|0);if((A|0)>0){P=sa-1|0;l=s;j=u;b=0;c=ha;z=0;while(1){R=z;h=J[(b<<8|(lb(k+224|0)&127)<<1)+16656>>1];P:{if(b){break P}b=g-2|0;h=(b|0)==-1?h:0;if((g|0)>1){g=b;break P}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];x=h>>>4|0;p=H[l>>2]|(x&3|h>>>2&48)<>2]=p;E=h&16;b=h>>>5&7|E>>>4;o=i;i=h&7;z=o-i|0;n=((1<>>i;q=q>>>i|0;o=n;i=0;if((A|0)>(R|2)){i=J[(b<<8|(n&127)<<1)+16656>>1];Q:{if(b){break Q}b=g-2|0;i=(b|0)==-1?i:0;if((g|0)>1){g=b;break Q}g=Ya(k+256|0)}b=i&7;z=z-b|0;n=((1<>>b;q=q>>>b|0;o=n;b=i>>>4&1|i>>>5&7}H[l>>2]=p|(i<<2&768|i&48)<>>2&2|h>>>3&1;R:{if((p|0)!=3){break R}m=g-2|0;p=(m|0)==-1?4:3;if((g|0)>1){g=m;break R}g=Ya(k+256|0)}S:{if(!p){H[k+120>>2]=1;H[k+124>>2]=1;o=0;break S}if(p>>>0<=2){m=I[(o&7)+20804|0];w=m>>>2&7;r=m&3;m=(((-1<>>r)+(m>>>5|0)|0)+1|0;o=(p|0)==1;H[k+124>>2]=o?1:m;H[k+120>>2]=o?m:1;o=r+w|0;break S}v=o;o=I[(o&7)+20804|0];U=o&3;m=v>>>U|0;if((p|0)==3){X=(o>>>5|0)+1|0;if((U|0)==3){H[k+124>>2]=m&1|2;o=o>>>2&7;H[k+120>>2]=X+((-1<>>1);o=o+4|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=X+(m&(-1<>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+1;o=o+(p+(w+U|0)|0)|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=((m&(-1<>>5|0)|0)+3;o=r>>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+3;o=o+(w+(p+U|0)|0)|0}T:{X=H[k+120>>2];if(X>>>0<=ta>>>0){w=H[k+124>>2];if(w>>>0<=ta>>>0){break T}}if(_){i=0;Ba(S,1,15756,0);break j}i=0;Ba(S,1,15756,0);break j}H[k+240>>2]=z-o;m=o&31;if((o&63)>>>0>=32){o=0;q=q>>>m|0}else{o=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=o;o=i&240|x&15;z=R+4|0;q=(z|0)<=(A|0)?255:255>>>(z-A<<1)|0;x=($|0)>1?q:q&85;if(o&(x^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}U:{V:{if(E){n=Ma(k+192|0);p=X+(h<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;T=(n&(-1<>>8&1)<>2]=T}W:{if(h&32){n=Ma(k+192|0);p=X+(h<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break W}if(!(x&2)){break W}H[(A<<2)+c>>2]=0}p=c+4|0;X:{Y:{if(h&64){n=Ma(k+192|0);r=X+(h<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=(n&(-1<>>10&1)<>2]=q}F[j+1|0]=0;Z:{if(h&128){n=Ma(k+192|0);r=X-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=c+8|0;_:{$:{if(i&16){n=Ma(k+192|0);p=w+(i<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>8&1)<>2]=p}aa:{if(i&32){n=Ma(k+192|0);p=w+(i<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break aa}if(!(x&32)){break aa}H[m+(A<<2)>>2]=0}m=c+12|0;ba:{ca:{if(i&64){n=Ma(k+192|0);p=w+(i<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>10&1)<>2]=p}j=j+2|0;F[j|0]=0;da:{if(i&128){n=Ma(k+192|0);p=w-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break da}H[m+(A<<2)>>2]=0}Z=Z^16;l=(R&4)+l|0;c=c+16|0;if((z|0)<(A|0)){continue}break}}ia=V&8;ja=s+1584|0;ka=s+1056|0;fa=s+528|0;if(($|0)>=3){la=N(A,12);ma=A<<3;da=sa-1|0;b=sa-2|0;t=3<>>1&2147483644)+4|0;r=2;while(1){R=r;T=I[u|0];F[u|0]=0;Z=Z&-17^2;ea:{if((A|0)<=0){r=r+2|0;break ea}b=R&4?fa:s;r=R+2|0;j=ha+(N(A,R)<<2)|0;p=0;c=u;E=0;while(1){V=p;P=T&255;i=I[c+1|0]>>>5&4|(P>>>7|E);h=J[(i<<8|(lb(k+224|0)&127)<<1)+18704>>1];fa:{if(i){break fa}i=g-2|0;h=(i|0)==-1?h:0;if((g|0)>1){g=i;break fa}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];l=H[b>>2]|(h>>>4&3|h>>>2&48)<>2]=l;U=h&64;X=h&128;E=U>>>5|X>>>6;o=i;i=h&7;x=o-i|0;n=((1<>>i;q=q>>>i|0;p=n;i=0;if((A|0)>(V|2)){o=I[c+2|0]>>>5&4|I[c+1|0]>>>7|E;i=J[(o<<8|(n&127)<<1)+18704>>1];ga:{if(o){break ga}o=g-2|0;i=(o|0)==-1?i:0;if((g|0)>1){g=o;break ga}g=Ya(k+256|0)}o=i&7;x=x-o|0;E=(i>>>5|i>>>6)&2;n=((1<>>o;p=n;q=q>>>o|0}H[b>>2]=l|(i<<2&768|i&48)<>>2&2|h>>>3&1;switch(z|0){case 0:break ha;case 3:break ia;default:break ja}}o=I[(p&7)+20804|0];w=o>>>2&7;v=p;p=o&3;l=(((-1<>>p)+(o>>>5|0)|0)+1|0;m=(z|0)==1;o=m?1:l;l=m?l:1;z=p+w|0;break ha}v=I[(p&7)+20804|0];m=v&3;o=p>>>m|0;w=I[(o&7)+20804|0];l=w&3;p=v>>>2&7;M=p+(l+m|0)|0;m=w>>>2&7;z=M+m|0;o=o>>>l|0;l=((o&(-1<>>5|0)|0)+1|0;o=(((-1<>>p)+(w>>>5|0)|0)+1|0}H[k+240>>2]=x-z;m=z&31;if((z&63)>>>0>=32){w=0;q=q>>>m|0}else{w=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=w;p=h&240;if(p-1&p){n=P&127;q=I[c+1|0]&127;n=n>>>0>q>>>0?n:q;q=n-2|0;l=(n>>>0>=q>>>0?q:0)+l|0}m=i&240;if(m-1&m){n=I[c+1|0]&127;q=I[c+2|0]&127;q=n>>>0>q>>>0?n:q;o=(q>>>0>2?q-2|0:0)+o|0}if(!(l>>>0<=ta>>>0&o>>>0<=ta>>>0)){if(_){i=0;Ba(S,1,15856,0);break j}i=0;Ba(S,1,15856,0);break j}T=I[c+2|0];F[c+1|0]=0;F[c+2|0]=0;n=m|p>>>4;p=V+4|0;q=(p|0)<=(A|0)?255:255>>>(p-A<<1)|0;P=(r|0)>($|0)?q&85:q;if(n&(P^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}ka:{la:{if(h&16){n=Ma(k+192|0);x=(h<<19>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;x=(n&(-1<>>8&1)<>2]=x}ma:{if(h&32){n=Ma(k+192|0);x=(h<<18>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break ma}if(!(P&2)){break ma}H[(A<<2)+j>>2]=0}x=j+4|0;na:{oa:{if(U){n=Ma(k+192|0);z=(h<<17>>31)+l|0;H[k+208>>2]=H[k+208>>2]-z;m=H[k+204>>2];q=H[k+200>>2];U=z&31;if((z&63)>>>0>=32){w=0;q=m>>>U|0}else{w=m>>>U|0;q=((1<>>U}H[k+200>>2]=q;H[k+204>>2]=w;m=(n&(-1<>>10&1)<>2]=m}pa:{if(X){n=Ma(k+192|0);l=l-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-l;m=H[k+204>>2];q=H[k+200>>2];z=l&31;if((l&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=j+8|0;qa:{ra:{if(i&16){n=Ma(k+192|0);l=(i<<19>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>8&1)<>2]=l}sa:{if(i&32){n=Ma(k+192|0);l=(i<<18>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break sa}if(!(P&32)){break sa}H[m+(A<<2)>>2]=0}m=j+12|0;ta:{ua:{if(i&64){n=Ma(k+192|0);l=(i<<17>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>10&1)<>2]=l}c=c+2|0;va:{if(i&128){n=Ma(k+192|0);h=o-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-h;o=H[k+204>>2];q=H[k+200>>2];l=h&31;if((h&63)>>>0>=32){w=0;o=o>>>l|0}else{w=o>>>l|0;o=((1<>>l}H[k+200>>2]=o;H[k+204>>2]=w;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break va}H[m+(A<<2)>>2]=0}Z=Z^16;b=(V&4)+b|0;j=j+16|0;if((p|0)<(A|0)){continue}break}}wa:{if(!(R&2)|e>>>0<2){break wa}m=r&4;xa:{ya:{za:{Aa:{Ba:{if(aa){x=m?s:fa;z=0;if((A|0)<=0){break Ba}q=ha+(N(A,R-2|0)<<2)|0;while(1){i=lb(k+128|0);h=0;j=H[x>>2];if(j){h=q+(z<<2)|0;o=0;c=15;while(1){Ca:{if(!(c&j)){break Ca}n=c&286331153;if(n&j){H[h>>2]=W|H[h>>2]^((i^-1)&1)<>>1|0}if(j&n<<1){b=(A<<2)+h|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(j&n<<2){b=h+ma|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(!(j&n<<3)){break Ca}b=h+la|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(j)}x=x+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;z=z+8|0;if((A|0)>(z|0)){continue}break}}l=0;i=0;ba=m?ka:ja;h=ba;x=m?s:fa;c=x;if((A|0)>0){break za}b=!m;break Aa}ba=m?ka:ja;b=!m}if(R>>>0<=5){break wa}q=b?s:fa;if((A|0)<=0){break xa}c=b?ka:ja;break ya}while(1){b=i>>>28|0;i=H[c>>2];b=i|(b|i<<4|i>>>4);H[h>>2]=b;b=b|H[c+4>>2]<<28;H[h>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);h=h+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}if(R>>>0<6){break wa}q=m?fa:s;c=m?ja:ka}b=0;o=0;h=x;m=c;i=c;c=q;while(1){j=h+4|0;n=H[i>>2];h=H[h>>2];if(!ia){n=n|(h|(h<<4|b>>>28|h>>>4|H[j>>2]<<28))<<3&-2004318072}H[i>>2]=n&(H[c>>2]^-1);c=c+4|0;i=i+4|0;b=h;h=j;o=o+8|0;if((A|0)>(o|0)){continue}break}if((A|0)<=0){break xa}U=ha+(N(A,R-6|0)<<2)|0;T=0;b=q;while(1){j=0;c=H[m>>2];if(c){X=A-T|0;R=(T<<2)+U|0;i=0;E=0;while(1){n=i;i=Ma(k+160|0);o=E+4|0;P=(A|0)>(o+T|0)?o:X;Da:{if((P|0)<=(E|0)){h=0;break Da}M=H[b>>2]^-1;w=E<<2;z=R+w|0;h=0;o=E;p=15<>>1|0}V=v<<1;if(V&c){if(i&1){j=j|V;c=M&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<2;if(V&c){if(i&1){j=j|V;c=M&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<3;if(!(V&c)){break Ea}if(i&1){j=j|V;c=M&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((P|0)>(o|0)){continue}break}if(!(j>>>w&65535)){break Da}while(1){Fa:{if(!(j&p)){break Fa}l=p&286331153;if(l&j){H[z>>2]=t|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<1&j){o=(A<<2)+z|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<2&j){o=z+ma|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(l<<3&j)){break Fa}o=z+la|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}p=p<<4;z=z+4|0;E=E+1|0;if((P|0)>(E|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];l=h&31;if((h&63)>>>0>=32){w=0;i=o>>>l|0}else{w=o>>>l|0;i=((1<>>l}H[k+168>>2]=i;H[k+172>>2]=w;i=1;E=4;if(!(n&1)){continue}break}H[m+4>>2]=H[m+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[b+4>>2]^-1)}n=H[b>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(T){c=ba-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[ba>>2]=H[ba>>2]|i&(H[x>>2]^-1);H[ba+4>>2]=H[ba+4>>2]|(H[x+4>>2]^-1)&n>>>31;m=m+4|0;b=b+4|0;ba=ba+4|0;x=x+4|0;T=T+8|0;if((A|0)>(T|0)){continue}break}}if(!ea){break wa}y(q,0,ea)}if((r|0)<($|0)){continue}break}}Ga:{if(e>>>0<2){break Ga}e=($&3)-1|0;Ha:{if(aa&e>>>0<2){if((A|0)<=0){break Ha}p=1<>2];if(u){h=j+(E<<2)|0;c=15;o=0;while(1){Ia:{if(!(c&u)){break Ia}m=c&286331153;if(m&u){H[h>>2]=p|H[h>>2]^((i^-1)&1)<>>1|0}if(u&m<<1){b=(A<<2)+h|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(u&m<<2){b=h+g|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(!(u&m<<3)){break Ia}b=h+n|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(u)}q=q+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;E=E+8|0;if((A|0)>(E|0)){continue}break}}if((A|0)<=0|e>>>0>1){break Ha}b=$&4;h=b?fa:s;c=b?ja:ka;l=0;i=0;while(1){b=i>>>28|0;i=H[h>>2];b=i|(b|i<<4|i>>>4);H[c>>2]=b;b=b|H[h+4>>2]<<28;H[c>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);c=c+4|0;h=h+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}}b=($|0)>6?($-($+1&3)|0)-3|0:0;if(($|0)<=(b|0)){break Ga}r=N(A,12);R=A<<3;ea=3<>>0>=3){Z=-1;if((g|0)<5){break La}if(X){break Ja}g=b&4;h=g?fa:s;i=g?ja:ka;c=0;if(!ia){c=g?s:fa;l=0;j=0;while(1){g=j>>>28|0;Z=-1;j=H[c>>2];H[i>>2]=(H[i>>2]|(j|(g|j<<4|j>>>4|H[c+4>>2]<<28))<<3&-2004318072)&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}break Ka}while(1){Z=-1;H[i>>2]=H[i>>2]&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+8|0;if((A|0)>(c|0)){continue}break}break Ka}Z=H[(c<<2)+20812>>2]}if(X){break Ja}}c=b&4;q=c?fa:s;g=c?ja:ka;x=c?s:fa;T=c?ka:ja;V=ha+(N(b,A)<<2)|0;p=0;while(1){j=0;c=H[g>>2]&Z;if(c){aa=A-p|0;u=V+(p<<2)|0;i=0;e=0;while(1){n=i;i=Ma(k+160|0);o=e+4|0;w=(A|0)>(o+p|0)?o:aa;Ma:{if((w|0)<=(e|0)){h=0;break Ma}E=e<<2;z=E+u|0;v=(H[q>>2]^-1)&Z;h=0;o=e;P=15<>>1|0}m=U<<1;if(m&c){if(i&1){j=j|m;c=v&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<2;if(m&c){if(i&1){j=j|m;c=v&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<3;if(!(m&c)){break Na}if(i&1){j=j|m;c=v&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((w|0)>(o|0)){continue}break}if(!(j>>>E&65535)){break Ma}while(1){Oa:{if(!(j&P)){break Oa}m=P&286331153;if(m&j){H[z>>2]=ea|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<1&j){o=(A<<2)+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<2&j){o=z+R|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(m<<3&j)){break Oa}o=r+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}P=P<<4;z=z+4|0;e=e+1|0;if((w|0)>(e|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];e=h&31;if((h&63)>>>0>=32){w=0;i=o>>>e|0}else{w=o>>>e|0;i=((1<>>e}H[k+168>>2]=i;H[k+172>>2]=w;i=1;e=4;if(!(n&1)){continue}break}H[g+4>>2]=H[g+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[q+4>>2]^-1)}n=H[q>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(p){c=T-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[T>>2]=H[T>>2]|i&(H[x>>2]^-1);H[T+4>>2]=H[T+4>>2]|(H[x+4>>2]^-1)&n>>>31;g=g+4|0;q=q+4|0;T=T+4|0;x=x+4|0;p=p+8|0;if((A|0)>(p|0)){continue}break}}b=b+4|0;if(($|0)>(b|0)){continue}break}}i=1;if(($|0)<=0|(A|0)<=0){break j}n=A&2147483644;o=A&3;q=ca-D>>>0>4294967292;b=0;while(1){i=ha+(N(b,A)<<2)|0;h=0;Pa:{if(!q){while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;g=H[i+4>>2];c=g&2147483647;H[i+4>>2]=(g|0)<0?0-c|0:c;g=H[i+8>>2];c=g&2147483647;H[i+8>>2]=(g|0)<0?0-c|0:c;g=H[i+12>>2];c=g&2147483647;H[i+12>>2]=(g|0)<0?0-c|0:c;i=i+16|0;h=h+4|0;if((n|0)!=(h|0)){continue}break}if(!o){break Pa}}h=0;while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;i=i+4|0;h=h+1|0;if((o|0)!=(h|0)){continue}break}}i=1;b=b+1|0;if(($|0)!=(b|0)){continue}break}break j}if(!_){break w}H[k+52>>2]=H[C+24>>2];H[k+48>>2]=P;Ba(S,1,9686,k+48|0);break v}H[k+20>>2]=i;H[k+16>>2]=P;Ba(S,1,9686,k+16|0);i=0;break j}i=0}na=k+304|0;if(i){break i}break b}H[f+108>>2]=(b<<9)+22336;c=0;b=H[f+116>>2];Qa:{Ra:{m=H[C+16>>2]-H[C+8>>2]|0;e=H[C+20>>2]-H[C+12>>2]|0;g=N(m,e);Sa:{Ta:{Ua:{if(g>>>0>K[f+132>>2]){Ca(b);b=Ia(g<<2);H[f+116>>2]=b;if(!b){break Sa}H[f+132>>2]=g;break Ua}if(!b){break Ta}}g=g<<2;if(!g){break Ta}y(b,0,g)}b=H[f+120>>2];l=m+2|0;o=e+3>>>2|0;g=N(l,o+2|0);if(g>>>0<=K[f+136>>2]){z=g<<2;break Ra}Ca(b);z=g<<2;b=Ia(z);H[f+120>>2]=b;if(b){break Ra}}b=0;break Qa}H[f+136>>2]=g;if(z){y(b,0,z)}Va:{if(!l){break Va}k=l&7;n=H[f+120>>2];b=n;q=m+1|0;Wa:{if(q>>>0>=7){g=l&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Wa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}k=l&7;b=n+(N(l,o+1|0)<<2)|0;Xa:{if(q>>>0>=7){g=l&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Xa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}b=e&3;if(!b){break Va}k=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;g=l&7;b=n+(N(l,o)<<2)|0;if(q>>>0>=7){c=l&-8;z=0;while(1){H[b+28>>2]=k;H[b+24>>2]=k;H[b+20>>2]=k;H[b+16>>2]=k;H[b+12>>2]=k;H[b+8>>2]=k;H[b+4>>2]=k;H[b>>2]=k;b=b+32|0;z=z+8|0;if((c|0)!=(z|0)){continue}break}if(!g){break Va}}z=0;while(1){H[b>>2]=k;b=b+4|0;z=z+1|0;if((g|0)!=(z|0)){continue}break}}H[f+128>>2]=e;H[f+124>>2]=m;b=1}if(!b){break b}z=j+H[C+28>>2]|0;if((z|0)>=31){if(!_){break h}H[Y+16>>2]=z;Ba(S,2,8716,Y+16|0);break b}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4);if(H[C+64>>2]){break i}c=H[C+52>>2];Ya:{if(!(c>>>0<=1&(!H[f+144>>2]|(c|0)!=1))){k=c&3;b=H[C+4>>2];g=0;Za:{if(c-1>>>0>=3){c=c&-4;while(1){q=(t<<3)+b|0;g=H[q+28>>2]+(H[q+20>>2]+(H[q+12>>2]+(H[q+4>>2]+g|0)|0)|0)|0;t=t+4|0;h=h+4|0;if((c|0)!=(h|0)){continue}break}if(!k){break Za}}while(1){g=H[((t<<3)+b|0)+4>>2]+g|0;t=t+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}ia=H[f+148>>2];c=g+2|0;if(c>>>0>K[f+152>>2]){b=Ha(ia,c);if(!b){break b}H[f+148>>2]=b;b=b+g|0;F[b|0]=0;F[b+1|0]=0;H[f+152>>2]=c;ia=H[f+148>>2];if(!H[C+52>>2]){break Ya}b=H[C+4>>2]}g=0;t=0;while(1){k=t<<3;c=k+b|0;b=H[c+4>>2];if(b){B(g+ia|0,H[c>>2],b)}b=H[C+4>>2];g=H[(k+b|0)+4>>2]+g|0;t=t+1|0;if(t>>>0>2]){continue}break}break Ya}if((c|0)!=1){break i}ia=H[H[C+4>>2]>>2]}b=H[C+60>>2];if(b){Z=H[f+116>>2];H[f+116>>2]=b}if(H[C+44>>2]){P=V&8;ca=f+28|0;ha=!(V&2);la=2;while(1){k=U+ia|0;ma=H[C>>2]+N(X,24)|0;c=H[ma>>2];ea=V&(la>>>0<2&(H[C+28>>2]-4|0)>=(z|0));_a:{if(ea){H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+8>>2]=0;H[f>>2]=0;H[f+16>>2]=k;break _a}H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+104>>2]=f+28;H[f+16>>2]=k;H[f+12>>2]=0;b=c?I[k|0]<<16:16711680;H[f>>2]=b;i=1;c=k+1|0;g=I[k+1|0];$a:{if(I[k|0]==255){if(g>>>0>=144){H[f+12>>2]=1;b=b|65280;break $a}H[f+16>>2]=c;i=0;b=b+(g<<9)|0;break $a}H[f+16>>2]=c;b=b|g<<8}H[f+8>>2]=i;H[f+4>>2]=32768;H[f>>2]=b<<7}R=H[ma>>2];ab:{if(!H[ma+8>>2]|(z|0)<=0){break ab}aa=ea|ha;ba=0;while(1){bb:{cb:{db:{eb:{switch(la-1|0){default:if(!ea){break db}b=1<>>1|b;e=H[f+124>>2];d=e<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];l=0;c=H[f+128>>2];if(c>>>0>=4){if(!e){break bb}o=N(e,12);n=e<<3;j=0-m|0;while(1){c=0;while(1){k=b;b=H[b>>2];fb:{if(!b){break fb}if(!(!(b&495)|b&2097168)){b=H[f>>2];i=H[f+8>>2];gb:{if(i){break gb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];hb:{if(i){i=8}else{if(b>>>0>143){break hb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break gb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;ib:{if(!(b>>>i&1)){break ib}jb:{if(i){break jb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];kb:{if(i){i=8}else{if(b>>>0>143){break kb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break jb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|32;H[k+4>>2]=H[k+4>>2]|8;H[k>>2]=H[k>>2]|q<<19|16;if(P){break ib}b=k+(-2-i<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|q<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[k>>2]|2097152;H[k>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[f>>2];i=H[f+8>>2];lb:{if(i){break lb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];mb:{if(i){i=8}else{if(b>>>0>143){break mb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break lb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){nb:{if(i){break nb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ob:{if(i){i=8}else{if(b>>>0>143){break ob}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break nb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[d+g>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|256;H[k+4>>2]=H[k+4>>2]|64;b=H[k>>2]|i<<22|128}else{b=H[k>>2]}b=b|16777216;H[k>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[f>>2];i=H[f+8>>2];pb:{if(i){break pb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];qb:{if(i){i=8}else{if(b>>>0>143){break qb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break pb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){rb:{if(i){break rb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];sb:{if(i){i=8}else{if(b>>>0>143){break sb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break rb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[g+n>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;b=H[k>>2]|i<<25|1024}else{b=H[k>>2]}b=b|134217728;H[k>>2]=b}if(!(b&253440)|b&1073750016){break fb}b=H[f>>2];i=H[f+8>>2];tb:{if(i){break tb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ub:{if(i){i=8}else{if(b>>>0>143){break ub}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break tb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){vb:{if(i){break vb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];wb:{if(i){i=8}else{if(b>>>0>143){break wb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break vb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g+o>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;H[k>>2]=H[k>>2]|q<<28|8192;b=k+(i<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|q<<18|2}H[k>>2]=H[k>>2]|1073741824}g=g+4|0;b=k+4|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}g=g+o|0;b=k+12|0;l=l+4|0;c=H[f+128>>2];if(l>>>0<(c&-4)>>>0){continue}break}}if(!e|c>>>0<=l>>>0){break cb}p=0;n=0-m|0;i=c;while(1){xb:{if((i|0)==(l|0)){i=l;break xb}d=b-4|0;j=H[b>>2];t=0;while(1){o=N(t,3);k=j>>>o|0;if(!(k&2097168|!(k&495))){c=H[f>>2];h=H[f+8>>2];yb:{if(h){break yb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];zb:{if(i){h=8}else{if(c>>>0>143){break zb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break yb}h=8;c=255}h=h-1|0;H[f+8>>2]=h;Ab:{if(!(c>>>h&1)){break Ab}q=(N(e,t)<<2)+g|0;Bb:{if(h){break Bb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Cb:{if(i){h=8}else{if(c>>>0>143){break Cb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break Bb}h=8;c=255}k=h-1|0;H[f+8>>2]=k;i=c>>>k&1;H[q>>2]=i?n:m;k=H[f+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(i<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|i<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((t|0)!=3){break Ab}c=(k<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|i<<18|2}j=H[b>>2]|2097152<>2]=j;c=H[f+128>>2]}i=c;t=t+1|0;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((e|0)!=(p|0)){continue}break};break cb;case 1:m=0;x=0;Db:{Eb:{Fb:{W=H[f+124>>2];if(!((W|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;u=0-s|0;q=f+100|0;k=f+96|0;w=f+28|0;g=H[f+120>>2]+268|0;e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];c=H[f+116>>2];if(V&8){break Fb}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];Gb:{Hb:{Ib:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;Jb:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){Kb:{if(e){break Kb}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kb}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break Kb}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break Jb}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Lb:{if(e){break Lb}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Lb}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break Lb}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Jb}c=H[i+4>>2]}if(!c){i=k;break Gb}c=H[q>>2];g=H[c>>2];b=b-g|0;Mb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){Nb:{if(e){break Nb}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Nb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break Mb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){Ob:{if(e){break Ob}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ob}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Ob}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break Mb}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;Pb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){Qb:{if(e){break Qb}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break Pb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){Rb:{if(e){break Rb}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rb}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Rb}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pb}c=H[c+4>>2]}g=0;i=q;Sb:{Tb:{Ub:{Vb:{Wb:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;Xb:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Yb:{if(e){break Yb}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yb}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Yb}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=c?h:!h;break Xb}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Zb:{if(e){break Zb}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Zb}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Zb}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Xb}n=H[n+4>>2]}g=I[i+24640|0];H[o>>2]=(n|0)==(g|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;i=c;v=H[c>>2];c=g^n;H[i>>2]=v|c<<31|65536;i=c<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;_b:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){$b:{if(e){break $b}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $b}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break $b}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break _b}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){ac:{if(e){break ac}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ac}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break ac}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break _b}c=H[n+4>>2]}g=i|16;if(!c){break Vb}break;case 1:break Wb;case 2:break Ub;case 3:break Sb;default:break Hb}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){cc:{if(e){break cc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break bc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dc:{if(e){break dc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break dc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break bc}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;ec:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){fc:{if(e){break fc}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break fc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break ec}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){gc:{if(e){break gc}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gc}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break gc}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break ec}c=H[n+4>>2]}if(!c){break Tb}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){ic:{if(e){break ic}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ic}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ic}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break hc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jc:{if(e){break jc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break jc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break hc}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;kc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){lc:{if(e){break lc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break lc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break kc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){mc:{if(e){break mc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break mc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break kc}c=H[m+4>>2]}if(!c){break Hb}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break Ib}nc:{if(g&2097168){break nc}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;oc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){pc:{if(e){break pc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break oc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){qc:{if(e){break qc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break qc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break oc}c=H[m+4>>2]}if(!c){break nc}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;rc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){sc:{if(e){break sc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break sc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break sc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=n?m:!m;break rc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){tc:{if(e){break tc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break tc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break tc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!m:m;break rc}m=H[p+4>>2]}n=I[h+24640|0];H[o>>2]=(m|0)==(n|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;v=c;M=H[c>>2];c=m^n;H[v>>2]=M|c<<31|65536;g=c<<19|g|16}uc:{if(g&16777344){break uc}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;vc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){wc:{if(e){break wc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break wc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break vc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){xc:{if(e){break xc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break xc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break vc}c=H[l+4>>2]}if(!c){break uc}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;yc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){zc:{if(e){break zc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break zc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break zc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break yc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Ac:{if(e){break Ac}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ac}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Ac}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break yc}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}Bc:{if(g&134218752){break Bc}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Dc:{if(e){break Dc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Dc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Dc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Cc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ec:{if(e){break Ec}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ec}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Ec}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Cc}c=H[l+4>>2]}if(!c){break Bc}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Fc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Gc:{if(e){break Gc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Gc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Fc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Hc:{if(e){break Hc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Hc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Fc}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break Hb}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Ic:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Jc:{if(e){break Jc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ic}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kc:{if(e){break Kc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Kc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ic}c=H[l+4>>2]}if(!c){break Hb}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}Lc:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){Mc:{if(e){break Mc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Mc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break Lc}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){Nc:{if(e){break Nc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Nc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Lc}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}break Eb}b=1<>>1|b;k=H[f+120>>2];c=(k+(W<<2)|0)+12|0;g=H[f+128>>2];e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];o=H[f+116>>2];if(V&8){Oc:{if(g>>>0<4){break Oc}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Pc:{Qc:{Rc:{if(c){Sc:{if(c&2097168){break Sc}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Tc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Tc}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Uc:{if(e){break Uc}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Uc}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Uc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Tc}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Vc:{if(e){break Vc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Vc}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Vc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Sc}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;Wc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break Wc}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){Xc:{if(e){break Xc}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break Xc}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break Xc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break Wc}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){Yc:{if(e){break Yc}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break Yc}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break Yc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=(g^k)<<19|c|16}Zc:{if(c&16777344){break Zc}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;_c:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break _c}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){$c:{if(e){break $c}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break $c}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break $c}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break _c}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){ad:{if(e){break ad}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break ad}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break ad}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zc}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;bd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break bd}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){cd:{if(e){break cd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break cd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break cd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break bd}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){dd:{if(e){break dd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break dd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ed:{if(c&134218752){break ed}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;fd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break fd}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){gd:{if(e){break gd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break gd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break fd}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){hd:{if(e){break hd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break hd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ed}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break id}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){jd:{if(e){break jd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break jd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break id}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){kd:{if(e){break kd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break kd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Qc}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ld}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){md:{if(e){break md}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break md}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ld}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){nd:{if(e){break nd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break nd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Qc}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break Rc}k=H[q>>2];c=H[k>>2];b=b-c|0;od:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break od}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){pd:{if(e){break pd}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break pd}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break od}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){qd:{if(e){break qd}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break qd}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Pc}g=H[n>>2];c=H[g>>2];b=b-c|0;rd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break rd}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){sd:{if(e){break sd}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break rd}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){td:{if(e){break td}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;ud:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break ud}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){vd:{if(e){break vd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break vd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break ud}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){wd:{if(e){break wd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;xd:{yd:{zd:{Ad:{Bd:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Cd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Cd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Dd:{if(e){break Dd}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Dd}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Cd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ed:{if(e){break Ed}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ed}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ed}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=(c^g)<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Fd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Fd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Gd:{if(e){break Gd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Gd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Fd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Hd:{if(e){break Hd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Hd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Ad}break;case 1:break Bd;case 2:break zd;case 3:break xd;default:break Qc}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Id}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Jd:{if(e){break Jd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Jd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Id}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Kd:{if(e){break Kd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Kd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ld}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Md:{if(e){break Md}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Md}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ld}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){Nd:{if(e){break Nd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Nd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break yd}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Od:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Od}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Pd:{if(e){break Pd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Pd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Od}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Qd:{if(e){break Qd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Qd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Rd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Rd}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Sd:{if(e){break Sd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Rd}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Td:{if(e){break Td}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Qc}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;Ud:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break Ud}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){Vd:{if(e){break Vd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Vd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Ud}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){Wd:{if(e){break Wd}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Oc}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,1);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}Xd:{if(g>>>0<4){break Xd}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Yd:{Zd:{_d:{if(c){$d:{if(c&2097168){break $d}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;ae:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break ae}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){be:{if(e){break be}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break ae}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){ce:{if(e){break ce}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break $d}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;de:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break de}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){ee:{if(e){break ee}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break ee}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break de}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){fe:{if(e){break fe}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break fe}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;h=j+(-2-H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|32768;k=g^k;H[h>>2]=H[h>>2]|k<<31|65536;g=h-4|0;H[g>>2]=H[g>>2]|131072;c=k<<19|c|16}ge:{if(c&16777344){break ge}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;he:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break he}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ie:{if(e){break ie}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ie}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ie}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break he}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){je:{if(e){break je}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break je}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break je}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ge}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;ke:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break ke}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){le:{if(e){break le}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break le}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break le}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ke}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){me:{if(e){break me}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break me}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ne:{if(c&134218752){break ne}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;oe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break oe}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){pe:{if(e){break pe}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break pe}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break oe}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){qe:{if(e){break qe}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break qe}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ne}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break re}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){se:{if(e){break se}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break se}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break re}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){te:{if(e){break te}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break te}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Zd}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ue}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ve:{if(e){break ve}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ve}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ue}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){we:{if(e){break we}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break we}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break we}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zd}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break _d}k=H[q>>2];c=H[k>>2];b=b-c|0;xe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break xe}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){ye:{if(e){break ye}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break ye}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break xe}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){ze:{if(e){break ze}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break ze}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Yd}g=H[n>>2];c=H[g>>2];b=b-c|0;Ae:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break Ae}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){Be:{if(e){break Be}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break Ae}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){Ce:{if(e){break Ce}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;De:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break De}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){Ee:{if(e){break Ee}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Ee}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break De}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){Fe:{if(e){break Fe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Fe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;Ge:{He:{Ie:{Je:{Ke:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Le:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Le}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Me:{if(e){break Me}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Me}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Le}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ne:{if(e){break Ne}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ne}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ne}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=j+(-2-H[f+124>>2]<<2)|0;H[k+4>>2]=H[k+4>>2]|32768;g=c^g;H[k>>2]=H[k>>2]|g<<31|65536;c=k-4|0;H[c>>2]=H[c>>2]|131072;k=g<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Oe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Oe}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Pe:{if(e){break Pe}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Pe}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Oe}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Qe:{if(e){break Qe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Qe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Je}break;case 1:break Ke;case 2:break Ie;case 3:break Ge;default:break Zd}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Re}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Se:{if(e){break Se}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Se}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Re}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Te:{if(e){break Te}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Te}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ue}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Ve:{if(e){break Ve}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Ve}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ue}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){We:{if(e){break We}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break We}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break We}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break He}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Xe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Xe}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Ye:{if(e){break Ye}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Ye}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Xe}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Ze:{if(e){break Ze}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ze}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;_e:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break _e}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){$e:{if(e){break $e}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break $e}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break $e}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break _e}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){af:{if(e){break af}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break af}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break af}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Zd}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;bf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break bf}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){cf:{if(e){break cf}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break cf}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break cf}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break bf}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){df:{if(e){break df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break df}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break df}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Xd}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,0);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];ef:{ff:{gf:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;hf:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){jf:{if(e){break jf}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jf}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break jf}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break hf}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){kf:{if(e){break kf}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break kf}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break kf}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break hf}c=H[i+4>>2]}if(!c){i=k;break ef}c=H[q>>2];g=H[c>>2];b=b-g|0;lf:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){mf:{if(e){break mf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break lf}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){nf:{if(e){break nf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break nf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break nf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break lf}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;of:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){pf:{if(e){break pf}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break of}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){qf:{if(e){break qf}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break qf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break of}c=H[c+4>>2]}g=0;i=q;rf:{sf:{tf:{uf:{vf:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;wf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){xf:{if(e){break xf}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;g=c?h:!h;break wf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){yf:{if(e){break yf}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break yf}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break yf}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!h:h;break wf}g=H[n+4>>2]}c=I[i+24640|0];H[o>>2]=(g|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;i=(c^g)<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;zf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Af:{if(e){break Af}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Af}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Af}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break zf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Bf:{if(e){break Bf}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Bf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Bf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break zf}c=H[n+4>>2]}g=i|16;if(!c){break uf}break;case 1:break vf;case 2:break tf;case 3:break rf;default:break ff}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cf:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Df:{if(e){break Df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Df}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Df}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break Cf}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ef:{if(e){break Ef}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ef}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Ef}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break Cf}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;Ff:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){Gf:{if(e){break Gf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Gf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break Ff}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){Hf:{if(e){break Hf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Hf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Ff}c=H[n+4>>2]}if(!c){break sf}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;If:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Jf:{if(e){break Jf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break If}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kf:{if(e){break Kf}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kf}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Kf}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break If}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Lf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Mf:{if(e){break Mf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Lf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Nf:{if(e){break Nf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Nf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Lf}c=H[m+4>>2]}if(!c){break ff}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break gf}Of:{if(g&2097168){break Of}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Pf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Qf:{if(e){break Qf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Pf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Rf:{if(e){break Rf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Rf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pf}c=H[m+4>>2]}if(!c){break Of}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Sf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Tf:{if(e){break Tf}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Tf}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Tf}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Sf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Uf:{if(e){break Uf}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Uf}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Uf}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Sf}n=H[p+4>>2]}c=I[h+24640|0];H[o>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;g=(c^n)<<19|g|16}Vf:{if(g&16777344){break Vf}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Wf:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Xf:{if(e){break Xf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Wf}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Yf:{if(e){break Yf}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yf}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Yf}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Wf}c=H[l+4>>2]}if(!c){break Vf}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Zf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){_f:{if(e){break _f}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break _f}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break _f}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Zf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){$f:{if(e){break $f}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $f}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break $f}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Zf}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}ag:{if(g&134218752){break ag}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){cg:{if(e){break cg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break bg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dg:{if(e){break dg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break dg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break bg}c=H[l+4>>2]}if(!c){break ag}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;eg:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){fg:{if(e){break fg}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fg}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break fg}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break eg}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){gg:{if(e){break gg}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gg}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break gg}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break eg}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break ff}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){ig:{if(e){break ig}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ig}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ig}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break hg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jg:{if(e){break jg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break jg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break hg}c=H[l+4>>2]}if(!c){break ff}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}kg:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){lg:{if(e){break lg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break lg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break kg}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){mg:{if(e){break mg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break mg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break kg}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i}ng:{if(!(V&32)){break ng}H[f+104>>2]=f+100;g=H[f+100>>2];b=H[g>>2];d=H[f+4>>2]-b|0;H[f+4>>2]=d;e=H[f>>2];og:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){pg:{if(d){break pg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break pg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break pg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break og}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break og}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){qg:{if(b){break qg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break qg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break qg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;rg:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){sg:{if(d){break sg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break sg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break sg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break rg}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break rg}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){tg:{if(b){break tg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break tg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break tg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;ug:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){vg:{if(d){break vg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break vg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break vg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break ug}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break ug}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){wg:{if(b){break wg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break wg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break wg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;if(e>>>16>>>0>>0){H[f+4>>2]=b;H[f+100>>2]=H[(b>>>0>d>>>0?8:12)+g>>2];d=H[f+8>>2];while(1){xg:{if(d){break xg}g=H[f+16>>2];c=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break xg}H[f+16>>2]=c;e=(k<<9)+e|0;d=7;break xg}H[f+16>>2]=c;d=8;e=(k<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}break ng}c=e-(b<<16)|0;H[f>>2]=c;if(d&32768){break ng}H[f+100>>2]=H[(b>>>0>d>>>0?12:8)+g>>2];e=H[f+8>>2];while(1){yg:{if(e){break yg}g=H[f+16>>2];b=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;c=c+65280|0;e=8;break yg}H[f+16>>2]=b;c=(k<<9)+c|0;e=7;break yg}H[f+16>>2]=b;e=8;c=(k<<8)+c|0}e=e-1|0;H[f+8>>2]=e;c=c<<1;H[f>>2]=c;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}break cb;case 0:break eb}}if(ea){r=1<>>1|0;u=H[f+124>>2];d=u<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];j=0;c=H[f+128>>2];if(c>>>0>=4){if(!u){break bb}h=N(u,12);n=u<<3;m=0-r|0;while(1){c=0;while(1){k=b;b=H[b>>2];zg:{if(!b){break zg}if((b&2097168)==16){b=H[f>>2];e=H[f+8>>2];Ag:{if(e){break Ag}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Bg:{if(q){e=8}else{if(b>>>0>143){break Bg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Ag}e=8;b=255}i=e-1|0;H[f+8>>2]=i;i=b>>>i&1;b=H[g>>2];H[g>>2]=((i|0)==(b>>>31|0)?m:r)+b;b=H[k>>2]|1048576;H[k>>2]=b}if((b&16777344)==128){b=H[f>>2];e=H[f+8>>2];Cg:{if(e){break Cg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Dg:{if(q){e=8}else{if(b>>>0>143){break Dg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Cg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=d+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|8388608;H[k>>2]=b}if((b&134218752)==1024){b=H[f>>2];e=H[f+8>>2];Eg:{if(e){break Eg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Fg:{if(q){e=8}else{if(b>>>0>143){break Fg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Eg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=g+n|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|67108864;H[k>>2]=b}if((b&1073750016)!=8192){break zg}b=H[f>>2];e=H[f+8>>2];Gg:{if(e){break Gg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Hg:{if(q){e=8}else{if(b>>>0>143){break Hg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Gg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=h+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);H[k>>2]=H[k>>2]|536870912}g=g+4|0;b=k+4|0;c=c+1|0;if((u|0)!=(c|0)){continue}break}g=h+g|0;b=k+12|0;j=j+4|0;c=H[f+128>>2];if(j>>>0<(c&-4)>>>0){continue}break}}if(!u|c>>>0<=j>>>0){break cb}p=0;q=0-r|0;d=c;while(1){Ig:{if((d|0)==(j|0)){d=j;break Ig}e=H[b>>2];t=0;while(1){d=N(t,3);if((2097168<>2];l=H[f+8>>2];Jg:{if(l){break Jg}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Kg:{if(i){l=8}else{if(c>>>0>143){break Kg}l=7}H[f>>2]=c;H[f+16>>2]=k+1;break Jg}l=8;c=255}k=l-1|0;H[f+8>>2]=k;k=c>>>k&1;c=H[n>>2];H[n>>2]=((k|0)==(c>>>31|0)?q:r)+c;e=H[b>>2]|1048576<>2]=e;c=H[f+128>>2]}t=t+1|0;d=c;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((u|0)!=(p|0)){continue}break}break cb}k=H[f+120>>2];d=H[f+116>>2];w=H[f+124>>2];c=H[f+128>>2];if(!((w|0)!=64|(c|0)!=64)){c=k+268|0;x=0;p=1<>>1|0;m=0-p|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];while(1){l=0;while(1){q=d;i=c;d=H[c>>2];if(d){k=c;if((d&2097168)==16){j=ca+((d&1048576?16:d&495?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Lg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Mg:{if(t){break Mg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Mg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Mg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Lg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Ng:{if(t){break Ng}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Ng}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Ng}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Lg}n=H[o+4>>2]}c=H[q>>2];H[q>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|1048576}if((d&16777344)==128){j=ca+((d&8388608?16:d&3960?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Og:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Pg:{if(t){break Pg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Pg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Pg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Og}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Qg:{if(t){break Qg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Qg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Qg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Og}n=H[o+4>>2]}c=H[q+256>>2];H[q+256>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|8388608}if((d&134218752)==1024){j=ca+((d&67108864?16:d&31680?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Rg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Sg:{if(t){break Sg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Sg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Sg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Rg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Tg:{if(t){break Tg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Tg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Tg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Rg}n=H[o+4>>2]}c=H[q+512>>2];H[q+512>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|67108864}if((d&1073750016)==8192){j=ca+((d&536870912?16:d&253440?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Ug:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Vg:{if(t){break Vg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Vg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Vg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Ug}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Wg:{if(t){break Wg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Wg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Wg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Ug}n=H[o+4>>2]}c=H[q+768>>2];H[q+768>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|536870912}H[k>>2]=d}c=i+4|0;d=q+4|0;l=l+1|0;if((l|0)!=64){continue}break}c=i+12|0;d=q+772|0;k=x>>>0<60;x=x+4|0;if(k){continue}break}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;break cb}s=1<>>1|0;e=w<<2;h=(e+k|0)+12|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];o=0;Xg:{if(c>>>0<4){break Xg}if(w){p=N(w,12);n=w<<3;r=0-s|0;while(1){l=0;while(1){k=h;i=H[h>>2];if(i){if((i&2097168)==16){j=ca+((i&1048576?16:i&495?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;Yg:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break Yg}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){Zg:{if(t){break Zg}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break Zg}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break Zg}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break Yg}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){_g:{if(t){break _g}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break _g}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break _g}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}c=H[d>>2];H[d>>2]=((q|0)==(c>>>31|0)?r:s)+c;i=i|1048576}if((i&16777344)==128){j=ca+((i&8388608?16:i&3960?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;$g:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break $g}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){ah:{if(t){break ah}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break ah}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break ah}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break $g}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){bh:{if(t){break bh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break bh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break bh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+e|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|8388608}if((i&134218752)==1024){j=ca+((i&67108864?16:i&31680?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;ch:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break ch}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){dh:{if(t){break dh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break dh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break dh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break ch}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){eh:{if(t){break eh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break eh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break eh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+n|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|67108864}if((i&1073750016)==8192){j=ca+((i&536870912?16:i&253440?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;fh:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break fh}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){gh:{if(t){break gh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break gh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break gh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break fh}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){hh:{if(t){break hh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break hh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break hh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+p|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|536870912}H[k>>2]=i}h=k+4|0;d=d+4|0;l=l+1|0;if((w|0)!=(l|0)){continue}break}h=k+12|0;d=d+p|0;o=o+4|0;c=H[f+128>>2];if(o>>>0<(c&-4)>>>0){continue}break}break Xg}o=c&-4;h=(k+(o<<1)|0)+12|0}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;if(!w|c>>>0<=o>>>0){break cb}x=0;k=0-s|0;b=c;while(1){ih:{if((b|0)==(o|0)){b=o;break ih}t=H[h>>2];e=0;while(1){l=N(e,3);if((2097168<>>l|0;i=ca+((b&1048576?16:b&495?15:14)<<2)|0;H[f+104>>2]=i;q=H[i>>2];b=H[q>>2];c=H[f+4>>2]-b|0;H[f+4>>2]=c;g=H[f>>2];jh:{if(g>>>16>>>0>>0){n=H[q+4>>2];H[f+4>>2]=b;c=b>>>0>c>>>0;H[i>>2]=H[q+(c?8:12)>>2];t=H[f+8>>2];while(1){kh:{if(t){break kh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break kh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break kh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}c=c?n:!n;break jh}g=g-(b<<16)|0;H[f>>2]=g;if(!(c&32768)){n=H[q+4>>2];b=b>>>0>c>>>0;H[i>>2]=H[q+(b?12:8)>>2];t=H[f+8>>2];while(1){lh:{if(t){break lh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break lh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break lh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;c=c<<1;H[f+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!n:n;break jh}c=H[q+4>>2]}b=H[j>>2];H[j>>2]=((c|0)==(b>>>31|0)?k:s)+b;t=H[h>>2]|1048576<>2]=t;c=H[f+128>>2]}e=e+1|0;b=c;if(e>>>0>>0){continue}break}}h=h+4|0;d=d+4|0;x=x+1|0;if((w|0)!=(x|0)){continue}break}break cb}i=0;x=0;p=0;mh:{nh:{oh:{M=H[f+124>>2];if(!((M|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;k=0-i|0;s=f+28|0;g=H[f+120>>2]+268|0;h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];b=H[f+116>>2];if(V&8){break oh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){ph:{if(g&2097168){break ph}b=g&495;if(!b){break ph}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;qh:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){rh:{if(h){break rh}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break rh}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break rh}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break qh}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){sh:{if(h){break sh}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break sh}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break sh}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break qh}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];th:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){uh:{if(h){break uh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break uh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break uh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m;break th}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){vh:{if(h){break vh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break vh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break vh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break th}d=H[e+4>>2]}H[q>>2]=(o|0)==(d|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n-268|0;H[b>>2]=H[b>>2]|131072;b=n-260|0;H[b>>2]=H[b>>2]|32768;b=n-264|0;u=b;e=H[b>>2];b=d^o;H[u>>2]=e|b<<31|65536;g=b<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;wh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){xh:{if(h){break xh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break xh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break xh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break wh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){yh:{if(h){break yh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break yh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break yh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break wh}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];zh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Ah:{if(h){break Ah}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ah}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ah}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break zh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Bh:{if(h){break Bh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Bh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Bh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break zh}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ch:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Dh:{if(h){break Dh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Dh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Dh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ch}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Eh:{if(h){break Eh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Eh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Eh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ch}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Fh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Gh:{if(h){break Gh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Gh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Gh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Fh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Hh:{if(h){break Hh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Hh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Hh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Fh}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ih:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Jh:{if(h){break Jh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Jh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Jh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ih}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Kh:{if(h){break Kh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Kh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Kh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ih}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Lh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Mh:{if(h){break Mh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Mh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Mh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Lh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Nh:{if(h){break Nh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Nh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Nh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Lh}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}break nh}b=1<>>1|b;q=H[f+120>>2];g=(q+(M<<2)|0)+12|0;b=H[f+128>>2];h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];o=H[f+116>>2];Oh:{if(V&8){Ph:{if(b>>>0<4){break Ph}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){Qh:{if(g&2097168){break Qh}b=g&495;if(!b){break Qh}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Rh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break Rh}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Sh:{if(h){break Sh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Sh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Sh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Rh}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Th:{if(h){break Th}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Th}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Th}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];Uh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;v=H[s+4>>2];if(c&32768){break Uh}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){Vh:{if(h){break Vh}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break Vh}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break Vh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}v=b?!m:m;break Uh}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){Wh:{if(h){break Wh}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break Wh}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break Wh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;v=d?m:!m}b=v;H[o>>2]=(e|0)==(b|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^e)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Xh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Xh}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Yh:{if(h){break Yh}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Yh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Yh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Xh}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Zh:{if(h){break Zh}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Zh}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Zh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];_h:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break _h}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){$h:{if(h){break $h}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break $h}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break $h}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break _h}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){ai:{if(h){break ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ci:{if(h){break ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){di:{if(h){break di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){fi:{if(h){break fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){gi:{if(h){break gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ii:{if(h){break ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){ji:{if(h){break ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){li:{if(h){break li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){mi:{if(h){break mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break Ph}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,1);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}break Oh}ni:{if(b>>>0<4){break ni}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){oi:{if(g&2097168){break oi}b=g&495;if(!b){break oi}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;pi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break pi}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){qi:{if(h){break qi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break qi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break qi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break pi}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ri:{if(h){break ri}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ri}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ri}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];si:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[s+4>>2];if(c&32768){break si}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){ti:{if(h){break ti}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break ti}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break ti}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break si}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){ui:{if(h){break ui}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break ui}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break ui}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m}H[o>>2]=(e|0)==(d|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n+(-2-H[f+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^e;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;g=d<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;vi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break vi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){wi:{if(h){break wi}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break wi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break wi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break vi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){xi:{if(h){break xi}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break xi}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break xi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];yi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break yi}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){zi:{if(h){break zi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break zi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break zi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break yi}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Ai:{if(h){break Ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ci:{if(h){break Ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Di:{if(h){break Di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];Ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Fi:{if(h){break Fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Gi:{if(h){break Gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ii:{if(h){break Ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Ji:{if(h){break Ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];Ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Li:{if(h){break Li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Mi:{if(h){break Mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break ni}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,0);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}}break mh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){Ni:{if(g&2097168){break Ni}b=g&495;if(!b){break Ni}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;Oi:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){Pi:{if(h){break Pi}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Pi}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break Pi}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break Oi}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){Qi:{if(h){break Qi}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Qi}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break Qi}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break Oi}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Ri:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Si:{if(h){break Si}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Si}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Si}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ri}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Ti:{if(h){break Ti}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ti}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ti}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ri}b=H[e+4>>2]}H[q>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^o)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ui:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Vi:{if(h){break Vi}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Vi}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Vi}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ui}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Wi:{if(h){break Wi}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Wi}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Wi}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ui}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Xi:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Yi:{if(h){break Yi}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Yi}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Yi}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Xi}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Zi:{if(h){break Zi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Zi}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Zi}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Xi}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;_i:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){$i:{if(h){break $i}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break $i}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break $i}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break _i}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){aj:{if(h){break aj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break aj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break aj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break _i}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];bj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){cj:{if(h){break cj}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break cj}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break cj}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break bj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){dj:{if(h){break dj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break dj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break dj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break bj}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;ej:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){fj:{if(h){break fj}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break fj}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break fj}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break ej}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){gj:{if(h){break gj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break gj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break gj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break ej}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];hj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ij:{if(h){break ij}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break ij}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ij}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break hj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){jj:{if(h){break jj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break jj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break jj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break hj}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l}}if(aa){break bb}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4)}b=la+1|0;c=(b|0)==3;la=c?0:b;z=z-c|0;ba=ba+1|0;if(ba>>>0>=K[ma+8>>2]){break ab}if((z|0)>0){continue}break}}U=R+U|0;c=H[f+24>>2];b=J[f+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;X=X+1|0;if(X>>>0>2]){continue}break}}kj:{if(!E){break kj}lj:{c=H[f+24>>2];g=H[f+16>>2];if(c>>>0>g+2>>>0){if(!_){break lj}g=H[f+16>>2];c=H[f+24>>2];b=H[f+20>>2];H[Y+56>>2]=c-b;H[Y+52>>2]=g-b;H[Y+48>>2]=(c-g|0)-2;Ba(S,2,15235,Y+48|0);break kj}b=H[f+12>>2];if(b>>>0<3){break kj}if(_){H[Y+80>>2]=H[f+12>>2];Ba(S,2,7107,Y+80|0);break kj}H[Y+64>>2]=b;Ba(S,2,7107,Y- -64|0);break kj}b=H[f+20>>2];H[Y+40>>2]=c-b;H[Y+36>>2]=g-b;H[Y+32>>2]=(c-g|0)-2;Ba(S,2,15235,Y+32|0)}if(!H[C+60>>2]){break i}H[f+116>>2]=Z}k=H[qa+4>>2];g=H[C+12>>2];l=H[C+8>>2]-H[qa>>2]|0;c=H[qa+16>>2];if(c&1){b=H[oa+28>>2]+N(ua,152)|0;l=(H[b-144>>2]+l|0)-H[b-152>>2]|0}i=g-k|0;if(c&2){b=H[oa+28>>2]+N(ua,152)|0;i=(H[b-140>>2]+i|0)-H[b-148>>2]|0}d=H[C+60>>2];t=d?d:H[f+116>>2];p=H[f+128>>2];u=H[f+124>>2];n=H[pa+808>>2];mj:{if(!n){break mj}b=!p|!u;if((n|0)<=30){if(b){break mj}e=0;while(1){k=(N(e,u)<<2)+t|0;b=0;while(1){g=k+(b<<2)|0;q=H[g>>2];c=q>>31;c=(c^q)-c|0;if(c>>>n|0){c=c>>>H[pa+808>>2]|0;H[g>>2]=(q|0)<0?0-c|0:c}b=b+1|0;if((u|0)!=(b|0)){continue}break}e=e+1|0;if((p|0)!=(e|0)){continue}break}break mj}if(b){break mj}b=N(p,u)<<2;if(!b){break mj}y(t,0,b)}if(d){b=N(p,u);if(H[pa+20>>2]==1){if(!b){break a}f=0;if((b|0)!=1){c=b&1;b=b&-2;g=0;while(1){k=(f<<2)+t|0;H[k>>2]=H[k>>2]/2;H[k+4>>2]=H[k+4>>2]/2;f=f+2|0;g=g+2|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}b=(f<<2)+t|0;H[b>>2]=H[b>>2]/2;break a}if(!b){break a}ga=O(L[qa+32>>2]*O(.5));g=b&3;if(b>>>0>=4){c=b&-4;b=0;while(1){L[t>>2]=ga*O(H[t>>2]);L[t+4>>2]=ga*O(H[t+4>>2]);L[t+8>>2]=ga*O(H[t+8>>2]);L[t+12>>2]=ga*O(H[t+12>>2]);t=t+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}b=0;while(1){L[t>>2]=ga*O(H[t>>2]);t=t+4|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}break a}m=wa-va|0;if(H[pa+20>>2]==1){if(!p){break a}j=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;o=u&-4;i=0;while(1){b=0;if(o){d=j+(N(i,m)<<2)|0;n=(N(i,u)<<2)+t|0;while(1){q=b<<2;e=q+n|0;k=H[e+4>>2];g=H[e+8>>2];c=H[e+12>>2];q=d+q|0;H[q>>2]=H[e>>2]/2;H[q+12>>2]=(c|0)/2;H[q+8>>2]=(g|0)/2;H[q+4>>2]=(k|0)/2;b=b+4|0;if(o>>>0>b>>>0){continue}break}}nj:{if(b>>>0>=u>>>0){break nj}c=b+1|0;k=j+(N(i,m)<<2)|0;g=(N(i,u)<<2)+t|0;if(u-b&1){b=b<<2;H[b+k>>2]=H[b+g>>2]/2;b=c}if((c|0)==(u|0)){break nj}while(1){c=b<<2;H[c+k>>2]=H[c+g>>2]/2;c=c+4|0;H[c+k>>2]=H[c+g>>2]/2;b=b+2|0;if((u|0)!=(b|0)){continue}break}}i=i+1|0;if((p|0)!=(i|0)){continue}break}break a}if(!p|!u){break a}ga=O(L[qa+32>>2]*O(.5));i=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;g=u&-4;k=u&3;h=0;c=u-1>>>0<3;while(1){b=i;f=0;oj:{if(!c){while(1){L[b>>2]=ga*O(H[t>>2]);L[b+4>>2]=ga*O(H[t+4>>2]);L[b+8>>2]=ga*O(H[t+8>>2]);L[b+12>>2]=ga*O(H[t+12>>2]);b=b+16|0;t=t+16|0;f=f+4|0;if((g|0)!=(f|0)){continue}break}if(!k){break oj}}f=0;while(1){L[b>>2]=ga*O(H[t>>2]);b=b+4|0;t=t+4|0;f=f+1|0;if((k|0)!=(f|0)){continue}break}}i=(m<<2)+i|0;h=h+1|0;if((p|0)!=(h|0)){continue}break}break a}H[Y>>2]=z;Ba(S,2,8716,Y)}H[H[d>>2]>>2]=0}Ca(a);na=Y+96|0} +function ib(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=O(0),da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=O(0),Aa=0,Ga=0,Ka=0,La=0,Ma=0,Na=0,Pa=O(0),Ra=0,Ua=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,fb=0,gb=0,hb=0,ib=0,kb=0,lb=0,mb=0,pb=0,qb=0,rb=0,sb=0,tb=0;Aa=na-16|0;na=Aa;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}ua=H[a+180>>2]+N(b,5644)|0;E=H[ua+5596>>2];if(!E){jb(ua);break a}g=H[a+100>>2];if(!g){g=H[a+96>>2]}q=H[g>>2];p=H[g+4>>2];k=H[g+8>>2];v=H[g+12>>2];g=H[a+60>>2];h=H[a+64>>2];i=H[ua+5600>>2];ra=na-16|0;na=ra;D=H[a+232>>2];H[D+36>>2]=b;j=H[H[D+28>>2]+76>>2];H[D+64>>2]=1;H[D+60>>2]=v;H[D+56>>2]=k;H[D+52>>2]=p;H[D+48>>2]=q;H[D+32>>2]=j+N(b,5644);Ca(H[D+68>>2]);p=0;H[D+68>>2]=0;b:{if(g){p=Ea(4,H[H[D+24>>2]+16>>2]);if(!p){break b}q=g&3;c:{if(g>>>0>=4){k=g&-4;b=0;while(1){g=h+(X<<2)|0;H[(H[g>>2]<<2)+p>>2]=1;H[(H[g+4>>2]<<2)+p>>2]=1;H[(H[g+8>>2]<<2)+p>>2]=1;H[(H[g+12>>2]<<2)+p>>2]=1;X=X+4|0;b=b+4|0;if((k|0)!=(b|0)){continue}break}if(!q){break c}}while(1){H[(H[h+(X<<2)>>2]<<2)+p>>2]=1;X=X+1|0;s=s+1|0;if((q|0)!=(s|0)){continue}break}}H[D+68>>2]=p}d:{A=H[D+24>>2];m=H[A+16>>2];e:{if(!m){break e}X=0;f:{while(1){g:{if(H[(X<<2)+p>>2]?0:p){break g}h=H[A+24>>2]+N(X,52)|0;b=H[h+4>>2];k=b-1|0;q=H[D+60>>2];v=k+q|0;g=0-!b|0;j=ve(v,q>>>0>v>>>0?g+1|0:g,b,0);h=H[h>>2];l=h-1|0;v=H[D+56>>2];s=l+v|0;q=0-!h|0;r=ve(s,s>>>0>>0?q+1|0:q,h,0);t=k;k=H[D+52>>2];v=t+k|0;k=ve(v,k>>>0>v>>>0?g+1|0:g,b,0);b=H[H[H[D+20>>2]>>2]+20>>2]+N(X,76)|0;g=H[b+20>>2]-H[b+24>>2]|0;if(g>>>0>31){break g}v=H[b+12>>2];s=H[b+8>>2];t=H[b+4>>2];V=l;l=H[D+48>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?q+1|0:q,h,0);b=h-H[b>>2]|0;h:{if((b>>>0<=h>>>0?b:0)>>>g|0){break h}b=k-t|0;if((b>>>0<=k>>>0?b:0)>>>g|0){break h}b=s-r|0;if((b>>>0<=s>>>0?b:0)>>>g|0){break h}b=v-j|0;if(!((b>>>0<=v>>>0?b:0)>>>g|0)){break g}}H[D+64>>2]=0;break f}X=X+1|0;if((m|0)!=(X|0)){continue}break}if(!H[D+64>>2]){break f}s=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(s,76)|0;g=H[b+28>>2]+N(H[b+24>>2],152)|0;h=H[g-148>>2];q=H[g-140>>2];p=H[g-152>>2];g=H[g-144>>2];k=H[D+68>>2];i:{if(H[k+(s<<2)>>2]?0:k){break i}k=q-h|0;g=g-p|0;re(k,0,g);if(!(!qa|(h|0)==(q|0))){X=0;Ba(f,1,2982,0);break b}g=N(g,k);if(g>>>0>=1073741824){X=0;Ba(f,1,2982,0);break b}g=g<<2;H[b+44>>2]=g;j:{k:{l:{h=H[b+36>>2];if(h){if(g>>>0<=K[b+48>>2]){break i}if(H[b+40>>2]){break l}}g=Ia(g);H[b+36>>2]=g;h=g;g=H[b+44>>2];if(!(g?h:1)){break k}H[b+40>>2]=1;H[b+48>>2]=g;break i}Ca(h);g=Ia(H[b+44>>2]);H[b+36>>2]=g;if(g){break j}H[b+48>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0}X=0;Ba(f,1,2982,0);break b}H[b+40>>2]=1;H[b+48>>2]=H[b+44>>2]}s=s+1|0;A=H[D+24>>2];if(s>>>0>2]){continue}break}break e}M=H[A+24>>2];W=H[H[H[D+20>>2]>>2]+20>>2];b=0;while(1){m:{if(H[(b<<2)+p>>2]?0:p){break m}g=W+N(b,76)|0;q=H[g>>2];k=M+N(b,52)|0;h=H[k>>2];l=h-1|0;v=H[D+48>>2];j=l+v|0;s=0-!h|0;v=ve(j,j>>>0>>0?s+1|0:s,h,0);q=q>>>0>v>>>0?q:v;H[g+56>>2]=q;v=H[g+4>>2];k=H[k+4>>2];r=k-1|0;t=H[D+52>>2];x=r+t|0;j=0-!k|0;t=ve(x,t>>>0>x>>>0?j+1|0:j,k,0);v=v>>>0>t>>>0?v:t;H[g+60>>2]=v;t=H[g+8>>2];V=l;l=H[D+56>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?s+1|0:s,h,0);h=h>>>0>t>>>0?t:h;H[g+64>>2]=h;s=H[g+12>>2];l=H[D+60>>2];r=r+l|0;k=ve(r,l>>>0>r>>>0?j+1|0:j,k,0);k=k>>>0>s>>>0?s:k;H[g+68>>2]=k;if(h>>>0>>0|k>>>0>>0){break d}r=H[g+20>>2];if(!r){break m}t=k-1|0;J=0-!k|0;Z=h-1|0;R=0-!h|0;x=v-1|0;S=0-!v|0;Y=q-1|0;z=0-!q|0;$=H[g+28>>2];k=0;h=0;while(1){v=$+N(k,152)|0;q=r+(k^-1)|0;g=q&31;if((q&63)>>>0>=32){l=1<>>32-g}g=t+s|0;j=l+J|0;w=g>>>0>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+148>>2]=g;g=l+R|0;V=g+1|0;j=g;g=s+Z|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+144>>2]=g;g=l+S|0;V=g+1|0;j=g;g=s+x|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+140>>2]=g;g=l+z|0;j=s+Y|0;s=j>>>0>>0?g+1|0:g;g=q&31;if((q&63)>>>0>=32){g=s>>>g|0}else{g=((1<>>g}H[v+136>>2]=g;k=k+1|0;h=k?h:h+1|0;if(h|(k|0)!=(r|0)){continue}break}}b=b+1|0;if((m|0)!=(b|0)){continue}break}}X=0;H[ra+8>>2]=0;b=H[D+28>>2];Y=Ea(1,8);if(Y){H[Y+4>>2]=b;H[Y>>2]=A}if(!Y){break b}Z=H[H[D+20>>2]>>2];x=na-144|0;na=x;l=H[D+36>>2];b=N(l,5644);h=H[Y+4>>2];R=b+H[h+76>>2]|0;_=H[R+420>>2];k=0;q=0;t=na-32|0;na=t;J=b+H[h+76>>2]|0;$=H[J+420>>2];S=H[Y>>2];m=S;w=H[m+16>>2];v=Fa(N(w,528));n:{if(!v){break n}b=Fa(w<<2);o:{if(!b){b=v;break o}p=H[h+76>>2]+N(l,5644)|0;M=H[p+420>>2];s=M+1|0;g=Ea(s,240);p:{if(g){q:{if(s){r=H[m+16>>2];s=g;while(1){H[s+236>>2]=f;j=Ea(r,16);H[s+200>>2]=j;if(!j){break q}W=H[m+16>>2];H[s+196>>2]=W;r=0;j=0;if(W){while(1){r=H[s+200>>2]+(j<<4)|0;W=H[p+5584>>2]+N(j,1080)|0;z=Ea(H[W+4>>2],16);H[r+12>>2]=z;if(!z){break q}H[r+8>>2]=H[W+4>>2];j=j+1|0;r=H[m+16>>2];if(j>>>0>>0){continue}break}}s=s+240|0;j=(o|0)==(M|0);o=o+1|0;if(!j){continue}break}}break p}p=H[g+4>>2];if(p){Ca(p);H[g+4>>2]=0}s=g;p=0;while(1){j=H[s+200>>2];if(j){r=0;o=H[s+196>>2];if(o){while(1){W=H[j+12>>2];if(W){Ca(W);H[j+12>>2]=0;o=H[s+196>>2]}j=j+16|0;r=r+1|0;if(r>>>0>>0){continue}break}j=H[s+200>>2]}Ca(j);H[s+200>>2]=0}s=s+240|0;j=(p|0)==(M|0);p=p+1|0;if(!j){continue}break}Ca(g)}g=0}if(g){r:{if(!w){break r}j=w&7;p=v;if(w>>>0>=8){r=w&-8;while(1){s=(n<<2)+b|0;H[s+28>>2]=p+3696;H[s+24>>2]=p+3168;H[s+20>>2]=p+2640;H[s+16>>2]=p+2112;H[s+12>>2]=p+1584;H[s+8>>2]=p+1056;H[s+4>>2]=p+528;H[s>>2]=p;n=n+8|0;p=p+4224|0;k=k+8|0;if((r|0)!=(k|0)){continue}break}if(!j){break r}}while(1){H[(n<<2)+b>>2]=p;n=n+1|0;p=p+528|0;u=u+1|0;if((j|0)!=(u|0)){continue}break}}u=b;r=0;s=H[(H[h+76>>2]+N(l,5644)|0)+5584>>2];p=H[m+24>>2];b=H[h+24>>2];k=(l>>>0)/(b>>>0)|0;b=H[h+4>>2]+N(H[h+12>>2],l-N(b,k)|0)|0;n=H[m>>2];H[t+20>>2]=b>>>0>n>>>0?b:n;n=b+H[h+12>>2]|0;b=b>>>0>n>>>0?-1:n;n=H[m+8>>2];H[t+16>>2]=b>>>0>>0?b:n;b=H[h+8>>2]+N(k,H[h+16>>2])|0;k=H[m+4>>2];H[t+12>>2]=b>>>0>k>>>0?b:k;h=b+H[h+16>>2]|0;b=b>>>0>h>>>0?-1:h;h=H[m+12>>2];H[t+8>>2]=b>>>0>>0?b:h;H[t+24>>2]=0;H[t+28>>2]=0;H[t+4>>2]=2147483647;H[t>>2]=2147483647;if(H[m+16>>2]){while(1){h=u?H[u+(r<<2)>>2]:0;b=H[p+4>>2];M=b-1|0;k=H[t+8>>2];j=M+k|0;n=0-!b|0;j=ve(j,k>>>0>j>>>0?n+1|0:n,b,0);k=H[p>>2];W=k-1|0;o=H[t+16>>2];z=W+o|0;l=0-!k|0;o=ve(z,o>>>0>z>>>0?l+1|0:l,k,0);V=M;M=H[t+12>>2];z=V+M|0;n=ve(z,z>>>0>>0?n+1|0:n,b,0);b=H[t+20>>2];M=b+W|0;k=ve(M,b>>>0>M>>>0?l+1|0:l,k,0);b=H[s+4>>2];if(b>>>0>K[t+28>>2]){H[t+28>>2]=b;b=H[s+4>>2]}if(b){da=s+944|0;ka=s+812|0;ba=j-1|0;oa=0-!j|0;aa=o-1|0;la=0-!o|0;ga=n-1|0;ia=0-!n|0;C=k-1|0;ha=0-!k|0;o=0;while(1){k=o<<2;M=H[k+da>>2];W=H[k+ka>>2];n=0;if(h){H[h+4>>2]=M;H[h>>2]=W;n=h+8|0}b=b-1|0;h=W+b|0;s:{if(h>>>0>31){break s}k=H[p>>2];if(k>>>0>-1>>>h>>>0){break s}j=H[t+4>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=b+M|0;t:{if(h>>>0>31){break t}k=H[p+4>>2];if(k>>>0>-1>>>h>>>0){break t}j=H[t>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=0;k=b&31;if((b&63)>>>0>=32){l=1<>>32-k}ea=j;j=ba+ea|0;k=l;l=oa+k|0;A=j>>>0>>0?l+1|0:l;z=b&31;l=M&31;if((M&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>z|0}else{A=((1<>>z}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=M&31;z=k+ia|0;V=ga+ea|0;z=V>>>0>>0?z+1|0:z;if((M&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}l=j;j=b&31;if((b&63)>>>0>=32){j=z>>>j|0}else{j=((1<>>j}z=(j|0)!=(A|0)?l-(j>>>M|0)&-1>>>M:0;j=k+la|0;l=j+1|0;V=j;j=aa+ea|0;A=j>>>0>>0?l:V;M=b&31;l=W&31;if((W&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>M|0}else{A=((1<>>M}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=W&31;k=k+ha|0;ea=C+ea|0;M=ea>>>0>>0?k+1|0:k;k=b&31;if((W&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}if((b&63)>>>0>=32){k=M>>>k|0}else{k=((1<>>k}k=(k|0)!=(A|0)?j-(k>>>W|0)&-1>>>W:0;if(n){H[n+4>>2]=z;H[n>>2]=k;h=n+8|0}k=N(k,z);if(k>>>0>K[t+24>>2]){H[t+24>>2]=k}o=o+1|0;if(o>>>0>2]){continue}break}}p=p+52|0;s=s+1080|0;r=r+1|0;if(r>>>0>2]){continue}break}}M=$+1|0;r=H[t+28>>2];l=H[t+24>>2];H[g+4>>2]=0;b=H[J+8>>2]+1|0;W=N(l,w);o=N(W,r);re(b,0,o);u:{if(!qa){b=N(b,o);H[g+8>>2]=b;b=Ea(b,2);H[g+4>>2]=b;if(b){break u}}Ca(v);Ca(u);b=H[g+4>>2];if(b){Ca(b);H[g+4>>2]=0}if(!M){b=g;break o}b=0;k=g;while(1){p=H[k+200>>2];if(p){m=0;n=H[k+196>>2];if(n){while(1){h=H[p+12>>2];if(h){Ca(h);H[p+12>>2]=0;n=H[k+196>>2]}p=p+16|0;m=m+1|0;if(n>>>0>m>>>0){continue}break}p=H[k+200>>2]}Ca(p);H[k+200>>2]=0}k=k+240|0;h=(b|0)==($|0);b=b+1|0;if(!h){continue}break}b=g;break o}j=H[m+24>>2];z=H[t+20>>2];H[g+204>>2]=z;ea=H[t+12>>2];H[g+208>>2]=ea;ba=H[t+16>>2];H[g+212>>2]=ba;aa=H[t+8>>2];H[g+216>>2]=aa;H[g+12>>2]=o;H[g+16>>2]=W;H[g+20>>2]=l;q=1;H[g+24>>2]=1;if(w){k=H[g+200>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];h=H[k+8>>2];v:{if(!h){break v}m=H[k+12>>2];if((h|0)!=1){ga=h&1;h=h&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((h|0)!=(n|0)){continue}break}if(!ga){break v}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}if(M>>>0>1){h=g;while(1){H[h+456>>2]=aa;H[h+452>>2]=ba;H[h+448>>2]=ea;H[h+444>>2]=z;H[h+264>>2]=1;H[h+260>>2]=l;H[h+256>>2]=W;H[h+252>>2]=o;if(w){k=H[h+440>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];n=H[k+8>>2];w:{if(!n){break w}m=H[k+12>>2];if((n|0)!=1){M=n&1;ga=n&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((ga|0)!=(n|0)){continue}break}if(!M){break w}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}b=H[h+8>>2];H[h+244>>2]=H[h+4>>2];H[h+248>>2]=b;b=(q|0)!=($|0);h=h+240|0;q=q+1|0;if(b){continue}break}}Ca(v);Ca(u);b=H[J+420>>2];x:{if(I[J+5640|0]&4){if((b|0)==-1){break x}m=J+424|0;h=H[J+8>>2];n=0;p=g;while(1){q=H[m+36>>2];H[p+44>>2]=1;H[p+84>>2]=q;H[p+48>>2]=H[m>>2];q=H[m+4>>2];H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=q;H[p+60>>2]=H[m+12>>2];H[p+64>>2]=H[m+16>>2];q=H[m+8>>2];H[p+76>>2]=l;H[p+56>>2]=h>>>0>q>>>0?q:h;m=m+148|0;p=p+240|0;q=(b|0)==(n|0);n=n+1|0;if(!q){continue}break}break x}if((b|0)==-1){break x}h=H[J+8>>2];q=H[J+4>>2];p=g;if(b){k=b+1&-2;u=0;while(1){H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+324>>2]=q;H[p+76>>2]=l;H[p+56>>2]=h;H[p+308>>2]=0;H[p+312>>2]=0;H[p+292>>2]=0;H[p+284>>2]=1;H[p+288>>2]=0;H[p+300>>2]=r;H[p+296>>2]=h;H[p+316>>2]=l;H[p+64>>2]=H[p+196>>2];H[p+304>>2]=H[p+436>>2];p=p+480|0;u=u+2|0;if((k|0)!=(u|0)){continue}break}if(b&1){break x}}H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+76>>2]=l;H[p+56>>2]=h;H[p+64>>2]=H[p+196>>2]}q=g;break n}Ca(v)}Ca(b)}na=t+32|0;g=q;y:{z:{if(!g){break z}M=_+1|0;s=E;v=g;A:{B:{while(1){if(H[v+84>>2]==-1){break A}l=Fa(H[S+16>>2]<<2);if(!l){break A}b=H[S+16>>2]<<2;if(b){y(l,1,b)}if(Vb(v)){while(1){k=H[Z+20>>2];C:{D:{if(K[v+40>>2]>=K[R+12>>2]){break D}b=H[v+32>>2];h=N(H[v+28>>2],76)+k|0;if(b>>>0>=K[h+24>>2]){break D}h=H[h+28>>2]+N(b,152)|0;if(!H[h+24>>2]){break D}q=h+28|0;j=0;E:{while(1){p=q+N(j,36)|0;b=H[p+20>>2]+N(H[v+36>>2],40)|0;if(!xb(D,H[v+28>>2],H[v+32>>2],H[p+16>>2],H[b>>2],H[b+4>>2],H[b+8>>2],H[b+12>>2])){j=j+1|0;if(j>>>0>2]){continue}break E}break}H[l+(H[v+28>>2]<<2)>>2]=0;H[x+136>>2]=0;if(!Ub(H[Y+4>>2],H[Z+20>>2],R,v,x+140|0,s,x+136|0,i,f)){break B}j=H[v+32>>2];o=H[v+28>>2];m=H[x+136>>2];if(H[x+140>>2]){H[x+136>>2]=0;W=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(j,152)|0;k=H[W+24>>2];if(k){w=i-m|0;J=i+s|0;o=W+28|0;t=0;r=0;z=m+s|0;u=z;while(1){F:{if(H[o+8>>2]==H[o>>2]|H[o+12>>2]==H[o+4>>2]){break F}b=H[o+20>>2]+N(H[v+36>>2],40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break F}k=H[b+24>>2];h=0;while(1){p=H[k+36>>2];if(p){G:{if(r|H[k+64>>2]){H[k+52>>2]=0;j=1;b=64;break G}j=H[k>>2];b=H[k+40>>2];H:{if(b){j=N(b,24)+j|0;if(H[j-20>>2]!=H[j-12>>2]){j=j-24|0;break H}b=b+1|0}else{b=1}H[k+40>>2]=b}b=H[j+20>>2];I:{J:{if(b>>>0>(u^-1)>>>0){break J}q=j+20|0;while(1){if(J>>>0>>0){break J}n=H[k+4>>2];r=H[k+52>>2];if((r|0)!=H[k+56>>2]){q=p}else{b=r<<1|1;n=Ha(n,b<<3);if(!n){Ba(f,1,1024,0);break B}H[k+56>>2]=b;H[k+4>>2]=n;r=H[k+52>>2];b=H[q>>2];q=H[k+36>>2]}p=(r<<3)+n|0;H[p+4>>2]=b;H[p>>2]=u;H[k+52>>2]=r+1;H[j>>2]=H[j>>2]+b;n=H[j+16>>2];r=n+H[j+4>>2]|0;H[j+4>>2]=r;p=q-n|0;H[k+36>>2]=p;H[j+8>>2]=r;u=b+u|0;r=0;if((n|0)==(q|0)){break I}H[k+40>>2]=H[k+40>>2]+1;q=j+44|0;b=H[j+44>>2];j=j+24|0;if((u^-1)>>>0>=b>>>0){continue}break}}q=H[v+28>>2];p=H[v+32>>2];n=H[v+36>>2];if(H[H[Y+4>>2]+104>>2]){H[x+120>>2]=q;H[x+116>>2]=p;H[x+112>>2]=t;H[x+108>>2]=n;H[x+104>>2]=h;H[x+100>>2]=w;H[x+96>>2]=b;Ba(f,1,14693,x+96|0);break B}H[x+88>>2]=q;H[x+84>>2]=p;H[x+80>>2]=t;H[x+76>>2]=n;H[x+72>>2]=h;H[x+68>>2]=w;H[x+64>>2]=b;Ba(f,2,14693,x- -64|0);H[k+52>>2]=0;H[k+64>>2]=1;r=1}j=H[k+40>>2];b=44}H[b+k>>2]=j}k=k+68|0;h=h+1|0;if(($|0)!=(h|0)){continue}break}k=H[W+24>>2]}o=o+36|0;t=t+1|0;if(t>>>0>>0){continue}break}j=H[v+32>>2];o=H[v+28>>2];b=r?w:u-z|0}else{b=0}m=b+m|0}h=H[S+24>>2]+N(o,52)|0;b=H[h+36>>2];H[h+36>>2]=b>>>0>>0?j:b;break C}k=H[Z+20>>2]}H[x+136>>2]=0;if(!Ub(H[Y+4>>2],k,R,v,x+140|0,s,x+136|0,i,f)){break B}o=H[v+28>>2];m=H[x+136>>2];if(!H[x+140>>2]){break C}J=H[v+32>>2];b=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(J,152)|0;z=H[b+24>>2];if(!z){break C}w=i-m|0;n=b+28|0;W=H[v+36>>2];j=0;r=0;K:{L:{while(1){M:{if(H[n+8>>2]==H[n>>2]|H[n+12>>2]==H[n+4>>2]){break M}b=H[n+20>>2]+N(W,40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break M}p=H[b+24>>2];t=0;while(1){b=H[p+36>>2];if(b){k=H[p>>2];h=H[p+40>>2];N:{if(h){k=N(h,24)+k|0;if(H[k-20>>2]!=H[k-12>>2]){k=k-24|0;break N}h=h+1|0}else{h=1}H[p+40>>2]=h}u=H[k+20>>2];j=u+j|0;if(j>>>0>>0|j>>>0>w>>>0){break K}while(1){O:{u=H[k+16>>2];H[k+4>>2]=u+H[k+4>>2];q=b-u|0;if((b|0)==(u|0)){break O}h=h+1|0;H[p+40>>2]=h;u=H[k+44>>2];j=u+j|0;if(j>>>0>>0){break L}k=k+24|0;b=q;if(j>>>0<=w>>>0){continue}break L}break}H[p+36>>2]=q}p=p+68|0;t=t+1|0;if(($|0)!=(t|0)){continue}break}}n=n+36|0;r=r+1|0;if((z|0)!=(r|0)){continue}break}m=j+m|0;break C}H[p+36>>2]=q}if(!H[H[Y+4>>2]+104>>2]){H[x+24>>2]=o;H[x+20>>2]=J;H[x+16>>2]=r;H[x+12>>2]=W;H[x+8>>2]=t;H[x+4>>2]=w;H[x>>2]=u;Ba(f,2,14608,x);o=H[v+28>>2];m=m+w|0;break C}H[x+56>>2]=o;H[x+52>>2]=J;H[x+48>>2]=r;H[x+44>>2]=W;H[x+40>>2]=t;H[x+36>>2]=w;H[x+32>>2]=u;Ba(f,1,14608,x+32|0);break B}P:{if(!H[l+(o<<2)>>2]){break P}b=H[S+24>>2]+N(o,52)|0;if(H[b+36>>2]){break P}H[b+36>>2]=H[(H[Z+20>>2]+N(o,76)|0)+24>>2]-1}i=i-m|0;s=m+s|0;if(Vb(v)){continue}break}}Ca(l);v=v+240|0;Q=Q+1|0;if(Q>>>0<=K[R+420>>2]){continue}break}yb(g,M);H[ra+8>>2]=s-E;b=1;break y}yb(g,M);Ca(l);break z}yb(g,M)}b=0}na=x+144|0;db(Y);if(!b){break b}X=H[H[D+32>>2]+5584>>2];j=H[H[D+20>>2]>>2];C=H[j+20>>2];H[ra+12>>2]=1;s=0;b=H[D+32>>2];l=H[X+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];A=H[j+16>>2];Q:{if(!A){break Q}while(1){b=H[D+68>>2];if(!(H[b+(s<<2)>>2]?0:b)){u=ra+12|0;A=0;b=H[C+24>>2];R:{if(!b){break R}m=H[D+44>>2];while(1){q=H[C+28>>2]+N(A,152)|0;p=H[q+24>>2];if(p){o=q+28|0;b=H[q+20>>2];v=H[q+16>>2];r=0;while(1){if(N(b,v)){n=o+N(r,36)|0;k=0;while(1){g=H[n+20>>2]+N(k,40)|0;i=xb(D,H[C+16>>2],A,H[n+16>>2],H[g>>2],H[g+4>>2],H[g+8>>2],H[g+12>>2]);h=H[g+16>>2];p=H[g+20>>2];b=N(h,p);S:{if(i){if(!b){break S}h=0;while(1){i=H[g+24>>2]+N(h,68)|0;T:{if(!xb(D,H[C+16>>2],A,H[n+16>>2],H[i+8>>2],H[i+12>>2],H[i+16>>2],H[i+20>>2])){b=H[i+60>>2];if(!b){break T}Ca(b);H[i+60>>2]=0;break T}if(!H[D+64>>2]){if(H[i+60>>2]|H[i+16>>2]==H[i+8>>2]|H[i+20>>2]==H[i+12>>2]){break T}}b=Ea(1,44);if(!b){H[ra+12>>2]=0;break R}p=H[D+64>>2];H[b+36>>2]=0;H[b+28>>2]=u;H[b+20>>2]=X;H[b+16>>2]=C;H[b+12>>2]=n;H[b+8>>2]=i;H[b+4>>2]=A;H[b>>2]=p;H[b+40>>2]=l;H[b+32>>2]=f;H[b+24>>2]=H[m+4>>2]>1;eb(m,14,b);if(!H[ra+12>>2]){break R}}h=h+1|0;if(h>>>0>2],H[g+16>>2])>>>0){continue}break}break S}if(!b){break S}v=0;while(1){b=H[g+24>>2]+N(v,68)|0;i=H[b+60>>2];if(i){Ca(i);H[b+60>>2]=0;p=H[g+20>>2];h=H[g+16>>2]}v=v+1|0;if(v>>>0>>0){continue}break}}k=k+1|0;b=H[q+20>>2];v=H[q+16>>2];if(k>>>0>>0){continue}break}p=H[q+24>>2]}r=r+1|0;if(r>>>0

    >>0){continue}break}b=H[C+24>>2]}A=A+1|0;if(A>>>0>>0){continue}break}}if(!H[ra+12>>2]){break Q}A=H[j+16>>2]}X=X+1080|0;C=C+76|0;s=s+1|0;if(A>>>0>s>>>0){continue}break}}X=0;Sa(H[D+44>>2]);if(!H[ra+12>>2]){break b}U:{if(H[D+64>>2]){break U}s=H[D+24>>2];if(!H[s+16>>2]){break U}C=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(C,76)|0;g=H[b+28>>2]+N(H[(H[s+24>>2]+N(C,52)|0)+36>>2],152)|0;i=H[g+136>>2];h=H[g+144>>2];q=H[g+140>>2];g=H[g+148>>2];Ca(H[b+52>>2]);H[b+52>>2]=0;V:{p=H[D+68>>2];if((h|0)==(i|0)|(g|0)==(q|0)|(H[p+(C<<2)>>2]?0:p)){break V}g=g-q|0;i=h-i|0;re(g,0,i);if(qa){Ba(f,1,2982,0);break b}g=N(g,i);if(g>>>0>=1073741824){Ba(f,1,2982,0);break b}i=b;b=Ia(g<<2);H[i+52>>2]=b;if(b){break V}Ba(f,1,2982,0);break b}C=C+1|0;s=H[D+24>>2];if(C>>>0>2]){continue}break}}s=H[D+32>>2];v=H[H[D+20>>2]>>2];if(H[v+16>>2]){C=H[v+20>>2];s=H[s+5584>>2];A=H[H[D+24>>2]+24>>2];p=0;while(1){W:{b=H[D+68>>2];if(H[b+(p<<2)>>2]?0:b){break W}j=H[A+36>>2]+1|0;if(H[s+20>>2]==1){Y=j;b=0;_=na-32|0;na=_;X:{Y:{if(H[D+64>>2]){g=1;if((j|0)==1){break X}k=H[C+28>>2];b=k+N(H[C+24>>2],152)|0;h=H[b-144>>2];q=H[b-152>>2];if((h|0)==(q|0)){break X}n=j-1|0;b=0;m=H[D+44>>2];l=H[m+4>>2];i=k;Z:{if((j|0)!=2){j=n&1;r=n&-2;g=0;while(1){u=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>u>>>0?b:u;i=i+304|0;g=g+2|0;if((r|0)!=(g|0)){continue}break}if(!j){break Z}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}g=0;if(b>>>0>134217727){break X}i=H[k+4>>2];u=H[k+12>>2];t=H[k>>2];E=H[k+8>>2];o=b<<5;j=ob(o);H[_+16>>2]=j;if(!j){break X}r=h-q|0;g=u-i|0;q=E-t|0;H[_>>2]=j;while(1){u=H[C+36>>2];h=g;H[_+8>>2]=g;b=q;H[_+24>>2]=b;g=H[k+156>>2];i=H[k+164>>2];q=H[k+160>>2];t=H[k+152>>2];H[_+28>>2]=(t|0)%2;q=q-t|0;H[_+20>>2]=q-b;x=(l|0)<2;g=i-g|0;_:{if(!(!x&g>>>0>1)){i=0;if(!g){break _}while(1){$b(_+16|0,u+(N(i,r)<<2)|0);i=i+1|0;if((i|0)!=(g|0)){continue}break}break _}t=g>>>0>>0?g:l;Y=t-1|0;E=(g>>>0)/(t>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}w=H[_+28>>2];H[i+8>>2]=H[_+24>>2];H[i+12>>2]=w;w=H[_+20>>2];H[i>>2]=H[_+16>>2];H[i+4>>2]=w;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=q;H[i+28>>2]=N(b,E);w=(b|0)==(Y|0);b=b+1|0;H[i+32>>2]=w?g:N(E,b);w=ob(o);H[i>>2]=w;if(!w){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,10,i);if((b|0)!=(t|0)){continue}break}Sa(m)}H[_+4>>2]=g-h;H[_+12>>2]=H[k+156>>2]%2;$:{if(!(!x&q>>>0>1)){b=8;i=0;if(q>>>0>=8){while(1){nb(_,u+(i<<2)|0,r,8);i=b;b=b+8|0;if(q>>>0>=b>>>0){continue}break}}if(i>>>0>=q>>>0){break $}nb(_,u+(i<<2)|0,r,q-i|0);break $}h=l>>>0>q>>>0?q:l;E=h-1|0;t=(q>>>0)/(h>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}x=H[_+12>>2];H[i+8>>2]=H[_+8>>2];H[i+12>>2]=x;x=H[_+4>>2];H[i>>2]=H[_>>2];H[i+4>>2]=x;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=g;H[i+28>>2]=N(b,t);x=(b|0)==(E|0);b=b+1|0;H[i+32>>2]=x?q:N(t,b);x=ob(o);H[i>>2]=x;if(!x){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,11,i);if((b|0)!=(h|0)){continue}break}Sa(m)}k=k+152|0;n=n-1|0;if(n){continue}break}g=1;Ca(j);break X}g=1;k=H[C+28>>2];ma=k+N(Y,152)|0;gb=ma-152|0;if(H[gb>>2]==H[ma-144>>2]){break X}hb=ma-148|0;if(H[hb>>2]==H[ma-140>>2]){break X}h=H[k+4>>2];q=H[k+12>>2];n=H[k>>2];j=H[k+8>>2];w=H[C+68>>2];M=H[C+64>>2];W=H[C+60>>2];J=H[C+56>>2];oa=_b(C,Y);if(!oa){g=0;break X}aa:{ba:{if((Y|0)!=1){i=k;ca:{if((Y|0)!=2){g=Y-1|0;m=g&1;l=g&-2;g=0;while(1){r=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>r>>>0?b:r;i=i+304|0;g=g+2|0;if((l|0)!=(g|0)){continue}break}if(!m){break ca}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}if(b>>>0>=268435456){break aa}o=ob(b<<4);if(!o){break aa}da:{if(!Y){break da}u=q-h|0;m=j-n|0;ib=o+28|0;$=o+24|0;Ra=o+16|0;ha=o+4|0;sa=1;ea:while(1){b=H[k+156>>2];ja=(b|0)%2|0;g=H[k+152>>2];pa=(g|0)%2|0;Z=H[k+164>>2]-b|0;ka=Z-u|0;R=H[k+160>>2]-g|0;da=R-m|0;i=J;g=i;t=W;q=t;b=M;fa=b;h=w;n=h;j=H[C+20>>2];fa:{if((j|0)==(sa|0)){break fa}r=j-sa|0;q=0;g=0;if(i){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=i+(g^-1)|0;g=l^-1;i=b>>>0>>0?g+1|0:g;g=r&31;if((r&63)>>>0>=32){g=i>>>g|0}else{g=((1<>>g}}if(W){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=W+(i^-1)|0;i=l^-1;h=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){q=h>>>i|0}else{q=((1<>>i}}h=0;b=0;if(M){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=M+(i^-1)|0;i=l^-1;n=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){b=n>>>i|0}else{b=((1<>>i}}if(w){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}i=w+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=r&31;if((r&63)>>>0>=32){h=n>>>h|0}else{h=((1<>>h}}fa=0;i=0;E=1<>>0>>0){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}n=n^-1;i=n+(J-E|0)|0;j=l^-1;j=i>>>0>>0?j+1|0:j;n=r&31;if((r&63)>>>0>=32){i=j>>>n|0}else{i=((1<>>n}}if(E>>>0>>0){n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(M-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){fa=l>>>j|0}else{fa=((1<>>j}}n=0;t=0;if(E>>>0>>0){j=r&31;if((r&63)>>>0>=32){l=-1<>>32-j}t=t^-1;j=t+(W-E|0)|0;l=l^-1;t=j>>>0>>0?l+1|0:l;l=r&31;if((r&63)>>>0>=32){t=t>>>l|0}else{t=((1<>>l}}if(w>>>0<=E>>>0){break fa}n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(w-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){n=l>>>j|0}else{n=((1<>>j}}j=H[k+180>>2];l=fa-j|0;l=l>>>0<=fa>>>0?l:0;r=l+2|0;l=l>>>0>r>>>0?-1:r;la=l>>>0>>0?l:da;l=H[k+216>>2];r=b-l|0;b=b>>>0>=r>>>0?r:0;r=b+2|0;b=b>>>0>r>>>0?-1:r;ia=b>>>0>>0?b:m;b=(pa?la:ia)<<1;r=(pa?ia:la)<<1|1;va=b>>>0>r>>>0?b:r;b=va>>>0>>0;j=i-j|0;i=i>>>0>=j>>>0?j:0;j=i-2|0;r=i>>>0>=j>>>0?j:0;i=g-l|0;g=g>>>0>=i>>>0?i:0;i=g-2|0;i=g>>>0>=i>>>0?i:0;g=(pa?r:i)<<1;l=(pa?i:r)<<1|1;x=g>>>0>>0;E=H[k+184>>2];j=q-E|0;q=j>>>0<=q>>>0?j:0;j=q-2|0;q=j>>>0<=q>>>0?j:0;ea=q;S=H[k+220>>2];j=t-S|0;j=j>>>0<=t>>>0?j:0;t=j-2|0;j=j>>>0>=t>>>0?t:0;ba=j;t=h-E|0;h=h>>>0>=t>>>0?t:0;t=h+2|0;h=h>>>0>t>>>0?-1:t;E=h>>>0>>0?h:u;Q=E;h=n-S|0;h=h>>>0<=n>>>0?h:0;n=h+2|0;h=h>>>0>n>>>0?-1:n;V=h>>>0>>0?h:ka;n=V;if(ja){ea=j;ba=q;Q=n;n=E}wa=b?va:R;l=x?g:l;kb=u+V|0;lb=j+u|0;if(Z){ta=o+(i<<3)|0;b=o+(da<<3)|0;xa=b-4|0;g=(i|0)<(da|0);Ua=g?ta+4|0:xa;ya=m-1|0;Wa=(la|0)<(ya|0)?la:ya;x=0;Xa=(m|0)>1|(da|0)>0;h=pa<<2;Ya=(ha-h|0)+(r<<3)|0;_a=h+ta|0;z=(da|0)>(ia|0)?ia:da;aa=i+1|0;$a=m+la|0;La=m+r|0;ab=o+(l<<2)|0;Ma=!m&(da|0)==1;h=o+(m<<3)|0;ga=h-8|0;Ga=h-4|0;Ka=b-8|0;Na=o+(wa<<2)|0;bb=Na-4|0;cb=(o+((g?i:da)<<3)|0)-4|0;while(1){ga:{if(!(x>>>0>>0&q>>>0<=x>>>0|x>>>0>>0&x>>>0>=lb>>>0)){S=x+1|0;break ga}if(R>>>0>va>>>0){H[bb>>2]=0;H[Na>>2]=0}S=x+1|0;Oa(oa,i,x,ia,S,_a,2,0);Oa(oa,La,x,$a,S,Ya,2,0);ha:{ia:{ja:{if(!pa){if(!Xa){break ha}if((i|0)>=(ia|0)){break ia}ka:{la:{if((i|0)>0){b=H[cb>>2];break la}b=H[ha>>2];g=b;if((i|0)<0){break ka}}g=b;b=H[Ua>>2]}H[ta>>2]=H[ta>>2]-((b+g|0)+2>>2);b=aa;h=b;g=i;if((b|0)>=(z|0)){break ja}while(1){b=g;g=h;h=o+(g<<3)|0;H[h>>2]=H[h>>2]-((H[(o+(b<<3)|0)+4>>2]+H[h+4>>2]|0)+2>>2);h=g+1|0;if((z|0)!=(h|0)){continue}break}b=z;break ja}ma:{if(!Ma){b=i;if((ia|0)<=(b|0)){break ma}while(1){g=o+(b<<3)|0;h=H[g+4>>2];t=Ka;na:{oa:{if((b|0)>=0){fa=H[((b|0)<(da|0)?g:Ka)>>2];b=b+1|0;break oa}fa=H[o>>2];if((b|0)!=-1){b=b+1|0;t=o;break na}b=0}if((b|0)>=(da|0)){break na}t=o+(b<<3)|0}H[g+4>>2]=h-((H[t>>2]+fa|0)+2>>2);if((b|0)<(ia|0)){continue}break}break ma}H[o>>2]=H[o>>2]/2;break ha}b=r;if((la|0)<=(b|0)){break ha}while(1){g=o+(b<<3)|0;h=H[g>>2];pa:{if((b|0)<0){t=H[ha>>2];fa=ha;break pa}t=H[((b|0)<(m|0)?g+4|0:Ga)>>2];fa=ha;if(!b){break pa}fa=(b|0)>(m|0)?Ga:g-4|0}H[g>>2]=h+(H[fa>>2]+t>>1);b=b+1|0;if((la|0)!=(b|0)){continue}break}break ha}if((b|0)>=(ia|0)){break ia}while(1){g=o+(b<<3)|0;t=H[g>>2];qa:{ra:{if((b|0)>0){h=H[(o+(((b|0)<(da|0)?b:da)<<3)|0)-4>>2];break ra}h=H[ha>>2];fa=ha;if((b|0)<0){break qa}}fa=xa;if((b|0)>=(da|0)){break qa}fa=(o+(b<<3)|0)+4|0}H[g>>2]=t-((H[fa>>2]+h|0)+2>>2);b=b+1|0;if((ia|0)!=(b|0)){continue}break}}if((r|0)>=(la|0)){break ha}b=r;if((ya|0)>(b|0)){while(1){g=o+(b<<3)|0;b=b+1|0;H[g+4>>2]=H[g+4>>2]+(H[o+(b<<3)>>2]+H[g>>2]>>1);if((b|0)<(Wa|0)){continue}break}}if((b|0)>=(la|0)){break ha}while(1){g=ga;t=b;sa:{ta:{if((b|0)>=0){h=H[((b|0)<(m|0)?o+(b<<3)|0:g)>>2];b=b+1|0;break ta}h=H[o>>2];if((t|0)!=-1){b=t+1|0;g=o;break sa}b=0}if((m|0)<=(b|0)){break sa}g=o+(b<<3)|0}t=o+(t<<3)|0;H[t+4>>2]=H[t+4>>2]+(H[g>>2]+h>>1);if((b|0)<(la|0)){continue}break}}if(!Za(oa,l,x,wa,S,ab,1,0)){break ba}}x=S;if((Z|0)!=(x|0)){continue}break}}k=k+152|0;b=Q<<1;g=n<<1|1;b=b>>>0>g>>>0?b:g;Ua=b>>>0>>0?b:Z;Q=o+(q<<5)|0;b=o+(ka<<5)|0;va=b-4|0;g=(q|0)<(ka|0);Wa=g?Q+28|0:va;ya=b-8|0;Xa=g?Q+24|0:ya;Ga=b-12|0;Ya=g?Q+20|0:Ga;Ka=b-16|0;_a=(q|0)<0?Ra:g?Q+16|0:Ka;xa=u-1|0;$a=(V|0)<(xa|0)?V:xa;i=o+((g?q:ka)<<5)|0;La=(q|0)<=0;ab=La?Ra:i-16|0;Ma=(ka|0)>0;Na=Ma|(u|0)>1;bb=Q+(ja<<4)|0;cb=(o+(4-(ja<<2)<<2)|0)+(j<<5)|0;n=(E|0)<(ka|0)?E:ka;r=q+1|0;g=ea<<1;h=ba<<1|1;mb=g>>>0>>0?g:h;qb=o+(mb<<4)|0;rb=!u&(ka|0)==1;g=o+(u<<5)|0;S=g-20|0;z=g-24|0;ea=g-28|0;ba=g-32|0;aa=g-4|0;ga=g-8|0;da=g-12|0;la=g-16|0;ia=b-20|0;fa=b-24|0;pa=b-28|0;ta=b-32|0;sb=i-4|0;x=i-8|0;tb=i-12|0;while(1){ua:{va:{wa:{xa:{m=l;if(m>>>0>>0){b=wa-m|0;l=m+(b>>>0>=4?4:b)|0;Oa(oa,m,q,l,E,bb,1,8);Oa(oa,m,lb,l,kb,cb,1,8);if(!ja){if(!Na){break ua}if((q|0)>=(E|0)){break va}H[Q>>2]=H[Q>>2]-((H[ab>>2]+H[_a>>2]|0)+2>>2);ya:{if(!La){b=H[tb>>2];h=x;g=sb;break ya}b=H[o+20>>2];if((q|0)<0){break xa}h=$;g=ib}H[Q+4>>2]=H[Q+4>>2]-((H[Ya>>2]+b|0)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[h>>2]+H[Xa>>2]|0)+2>>2);b=H[Wa>>2];g=H[g>>2];break wa}if(rb){H[o>>2]=H[o>>2]/2;H[o+4>>2]=H[o+4>>2]/2;H[o+8>>2]=H[o+8>>2]/2;H[o+12>>2]=H[o+12>>2]/2;break ua}g=q;if((E|0)>(g|0)){while(1){b=o+(g<<5)|0;za:{if((g|0)<0){h=H[o>>2];i=Ma|(g|0)!=-1;H[b+16>>2]=H[b+16>>2]-(((i?h:H[ta>>2])+h|0)+2>>2);h=H[ha>>2];H[b+20>>2]=H[b+20>>2]-(((i?h:H[pa>>2])+h|0)+2>>2);h=H[o+8>>2];H[b+24>>2]=H[b+24>>2]-(((i?h:H[fa>>2])+h|0)+2>>2);h=b;t=H[b+28>>2];b=H[o+12>>2];H[h+28>>2]=t-(((i?b:H[ia>>2])+b|0)+2>>2);g=g+1|0;break za}i=g+1|0;Aa:{if((i|0)<(ka|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]-((H[b>>2]+H[g>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[g+4>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[g+8>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[g+12>>2]|0)+2>>2);break Aa}h=H[b+16>>2];if((g|0)>=(ka|0)){H[b+16>>2]=h-((H[ta>>2]<<1)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[pa>>2]<<1)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[fa>>2]<<1)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[ia>>2]<<1)+2>>2);break Aa}H[b+16>>2]=h-((H[b>>2]+H[ta>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[pa>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[fa>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[ia>>2]|0)+2>>2)}g=i}if((E|0)!=(g|0)){continue}break}}g=j;if((V|0)<=(g|0)){break ua}while(1){b=o+(g<<5)|0;Ba:{if((g|0)<0){H[b>>2]=H[b>>2]+(H[o+16>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]<<1>>1);break Ba}i=H[b>>2];if(!g){h=(g|0)<(u|0);H[b>>2]=i+(H[o+16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}if((g|0)<=(u|0)){h=(g|0)<(u|0);H[b>>2]=i+(H[b-16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[b-12>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[b-8>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[b-4>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}H[b>>2]=i+(H[la>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[da>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[ga>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[aa>>2]<<1>>1)}g=g+1|0;if((V|0)!=(g|0)){continue}break}break ua}m=R;u=Z;sa=sa+1|0;if((Y|0)!=(sa|0)){continue ea}break da}H[Q+4>>2]=H[Q+4>>2]-((b<<1)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[$>>2]<<1)+2>>2);b=H[ib>>2];g=b}H[Q+12>>2]=H[Q+12>>2]-((b+g|0)+2>>2);i=q;b=r;g=b;if((b|0)<(n|0)){while(1){g=o+(b<<5)|0;i=o+(i<<5)|0;H[g>>2]=H[g>>2]-((H[i+16>>2]+H[g+16>>2]|0)+2>>2);H[g+4>>2]=H[g+4>>2]-((H[i+20>>2]+H[g+20>>2]|0)+2>>2);H[g+8>>2]=H[g+8>>2]-((H[i+24>>2]+H[g+24>>2]|0)+2>>2);H[g+12>>2]=H[g+12>>2]-((H[i+28>>2]+H[g+28>>2]|0)+2>>2);i=b;b=b+1|0;if((n|0)!=(b|0)){continue}break}g=n}if((g|0)>=(E|0)){break va}while(1){b=o+(g<<5)|0;i=(g|0)<(ka|0);Ca:{if((g|0)<=0){h=H[Ra>>2];if((g|0)>=0){H[b>>2]=H[b>>2]-((h+H[(i?b+16|0:Ka)>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]+H[(i?b+20|0:Ga)>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]+H[(i?b+24|0:ya)>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]+H[(i?b+28|0:va)>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((h<<1)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]<<1)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]<<1)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]<<1)+2>>2);break Ca}h=o+((i?g:ka)<<5)|0;t=H[h-16>>2];if(!i){H[b>>2]=H[b>>2]-((t+H[Ka>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[Ga>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[ya>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[va>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((t+H[b+16>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[b+20>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[b+24>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[b+28>>2]|0)+2>>2)}g=g+1|0;if((E|0)!=(g|0)){continue}break}}if((j|0)>=(V|0)){break ua}g=j;if((xa|0)>(g|0)){while(1){b=o+(g<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);g=g+1|0;if(($a|0)>(g|0)){continue}break}}if((g|0)>=(V|0)){break ua}while(1){b=o+(g<<5)|0;Da:{Ea:{Fa:{if((g|0)<0){i=H[o>>2];if((g|0)!=-1){break Fa}if((u|0)<=0){H[b+16>>2]=H[b+16>>2]+(i+H[ba>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[o+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[o+8>>2]>>1);t=H[o+12>>2];i=H[S>>2];break Ea}break Fa}i=g+1|0;Ga:{if((i|0)<(u|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[g>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[g+4>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[g+8>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[g+12>>2]+H[b+12>>2]>>1);break Ga}if((g|0)>=(u|0)){H[b+16>>2]=H[b+16>>2]+H[ba>>2];H[b+20>>2]=H[b+20>>2]+H[ea>>2];H[b+24>>2]=H[b+24>>2]+H[z>>2];H[b+28>>2]=H[b+28>>2]+H[S>>2];break Ga}H[b+16>>2]=H[b+16>>2]+(H[ba>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[S>>2]+H[b+12>>2]>>1)}g=i;break Da}H[b+16>>2]=i+H[b+16>>2];H[b+20>>2]=H[b+20>>2]+H[o+4>>2];H[b+24>>2]=H[b+24>>2]+H[o+8>>2];t=H[o+12>>2];i=t}H[b+28>>2]=H[b+28>>2]+(i+t>>1);g=g+1|0}if((V|0)!=(g|0)){continue}break}}if(Za(oa,m,mb,l,Ua,qb,1,4)){continue}break}break}break ba}Ca(o);g=1}b=H[ma-16>>2];i=H[gb>>2];h=H[hb>>2];q=H[ma-8>>2];Oa(oa,b-i|0,H[ma-12>>2]-h|0,q-i|0,H[ma-4>>2]-h|0,H[C+52>>2],1,q-b|0);Va(oa);break X}Va(oa);Ca(o);g=0;break X}Va(oa);g=0;break X}g=0;Sa(m);Ca(j)}na=_+32|0;if(g){break W}break b}h=0;J=na+-64|0;na=J;Ha:{Ia:{if(H[D+64>>2]){r=H[C+28>>2];i=r+N(H[C+24>>2],152)|0;k=H[i-152>>2];o=1;x=H[D+44>>2];M=H[x+4>>2];if((j|0)==1){break Ha}t=j-1|0;b=r;Ja:{if((j|0)!=2){q=t&1;n=t&-2;g=0;while(1){j=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>j>>>0?h:j;b=b+304|0;g=g+2|0;if((n|0)!=(g|0)){continue}break}if(!q){break Ja}}g=H[b+160>>2]-H[b+152>>2]|0;g=g>>>0>>0?h:g;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?g:b}o=0;if(h>>>0>134217727){break Ha}b=H[i-144>>2];g=H[r+4>>2];i=H[r+12>>2];n=H[r>>2];j=H[r+8>>2];$=h<<5;E=Ia($);H[J+32>>2]=E;if(!E){break Ha}q=i-g|0;i=j-n|0;g=M>>>1|0;ea=g>>>0<=2?2:g;u=b-k|0;aa=u<<5;ga=N(u,28);_=N(u,24);da=N(u,20);ka=u<<4;W=N(u,12);Z=u<<3;H[J>>2]=E;ba=E+32|0;b=H[C+36>>2];while(1){l=q;H[J+8>>2]=l;h=i;H[J+40>>2]=h;Y=H[r+156>>2];w=H[r+164>>2];n=H[r+160>>2];g=H[r+152>>2];H[J+56>>2]=0;H[J+52>>2]=h;H[J+48>>2]=0;R=(g|0)%2|0;H[J+44>>2]=R;i=n-g|0;j=i-h|0;H[J+60>>2]=j;H[J+36>>2]=j;S=(M|0)<2;q=w-Y|0;Ka:{if(!(!S&q>>>0>15)){o=0;k=b;if(q>>>0<8){break Ka}m=i&-2;Q=i&1;j=0;R=(n|0)==(g+1|0);while(1){g=J+32|0;zb(g,k,u,8);Ta(g);if(i){h=0;o=0;La:{if(!R){while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g>>2]=L[n>>2];z=u<<2;L[z+g>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];n=h|1;g=(n<<2)+k|0;n=E+(n<<5)|0;L[g>>2]=L[n>>2];L[g+z>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];h=h+2|0;o=o+2|0;if((m|0)!=(o|0)){continue}break}if(!Q){break La}}g=(h<<2)+k|0;h=E+(h<<5)|0;L[g>>2]=L[h>>2];L[g+(u<<2)>>2]=L[h+4>>2];L[g+Z>>2]=L[h+8>>2];L[g+W>>2]=L[h+12>>2]}h=0;while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g+ka>>2]=L[n+16>>2];L[g+da>>2]=L[n+20>>2];L[g+_>>2]=L[n+24>>2];L[g+ga>>2]=L[n+28>>2];h=h+1|0;if((i|0)!=(h|0)){continue}break}}k=k+aa|0;g=j+15|0;o=j+8|0;j=o;if(g>>>0>>0){continue}break}break Ka}g=q>>>3|0;m=g>>>0>>0?g:M;Q=(q>>>0)/(m>>>0)&-8;o=q&-8;g=0;k=b;while(1){n=Fa(48);if(!n){break Ia}z=Ia($);H[n>>2]=z;if(!z){o=0;Sa(x);Ca(n);Ca(E);break Ha}H[n+40>>2]=k;H[n+36>>2]=u;H[n+32>>2]=i;H[n+28>>2]=j;H[n+24>>2]=0;H[n+20>>2]=h;H[n+16>>2]=0;H[n+12>>2]=R;H[n+8>>2]=h;H[n+4>>2]=j;V=o-N(g,Q)|0;g=g+1|0;z=(m|0)==(g|0)?V:Q;H[n+44>>2]=z;eb(x,12,n);k=(N(u,z)<<2)+k|0;if((g|0)!=(m|0)){continue}break}Sa(x)}Ma:{if(o>>>0>=q>>>0){break Ma}h=J+32|0;g=q-o|0;zb(h,k,u,g);Ta(h);if(!i){break Ma}R=g&-4;Q=g&3;m=0;z=Y+(o-w|0)>>>0>4294967292;while(1){j=(m<<2)+k|0;o=E+(m<<5)|0;h=0;n=0;g=0;Na:{if(!z){while(1){L[j+(N(h,u)<<2)>>2]=L[o+(h<<2)>>2];g=h|1;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|2;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|3;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];h=h+4|0;n=n+4|0;if((R|0)!=(n|0)){continue}break}g=h;if(!Q){break Na}}h=0;while(1){L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=g+1|0;h=h+1|0;if((Q|0)!=(h|0)){continue}break}}m=m+1|0;if((m|0)!=(i|0)){continue}break}}n=q-l|0;H[J+4>>2]=n;g=H[r+156>>2];H[J+28>>2]=n;H[J+24>>2]=0;H[J+20>>2]=l;H[J+16>>2]=0;Q=(g|0)%2|0;H[J+12>>2]=Q;Oa:{if(!(!S&i>>>0>15)){g=b;if(i>>>0<8){break Oa}oa=q&-2;la=q&1;ia=n&-2;ha=n&1;V=l&-2;ma=l&1;h=Q<<5;R=ba-h|0;S=h+E|0;fa=N(l,u)<<2;pa=w-1|0;sa=(pa|0)==(l+Y|0);j=i;while(1){h=0;k=0;Pa:{Qa:{switch(l|0){default:while(1){m=(N(h,u)<<2)+g|0;z=H[m+28>>2];o=S+(h<<6)|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=S+(o<<6)|0;o=(N(o,u)<<2)+g|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((V|0)!=(k|0)){continue}break};if(!ma){break Pa}break;case 0:break Pa;case 1:break Qa}}k=S+(h<<6)|0;h=(N(h,u)<<2)+g|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ra:{if((l|0)==(q|0)){break Ra}z=g+fa|0;h=0;m=0;if(!sa){while(1){k=z+(N(h,u)<<2)|0;ja=H[k+28>>2];o=R+(h<<6)|0;H[o+24>>2]=H[k+24>>2];H[o+28>>2]=ja;ja=H[k+20>>2];H[o+16>>2]=H[k+16>>2];H[o+20>>2]=ja;ja=H[k+12>>2];H[o+8>>2]=H[k+8>>2];H[o+12>>2]=ja;ja=H[k+4>>2];H[o>>2]=H[k>>2];H[o+4>>2]=ja;o=h|1;k=R+(o<<6)|0;o=z+(N(o,u)<<2)|0;ja=H[o+28>>2];H[k+24>>2]=H[o+24>>2];H[k+28>>2]=ja;ja=H[o+20>>2];H[k+16>>2]=H[o+16>>2];H[k+20>>2]=ja;ja=H[o+12>>2];H[k+8>>2]=H[o+8>>2];H[k+12>>2]=ja;ja=H[o+4>>2];H[k>>2]=H[o>>2];H[k+4>>2]=ja;h=h+2|0;m=m+2|0;if((ia|0)!=(m|0)){continue}break}if(!ha){break Ra}}k=R+(h<<6)|0;h=z+(N(h,u)<<2)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ta(J);Sa:{if(!q){break Sa}h=0;k=0;if((Y|0)!=(pa|0)){while(1){m=E+(h<<5)|0;z=H[m+28>>2];o=(N(h,u)<<2)+g|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=(N(o,u)<<2)+g|0;o=E+(o<<5)|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((oa|0)!=(k|0)){continue}break}if(!la){break Sa}}k=(N(h,u)<<2)+g|0;h=E+(h<<5)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}g=g+32|0;j=j-8|0;if(j>>>0>7){continue}break}break Oa}g=i>>>3|0;k=g>>>0>>0?g:ea;m=(i>>>0)/(k>>>0)&-8;o=i&-8;j=0;g=b;while(1){h=Fa(48);if(!h){break Ia}R=Ia($);H[h>>2]=R;if(!R){o=0;Sa(x);Ca(h);Ca(E);break Ha}H[h+40>>2]=g;H[h+36>>2]=u;H[h+32>>2]=q;H[h+28>>2]=n;H[h+24>>2]=0;H[h+20>>2]=l;H[h+16>>2]=0;H[h+12>>2]=Q;H[h+8>>2]=l;H[h+4>>2]=n;V=o-N(j,m)|0;j=j+1|0;R=(k|0)==(j|0)?V:m;H[h+44>>2]=R;eb(x,13,h);g=(R<<2)+g|0;if((k|0)!=(j|0)){continue}break}Sa(x)}j=i&7;Ta:{if(!j){break Ta}Q=Q<<5;Ua:{if(!l){break Ua}m=E+Q|0;k=j<<2;h=0;if((l|0)!=1){R=l&1;S=l&-2;o=0;while(1){z=!k;if(!z){B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}if(!z){z=h|1;B(m+(z<<6)|0,(N(u,z)<<2)+g|0,k)}h=h+2|0;o=o+2|0;if((S|0)!=(o|0)){continue}break}if(!R){break Ua}}if(!k){break Ua}B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}Va:{if((l|0)==(q|0)){break Va}m=ba-Q|0;Q=(N(l,u)<<2)+g|0;k=j<<2;h=0;if((Y|0)!=(w+(l^-1)|0)){l=n&1;n=n&-2;o=0;while(1){R=!k;if(!R){B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}if(!R){R=h|1;B(m+(R<<6)|0,Q+(N(u,R)<<2)|0,k)}h=h+2|0;o=o+2|0;if((n|0)!=(o|0)){continue}break}if(!l){break Va}}if(!k){break Va}B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}Ta(J);if(!q){break Ta}k=j<<2;h=0;if((w|0)!=(Y+1|0)){n=q&1;j=q&-2;o=0;while(1){m=!k;if(!m){B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}if(!m){m=h|1;B((N(m,u)<<2)+g|0,E+(m<<5)|0,k)}h=h+2|0;o=o+2|0;if((j|0)!=(o|0)){continue}break}if(!n){break Ta}}if(!k){break Ta}B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}r=r+152|0;t=t-1|0;if(t){continue}break}o=1;Ca(E);break Ha}o=1;q=H[C+28>>2];Q=q+N(j,152)|0;da=Q-152|0;if(H[da>>2]==H[Q-144>>2]){break Ha}ka=Q-148|0;if(H[ka>>2]==H[Q-140>>2]){break Ha}g=H[q+4>>2];i=H[q+12>>2];k=H[q>>2];n=H[q+8>>2];t=H[C+68>>2];E=H[C+64>>2];x=H[C+60>>2];Y=H[C+56>>2];Z=_b(C,j);if(!Z){o=0;break Ha}if((j|0)==1){b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);break Ha}b=q;Wa:{if((j|0)!=2){h=j-1|0;m=h&1;l=h&-2;h=0;o=0;while(1){r=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>r>>>0?h:r;b=b+304|0;o=o+2|0;if((l|0)!=(o|0)){continue}break}if(!m){break Wa}}m=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>m>>>0?h:m;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?h:b}Xa:{if(h>>>0>=134217728){break Xa}R=Ia(h<<5);H[J+32>>2]=R;if(!R){break Xa}H[J>>2]=R;Ya:{if(j){r=i-g|0;b=n-k|0;oa=R+32|0;W=j;la=H[C+20>>2];z=1;ea=0;while(1){H[J+8>>2]=r;H[J+40>>2]=b;i=H[q+164>>2];h=H[q+160>>2];g=H[q+156>>2];k=H[q+152>>2];$=(k|0)%2|0;H[J+44>>2]=$;ia=(g|0)%2|0;H[J+12>>2]=ia;M=h-k|0;ba=M-b|0;H[J+36>>2]=ba;k=i-g|0;ha=k-r|0;H[J+4>>2]=ha;i=Y;o=i;h=x;g=h;j=E;m=j;n=t;u=n;Za:{if(!ea&(z|0)==(la|0)){break Za}w=la-z|0;g=0;o=0;if(i){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=Y+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){o=n>>>h|0}else{o=((1<>>h}}if(x){g=w&31;if((w&63)>>>0>=32){l=-1<>>32-g}g=x+(i^-1)|0;i=l^-1;h=g>>>0>>0?i+1|0:i;i=w&31;if((w&63)>>>0>=32){g=h>>>i|0}else{g=((1<>>i}}n=0;j=0;if(E){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=E+(h^-1)|0;h=l^-1;j=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){j=j>>>h|0}else{j=((1<>>h}}if(t){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=t+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){n=n>>>h|0}else{n=((1<>>h}}m=0;i=0;S=1<>>0>>0){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}h=h^-1;i=h+(Y-S|0)|0;l=l^-1;l=h>>>0>i>>>0?l+1|0:l;h=w&31;if((w&63)>>>0>=32){i=l>>>h|0}else{i=((1<>>h}}if(E>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}m=m^-1;h=m+(E-S|0)|0;l=l^-1;l=h>>>0>>0?l+1|0:l;m=w&31;if((w&63)>>>0>=32){m=l>>>m|0}else{m=((1<>>m}}u=0;h=0;if(x>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}aa=aa^-1;h=aa+(x-S|0)|0;l=l^-1;aa=h>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){h=aa>>>l|0}else{h=((1<>>l}}if(t>>>0<=S>>>0){break Za}l=w&31;if((w&63)>>>0>=32){l=-1<>>32-l}aa=u^-1;u=aa+(t-S|0)|0;l=l^-1;S=u>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){u=S>>>l|0}else{u=((1<>>l}}l=H[q+180>>2];w=m-l|0;m=m>>>0>=w>>>0?w:0;w=m+4|0;m=m>>>0>w>>>0?-1:w;ga=m>>>0>>0?m:ba;m=H[q+216>>2];w=j-m|0;j=j>>>0>=w>>>0?w:0;w=j+4|0;j=j>>>0>w>>>0?-1:w;_=b>>>0>j>>>0?j:b;j=($?ga:_)<<1;w=($?_:ga)<<1|1;j=j>>>0>w>>>0?j:w;S=j>>>0>>0;l=i-l|0;i=i>>>0>=l>>>0?l:0;l=i-4|0;ba=i>>>0>=l>>>0?l:0;i=o-m|0;i=i>>>0<=o>>>0?i:0;m=i-4|0;aa=i>>>0>=m>>>0?m:0;V=($?ba:aa)<<1;ma=($?aa:ba)<<1|1;fa=V>>>0>>0;m=H[q+184>>2];i=g-m|0;g=g>>>0>=i>>>0?i:0;i=g-4|0;i=g>>>0>=i>>>0?i:0;o=i;g=H[q+220>>2];l=h-g|0;h=h>>>0>=l>>>0?l:0;l=h-4|0;h=h>>>0>=l>>>0?l:0;l=h;m=n-m|0;n=m>>>0<=n>>>0?m:0;m=n+4|0;n=m>>>0>>0?-1:m;n=n>>>0>>0?n:r;m=n;g=u-g|0;g=g>>>0<=u>>>0?g:0;u=g+4|0;g=g>>>0>u>>>0?-1:u;w=g>>>0>>0?g:ha;u=w;if(ia){l=i;u=m;o=h;m=w}S=S?j:M;j=fa?V:ma;H[J+60>>2]=ga;H[J+56>>2]=ba;H[J+52>>2]=_;H[J+48>>2]=aa;_a:{if(k>>>0<8){b=7;g=0;break _a}g=$<<5;ha=(oa-g|0)+(ba<<6)|0;V=(g+R|0)+(aa<<6)|0;ga=b+ga|0;ma=b+ba|0;fa=r+w|0;pa=h+r|0;sa=R+(j<<5)|0;g=0;while(1){b=g|7;$a:{if(!(g>>>0>>0&b>>>0>=i>>>0|g>>>0>>0&b>>>0>=pa>>>0)){g=g+8|0;break $a}b=k-g|0;ja=b>>>0>=8?8:b;b=0;while(1){$=b+g|0;ba=$+1|0;wa=b<<2;Oa(Z,aa,$,_,ba,wa+V|0,16,0);Oa(Z,ma,$,ga,ba,ha+wa|0,16,0);b=b+1|0;if((ja|0)!=(b|0)){continue}break}Ta(J+32|0);b=g;g=g+8|0;if(!Za(Z,j,b,S,g,sa,8,1)){break Ya}}b=g|7;if(k>>>0>b>>>0){continue}break}}if(!(!(g>>>0>>0&b>>>0>=i>>>0)&(r+w>>>0<=g>>>0|h+r>>>0>b>>>0)|g>>>0>=k>>>0)){b=J+32|0;$=0;ga=k-g|0;if(ga){while(1){ba=g+$|0;aa=ba+1|0;_=H[b+16>>2];ha=$<<2;Oa(Z,_,ba,H[b+20>>2],aa,ha+((H[b>>2]+(H[b+12>>2]<<5)|0)+(_<<6)|0)|0,16,0);_=H[b+24>>2];V=H[b+8>>2];Oa(Z,_+V|0,ba,V+H[b+28>>2]|0,aa,(ha+((H[b>>2]-(H[b+12>>2]<<5)|0)+(_<<6)|0)|0)+32|0,16,0);$=$+1|0;if((ga|0)!=($|0)){continue}break}}Ta(b);if(!Za(Z,j,g,S,k,R+(j<<5)|0,8,1)){break Ya}}H[J+28>>2]=w;H[J+24>>2]=h;H[J+20>>2]=n;H[J+16>>2]=i;if(j>>>0>>0){b=m<<1;g=u<<1|1;b=b>>>0>g>>>0?b:g;g=b>>>0>>0?b:k;b=ia<<5;m=(oa-b|0)+(h<<6)|0;u=(b+R|0)+(i<<6)|0;w=r+w|0;h=h+r|0;b=o<<1;l=l<<1|1;l=b>>>0>>0?b:l;r=R+(l<<5)|0;while(1){b=S-j|0;b=(b>>>0>=8?8:b)+j|0;Oa(Z,j,i,b,n,u,1,16);Oa(Z,j,h,b,w,m,1,16);Ta(J);if(!Za(Z,j,l,b,g,r,1,8)){break Ya}j=j+8|0;if(S>>>0>j>>>0){continue}break}}q=q+152|0;b=M;r=k;z=z+1|0;ea=z?ea:ea+1|0;if(ea|(z|0)!=(W|0)){continue}break}}o=1;b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);Ca(R);break Ha}Va(Z);Ca(R);o=0;break Ha}Va(Z);o=0;break Ha}o=0;Sa(x);Ca(E)}na=J- -64|0;if(o){break W}break b}s=s+1080|0;A=A+52|0;C=C+76|0;p=p+1|0;if(p>>>0>2]){continue}break}s=H[D+32>>2];v=H[H[D+20>>2]>>2]}k=H[s+16>>2];ab:{if(H[D+68>>2]|!k){break ab}A=H[v+20>>2];g=H[A+28>>2];bb:{cb:{i=H[D+64>>2];if(i){p=H[v+16>>2];if(p>>>0<3){break bb}b=H[A+24>>2];if(!((b|0)==H[A+100>>2]&(b|0)==H[A+176>>2])){Ba(f,1,10089,0);break b}h=H[H[D+24>>2]+24>>2];q=H[h+36>>2];db:{if((q|0)!=H[h+88>>2]|(q|0)!=H[h+140>>2]){break db}h=N(b,152);b=h+g|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);g=h+H[A+104>>2]|0;if((b|0)!=(N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)){break db}g=h+H[A+180>>2]|0;if((N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}p=H[v+16>>2];if(p>>>0<3){break bb}h=H[H[D+24>>2]+24>>2];b=H[h+36>>2];eb:{if((b|0)!=H[h+88>>2]){break eb}h=H[h+140>>2];if((h|0)!=(b|0)){break eb}q=N(b,152);b=g+q|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);g=q+H[A+104>>2]|0;if((b|0)!=(N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)){break eb}g=H[A+180>>2]+N(h,152)|0;if((N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}if((k|0)==2){if(!H[s+5608>>2]){break ab}i=Fa(p<<2);if(!i){break b}n=H[v+16>>2];fb:{if(!n){break fb}gb:{hb:{if(H[D+64>>2]){p=n&3;g=0;if(n>>>0>=4){break hb}C=0;break gb}p=n&3;g=0;ib:{if(n>>>0<4){C=0;break ib}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+52>>2];H[q+4>>2]=H[A+128>>2];H[q+8>>2]=H[A+204>>2];H[q+12>>2]=H[A+280>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+52>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}break fb}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+36>>2];H[q+4>>2]=H[A+112>>2];H[q+8>>2]=H[A+188>>2];H[q+12>>2]=H[A+264>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+36>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}}h=H[s+5608>>2];g=i;k=0;s=Fa(n<<3);i=0;jb:{if(!s){break jb}if(!(!b|!n)){i=b;u=s+(n<<2)|0;r=n&-4;m=n&3;o=n-1|0;while(1){v=0;p=0;b=0;t=o>>>0<3;kb:{if(!t){while(1){b=v<<2;L[b+s>>2]=L[H[b+g>>2]>>2];q=b|4;L[q+s>>2]=L[H[g+q>>2]>>2];q=b|8;L[q+s>>2]=L[H[g+q>>2]>>2];b=b|12;L[b+s>>2]=L[H[b+g>>2]>>2];v=v+4|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}b=v;if(!m){break kb}}v=0;while(1){q=b<<2;L[q+s>>2]=L[H[g+q>>2]>>2];b=b+1|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}q=0;b=h;while(1){E=q<<2;j=E+u|0;H[j>>2]=0;ca=O(0);v=0;p=0;lb:{if(!t){while(1){l=s+(v<<2)|0;ca=O(O(L[b>>2]*L[l>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+4>>2]*L[l+4>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+8>>2]*L[l+8>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+12>>2]*L[l+12>>2])+ca);L[j>>2]=ca;v=v+4|0;b=b+16|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}p=v;if(!m){break lb}}v=0;while(1){ca=O(O(L[b>>2]*L[s+(p<<2)>>2])+ca);L[j>>2]=ca;p=p+1|0;b=b+4|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}v=g+E|0;p=H[v>>2];H[v>>2]=p+4;L[p>>2]=ca;q=q+1|0;if((n|0)!=(q|0)){continue}break}k=k+1|0;if((i|0)!=(k|0)){continue}break}}Ca(s);i=1}b=i;Ca(g);if(b){break ab}break b}if(H[H[s+5584>>2]+20>>2]==1){if(i){cc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}cc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}if(i){bc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}bc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}H[ra>>2]=p;Ba(f,1,10150,ra)}m=H[H[D+20>>2]>>2];if(!H[m+16>>2]){X=1;break b}l=H[D+68>>2];k=H[m+20>>2];b=H[H[D+32>>2]+5584>>2];q=H[H[D+24>>2]+24>>2];i=0;while(1){mb:{if(H[l+(i<<2)>>2]?0:l){break mb}h=H[k+28>>2];g=h+N(H[q+36>>2],152)|0;nb:{if(!H[D+64>>2]){h=H[g+148>>2]-H[g+140>>2]|0;v=H[g+144>>2]-H[g+136>>2]|0;r=0;p=52;break nb}h=h+N(H[k+24>>2],152)|0;v=H[g+8>>2]-H[g>>2]|0;r=H[h-144>>2]-(v+H[h-152>>2]|0)|0;h=H[g+12>>2]-H[g+4>>2]|0;p=36}g=H[q+24>>2];ob:{if(H[q+32>>2]){g=1<>2];if(H[b+20>>2]==1){n=v&-2;j=v&1;A=0;r=r<<2;while(1){p=0;pb:{if((v|0)!=1){while(1){g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;g=H[b+1076>>2]+H[X+4>>2]|0;H[X+4>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+8|0;p=p+2|0;if((n|0)!=(p|0)){continue}break}if(!j){break pb}}g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+4|0}X=r+X|0;A=A+1|0;if((A|0)!=(h|0)){continue}break}break mb}u=s>>31;g=0;while(1){p=0;while(1){ca=L[X>>2];j=C;qb:{if(ca>O(2147483648)){break qb}j=s;if(ca>2];j=n;za=ca;ca=O(T(ca));Pa=O(za-ca);if(!(PaO(.5)){break rb}Pa=ca;ca=O(ca*O(.5));za=O(ca-O(T(ca)))==O(0)?Pa:za}ca=za}t=n>>31;if(O(P(ca))>31)|0;j=j+n|0;n=n>>>0>j>>>0?o+1|0:o;j=j>>>0>>0&(n|0)<=(u|0)|(n|0)<(u|0)?s:j>>>0>>0&(n|0)<=0|(n|0)<0?j:C}H[X>>2]=j;X=X+4|0;p=p+1|0;if((v|0)!=(p|0)){continue}break}X=(r<<2)+X|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}k=k+76|0;b=b+1080|0;q=q+52|0;X=1;i=i+1|0;if(i>>>0>2]){continue}break}break b}X=0;Ba(f,1,3372,0)}na=ra+16|0;if(!X){jb(ua);H[a+8>>2]=H[a+8>>2]|32768;Ba(f,1,11451,0);break a}sb:{if(!c){break sb}b=0;q=H[a+232>>2];g=Rb(q,1);if(!((g|0)==-1|d>>>0>>0)){tb:{b=1;d=H[q+24>>2];if(!H[d+16>>2]){break tb}h=H[d+24>>2];k=H[H[H[q+20>>2]>>2]+20>>2];while(1){b=H[h+24>>2];i=b&7;v=b>>>3|0;d=H[k+28>>2];b=d+N(H[h+36>>2],152)|0;ub:{if(H[q+64>>2]){g=d+N(H[k+24>>2],152)|0;d=H[b+8>>2]-H[b>>2]|0;p=H[g-144>>2]-(d+H[g-152>>2]|0)|0;g=H[b+12>>2]-H[b+4>>2]|0;b=36;break ub}g=H[b+148>>2]-H[b+140>>2]|0;d=H[b+144>>2]-H[b+136>>2]|0;p=0;b=52}b=H[b+k>>2];vb:{wb:{xb:{yb:{i=v+((i|0)!=0)|0;switch(((i|0)==3?4:i)-1|0){case 0:break xb;case 1:break wb;case 3:break yb;default:break vb}}if(!g){break vb}d=d<<2;if((g|0)!=1){i=g&1;v=g&-2;g=0;while(1){s=!d;if(!s){B(c,b,d)}n=p<<2;b=n+(b+d|0)|0;c=c+d|0;if(!s){B(c,b,d)}c=c+d|0;b=n+(b+d|0)|0;g=g+2|0;if((v|0)!=(g|0)){continue}break}if(!i){break vb}}if(d){B(c,b,d)}c=c+d|0;break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;zb:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break zb}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;p=p<<2;while(1){d=0;Ab:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Ab}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=b+p|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Bb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Bb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Cb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Cb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}}k=k+76|0;h=h+52|0;b=1;pb=pb+1|0;if(pb>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[ua+5596>>2];if(!b){break sb}Ca(b);H[ua+5596>>2]=0;H[ua+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;fb=1;c=Qa(e);b=H[a+8>>2];if(!(c|qa)&(b|0)==64|(b|0)==256){break a}if((Ja(e,Aa+10|0,2,f)|0)!=2){Ba(f,H[a+208>>2]?1:2,2472,0);fb=!H[a+208>>2];break a}Da(Aa+10|0,Aa+12|0,2);b=H[Aa+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Qa(e)|qa)){H[a+8>>2]=64;Ba(f,2,8419,0);break a}fb=0;Ba(f,1,8306,0)}na=Aa+16|0;return fb|0}function cb(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=O(0),Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,sa=0,ta=0,ua=0,va=O(0);t=na-80|0;na=t;H[t+40>>2]=65424;v=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{l=H[a+8>>2];d:{if((l|0)!=8){j=0;if((l|0)!=256){break a}H[t+40>>2]=65497;break d}if(F[a+92|0]&1){break d}Q=v&-2;V=v&1;D=t+77|0;R=t+76|0;U=t+72|0;l=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{p=H[a+84>>2];if(!p){break n}n=H[a+80>>2];if(p>>>0<=n>>>0){break n}l=H[a+88>>2]+(n<<3)|0;p=H[l>>2];l=H[l+4>>2];H[a+80>>2]=n+1;if(!bb(j,p,l,k)){Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break m}Ba(k,1,4073,0);j=0;break a}if((l|0)==65427){break l}}while(1){if(!(Qa(j)|qa)){H[a+8>>2]=64;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+36|0,2);if(K[t+36>>2]<=1){Ba(k,1,6048,0);j=0;break a}o:{if(H[t+40>>2]!=32896){break o}if(Qa(j)|qa){break o}H[a+8>>2]=64;break l}m=H[a+8>>2];p:{if(!(m&16)){l=H[t+36>>2];break p}l=H[t+36>>2];n=H[a+24>>2];if(!n){break p}p=l+2|0;if(p>>>0>n>>>0){Ba(k,1,8370,0);j=0;break a}H[a+24>>2]=n-p}p=l-2|0;H[t+36>>2]=p;l=24912;A=H[t+40>>2];while(1){n=l;o=H[l>>2];if(o){l=l+12|0;if((o|0)!=(A|0)){continue}}break}if(!(m&H[n+4>>2])){Ba(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=p>>>0){l=H[a+16>>2];break q}l=Qa(j);m=qa;if((m|0)<0){l=1}else{l=l>>>0

    >>0&(m|0)<=0}if(l){Ba(k,1,5797,0);j=0;break a}l=Ha(H[a+16>>2],H[t+36>>2]);if(!l){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(k,1,4973,0);j=0;break a}H[a+16>>2]=l;p=H[t+36>>2];H[a+20>>2]=p}l=Ja(j,l,p,k);if((l|0)!=H[t+36>>2]){Ba(k,1,2472,0);j=0;break a}n=H[n+8>>2];if(!n){Ba(k,1,11725,0);j=0;break a}if(!(ra[n|0](a,H[a+16>>2],l,k)|0)){H[t+32>>2]=H[t+40>>2];Ba(k,1,13959,t+32|0);j=0;break a}q=H[j+56>>2];m=H[t+36>>2];A=H[a+224>>2];p=H[A+40>>2];x=H[a+228>>2];r=N(x,40);l=p+r|0;z=H[l+20>>2];E=z+1|0;n=H[l+28>>2];r:{if(E>>>0<=n>>>0){l=H[l+24>>2];break r}X=O(O(n>>>0)+O(100));if(X=O(0)){n=~~X>>>0}else{n=0}H[l+28>>2]=n;l=Ha(H[l+24>>2],N(n,24));p=H[A+40>>2];n=r+p|0;if(!l){break k}H[n+24>>2]=l;z=H[n+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+4;n=(q-m|0)-4|0;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=o;l=p+r|0;H[l+20>>2]=E;s:{if((o|0)!=65424){break s}p=H[l+16>>2];t:{if(!p){break t}o=H[l+12>>2];if(o>>>0>=K[l+4>>2]){break t}l=p+N(o,24)|0;H[l>>2]=n;H[l+4>>2]=0}l=(H[j+56>>2]-H[t+36>>2]|0)-4|0;n=H[a+48>>2];p=H[a+52>>2];if((p|0)>0){m=1}else{m=l>>>0<=n>>>0&(p|0)>=0}if(m){break s}H[a+48>>2]=l;H[a+52>>2]=0}if(I[a+92|0]&4){if((rb(j,H[a+24>>2],k)|0)!=H[a+24>>2]|qa){Ba(k,1,2472,0);j=0;break a}H[t+40>>2]=65427;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]!=65427){continue}break}}if(!(!(Qa(j)|qa)&H[a+8>>2]==64)){l=I[a+92|0];if(!(l&4)){l=N(H[a+228>>2],5644);n=H[a+180>>2];u:{v:{if(H[a+56>>2]){q=Qa(j);break v}q=H[a+24>>2];if(q>>>0<2){break u}}q=q-2|0;H[a+24>>2]=q}n=l+n|0;if(!q){break j}l=Qa(j);p=qa;if((p|0)<0){l=1}else{l=l>>>0>>0&(p|0)<=0}if(l){if(H[a+208>>2]){Ba(k,1,5842,0);j=0;break a}Ba(k,2,5842,0)}l=H[a+24>>2];if(l>>>0>=4294967294){Ba(k,1,1480,0);j=0;break a}p=H[n+5596>>2];w:{if(p){o=H[n+5600>>2];if(o>>>0>-3-l>>>0){Ba(k,1,1211,0);j=0;break a}l=Ha(p,(l+o|0)+2|0);if(l){H[n+5596>>2]=l;break j}Ca(H[n+5596>>2]);H[n+5596>>2]=0;break w}l=Fa(l+2|0);H[n+5596>>2]=l;if(l){break j}}Ba(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=l&250;break i}l=H[t+40>>2];break g}Ca(H[n+24>>2]);a=H[A+40>>2]+N(x,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}m=H[j+56>>2];p=m-2|0;A=H[j+60>>2];z=A-(m>>>0<2)|0;r=H[a+224>>2];J=H[r+40>>2];M=H[a+228>>2];x=N(M,40);l=J+x|0;o=H[l+16>>2]+N(H[l+12>>2],24)|0;H[o+8>>2]=p;H[o+12>>2]=z;z=m;m=H[a+24>>2];z=z+m|0;H[o+16>>2]=z;H[o+20>>2]=m>>>0>z>>>0?A+1|0:A;m=H[a+24>>2];z=H[l+20>>2];E=z+1|0;o=H[l+28>>2];x:{if(E>>>0<=o>>>0){l=H[l+24>>2];break x}X=O(O(o>>>0)+O(100));if(X=O(0)){o=~~X>>>0}else{o=0}H[l+28>>2]=o;l=Ha(H[l+24>>2],N(o,24));J=H[r+40>>2];o=x+J|0;if(!l){break f}H[o+24>>2]=l;z=H[o+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+2;H[l+8>>2]=p;H[l+12>>2]=p>>31;G[l>>1]=65427;H[(x+J|0)+20>>2]=E;y:{if(q){q=Ja(j,H[n+5596>>2]+H[n+5600>>2]|0,H[a+24>>2],k);l=8;if((q|0)==H[a+24>>2]){break y}l=64;if((q|0)!=-1){break y}Ba(k,1,2472,0);j=0;break a}q=0;l=H[a+24>>2]?64:8}H[a+8>>2]=l;H[n+5600>>2]=H[n+5600>>2]+q;z:{if(F[a+92|0]&1){break z}l=H[a+44>>2];if(H[a+76>>2]|((l|0)<0|(l|0)!=H[a+228>>2])){break z}if(!Ab(j)){break z}n=H[a+228>>2];p=H[a+180>>2]+N(n,5644)|0;l=H[p+5592>>2];n=H[H[a+224>>2]+40>>2]+N(n,40)|0;if((l|0)!=H[n+4>>2]){break z}p=H[p+5588>>2]+1|0;if(l>>>0<=p>>>0){break z}A:{l=H[n+16>>2]+N(p,24)|0;n=H[l>>2];l=H[l+4>>2];if((n|0)==H[j+56>>2]&(l|0)==H[j+60>>2]){break A}if(bb(j,n,l,k)){break A}Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break h}Ba(k,1,4073,0);j=0;break a}l=I[a+92|0];if((l&9)!=1){break i}F[a+92|0]=l|8;p=H[a+228>>2];if(H[(H[a+180>>2]+N(p,5644)|0)+5592>>2]==1){break i}if(!Ab(j)){break i}l=H[j+60>>2];o=l;m=H[j+56>>2];if((l&m)==-1){break i}B:{while(1){l=1;n=t+70|0;if((Ja(j,n,2,k)|0)!=2){break B}Da(n,t- -64|0,2);if(H[t+64>>2]!=65424){break B}q=2472;if((Ja(j,n,2,k)|0)!=2){break c}Da(n,t+60|0,2);if(H[t+60>>2]!=10){q=6048;break c}H[t+60>>2]=8;n=Ja(j,t+70|0,8,k);if((n|0)!=H[t+60>>2]){break c}if((n|0)!=8){q=4047;break c}Da(t+70|0,t+56|0,2);Da(U,t+52|0,4);Da(R,t+48|0,1);Da(D,t+44|0,1);if((p|0)!=H[t+56>>2]){n=H[t+52>>2];if(n>>>0<14){break B}n=n-12|0;H[t+52>>2]=n;n=rb(j,n,k);if(!qa&H[t+52>>2]==(n|0)){continue}break B}break}l=H[t+48>>2]!=H[t+44>>2]}if(!nc(j,m,o,k)){break b}if(l){break i}F[a+92|0]=I[a+92|0]&238|16;C:{if(!v){break C}p=H[a+180>>2];q=0;l=0;if((v|0)!=1){while(1){n=p+N(q,5644)|0;o=H[n+5592>>2];if(o){H[n+5592>>2]=o+1}o=H[n+11236>>2];if(o){H[n+11236>>2]=o+1}q=q+2|0;l=l+2|0;if((Q|0)!=(l|0)){continue}break}if(!V){break C}}l=p+N(q,5644)|0;n=H[l+5592>>2];if(!n){break C}H[l+5592>>2]=n+1}Ba(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ja(j,H[a+16>>2],2,k)|0)!=2){if(!(!v|(v|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];l=0;while(1){n=j+N(l,5644)|0;if(!(H[n+5588>>2]|H[n+5592>>2])){break e}l=l+1|0;if((v|0)!=(l|0)){continue}break}}Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2)}l=H[t+40>>2];if(F[a+92|0]&1){break g}if((l|0)!=65497){continue}}break}if(H[a+8>>2]==256|(l|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Ca(H[o+24>>2]);a=H[r+40>>2]+N(M,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}H[t+16>>2]=l;Ba(k,4,11004,t+16|0);H[a+228>>2]=l;H[t+40>>2]=65497;H[a+8>>2]=256}l=H[a+228>>2];j=H[a+180>>2];D:{E:{if(F[a+92|0]&1){break E}F:{G:{if(l>>>0>=v>>>0){break G}q=j+N(l,5644)|0;while(1){if(H[q+5596>>2]){break G}l=l+1|0;H[a+228>>2]=l;q=q+5644|0;if((l|0)!=(v|0)){continue}break}break F}if((l|0)!=(v|0)){break E}}H[i>>2]=0;break D}H:{I:{n=j+N(l,5644)|0;if(H[n+5172>>2]){a=6837}else{if(!(I[n+5640|0]&2)){break H}p=H[n+5160>>2];J:{if(!p){q=0;break J}o=p&3;m=H[n+5164>>2];j=0;q=0;l=0;if(p>>>0>=4){A=p&-4;p=0;while(1){v=m+(l<<3)|0;q=H[v+28>>2]+(H[v+20>>2]+(H[v+12>>2]+(H[v+4>>2]+q|0)|0)|0)|0;l=l+4|0;p=p+4|0;if((A|0)!=(p|0)){continue}break}if(!o){break J}}while(1){q=H[(m+(l<<3)|0)+4>>2]+q|0;l=l+1|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}j=Fa(q);H[n+5172>>2]=j;if(j){break I}a=4009}Ba(k,1,a,0);Ba(k,1,8059,0);j=0;break a}H[n+5180>>2]=q;q=H[n+5164>>2];j=H[n+5160>>2];if(j){p=0;l=0;while(1){v=l<<3;o=v+q|0;m=H[o>>2];if(m){j=H[o+4>>2];if(j){B(H[n+5172>>2]+p|0,m,j)}j=v+H[n+5164>>2]|0;o=H[j+4>>2];Ca(H[j>>2]);q=H[n+5164>>2];j=v+q|0;H[j>>2]=0;H[j+4>>2]=0;p=o+p|0;j=H[n+5160>>2]}l=l+1|0;if(l>>>0>>0){continue}break}}H[n+5160>>2]=0;Ca(q);H[n+5164>>2]=0;H[n+5168>>2]=H[n+5172>>2];H[n+5176>>2]=H[n+5180>>2]}l=H[a+232>>2];Y=H[l+28>>2];n=H[a+228>>2];E=H[(H[Y+76>>2]+N(n,5644)|0)+5584>>2];j=H[l+24>>2];Z=H[j+24>>2];v=H[Y+24>>2];p=(n>>>0)/(v>>>0)|0;V=H[H[l+20>>2]>>2];o=H[Y+12>>2];l=H[Y+4>>2]+N(o,n-N(p,v)|0)|0;n=H[j>>2];n=l>>>0>n>>>0?l:n;H[V>>2]=n;v=l+o|0;l=l>>>0>v>>>0?-1:v;v=H[j+8>>2];l=l>>>0>>0?l:v;H[V+8>>2]=l;K:{L:{if(!((l|0)>(n|0)&(n|0)>=0)){Ba(k,1,6682,0);break L}q=H[V+20>>2];l=p;p=H[Y+16>>2];l=H[Y+8>>2]+N(l,p)|0;n=H[j+4>>2];n=l>>>0>n>>>0?l:n;H[V+4>>2]=n;p=l+p|0;l=l>>>0>p>>>0?-1:p;j=H[j+12>>2];j=j>>>0>l>>>0?l:j;H[V+12>>2]=j;if(!((j|0)>(n|0)&(n|0)>=0)){Ba(k,1,6644,0);break L}M:{if(H[E+4>>2]){if(H[V+16>>2]){break M}j=1;break K}Ba(k,1,5358,0);break L}N:{O:{while(1){H[Z+36>>2]=0;j=H[Z>>2];n=j>>31;o=j-1|0;l=H[V>>2];p=o+l|0;m=n-!j|0;v=m+(l>>31)|0;ta=q,ua=ue(p,l>>>0>p>>>0?v+1|0:v,j,n),H[ta>>2]=ua;l=H[Z+4>>2];p=l>>31;v=l-1|0;A=H[V+4>>2];r=v+A|0;x=p-!l|0;z=x+(A>>31)|0;ta=q,ua=ue(r,r>>>0>>0?z+1|0:z,l,p),H[ta+4>>2]=ua;z=o;o=H[V+8>>2];A=z+o|0;m=(o>>31)+m|0;ta=q,ua=ue(A,o>>>0>A>>>0?m+1|0:m,j,n),H[ta+8>>2]=ua;j=H[V+12>>2];H[q+16>>2]=fa;n=x+(j>>31)|0;j=j+v|0;n=j>>>0>>0?n+1|0:n;ta=q,ua=ue(j,n,l,p),H[ta+12>>2]=ua;j=H[E+4>>2];H[q+20>>2]=j;l=H[Y+80>>2];H[q+24>>2]=j>>>0>>0?1:j-l|0;Ca(H[q+52>>2]);H[q+68>>2]=0;H[q+60>>2]=0;H[q+64>>2]=0;H[q+52>>2]=0;H[q+56>>2]=0;j=N(j,152);l=H[q+28>>2];P:{if(!l){l=Fa(j);H[q+28>>2]=l;if(!l){break L}H[q+32>>2]=j;if(!j){break P}y(l,0,j);break P}if(j>>>0<=K[q+32>>2]){break P}l=Ha(l,j);if(!l){Ba(k,1,3090,0);Ca(H[q+28>>2]);H[q+28>>2]=0;H[q+32>>2]=0;break L}H[q+28>>2]=l;n=H[q+32>>2];p=j-n|0;if(p){y(l+n|0,0,p)}H[q+32>>2]=j}j=H[q+20>>2];if(j){ha=E+944|0;ia=E+812|0;da=E+28|0;z=H[q+28>>2];_=0;while(1){n=j-1|0;l=n&31;if((n&63)>>>0>=32){l=-1<>>32-l}p=p^-1;m=H[q>>2];o=p+m|0;v=l^-1;l=v+(m>>31)|0;m=m>>>0>o>>>0?l+1|0:l;l=n&31;if((n&63)>>>0>=32){r=m>>l}else{r=((1<>>l}H[z>>2]=r;o=H[q+4>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){x=m>>o}else{x=((1<>>o}H[z+4>>2]=x;o=H[q+8>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){m=m>>o}else{m=((1<>>o}H[z+8>>2]=m;o=H[q+12>>2];l=o+p|0;A=(o>>31)+v|0;A=l>>>0>>0?A+1|0:A;o=n&31;if((n&63)>>>0>=32){A=A>>o}else{A=((1<>>o}H[z+12>>2]=A;Q=m>>31;D=_<<2;J=H[D+ia>>2];l=J&31;if((J&63)>>>0>=32){l=1<>>32-l}R=o;o=R+m|0;U=o-1|0;l=l+Q|0;o=(o>>>0>>0?l+1|0:l)-!o|0;l=J&31;if((J&63)>>>0>=32){l=o>>l}else{l=((1<>>l}R=l<>31;Q=H[D+ha>>2];l=Q&31;if((Q&63)>>>0>=32){l=-1<>>32-l}D=o^-1;o=D+A|0;l=(l^-1)+U|0;D=o>>>0>>0?l+1|0:l;l=Q&31;if((Q&63)>>>0>=32){l=D>>l}else{l=((1<>>l}l=l<>Q:0;H[z+20>>2]=o;aa=r&-1<>J:0;H[z+16>>2]=l;re(l,0,o);if(!(!l|!qa)){break O}ba=N(l,o);if(ba>>>0>=107374183){break O}D=N(ba,40);if(_){Q=Q-1|0;J=J-1|0;l=$>>31;m=l;o=l+1|0;l=$+1|0;$=((l?m:o)&1)<<31|l>>>1;l=aa>>31;m=l;o=l+1|0;l=aa+1|0;aa=((l?m:o)&1)<<31|l>>>1;l=3}else{l=1}H[z+24>>2]=l;x=z+28|0;o=j;l=j&31;if((j&63)>>>0>=32){l=1<>>32-l}ga=j;A=l;j=H[E+12>>2];R=j>>>0>>0?j:Q;j=R&31;if((R&63)>>>0>=32){l=-1<>>32-j}ja=m^-1;ka=l^-1;j=H[E+8>>2];U=j>>>0>>0?j:J;j=U&31;if((U&63)>>>0>=32){l=-1<>>32-j}la=m^-1;ma=l^-1;ea=0;while(1){Q:{if(!_){l=H[q+4>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){S=m>>l}else{S=((1<>>l}l=H[q>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){C=m>>l}else{C=((1<>>l}j=0;m=p;M=m;l=v;T=l;r=n;break Q}j=ea+1|0;r=j>>>1|0;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];m=M+r|0;l=(l^-1)+A|0;T=s>>>0>M>>>0?l+1|0:l;l=T+(r>>31)|0;r=m>>>0>>0?l+1|0:l;l=o&31;if((o&63)>>>0>=32){S=r>>l}else{S=((1<>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];r=m+s|0;l=(l^-1)+A|0;l=m>>>0>>0?l+1|0:l;C=l+(s>>31)|0;C=r>>>0>>0?C+1|0:C;s=o&31;if((o&63)>>>0>=32){C=C>>s}else{C=((1<>>s}r=o}s=r;P=H[q+8>>2];W=P>>31;r=H[q+12>>2];H[x+4>>2]=S;H[x>>2]=C;H[x+16>>2]=j;S=(r>>31)+T|0;C=r;r=r+M|0;S=C>>>0>r>>>0?S+1|0:S;M=s&31;if((s&63)>>>0>=32){r=S>>M}else{r=((1<>>M}H[x+12>>2]=r;l=l+W|0;C=l+1|0;r=l;l=m+P|0;r=l>>>0

    >>0?C:r;m=s&31;if((s&63)>>>0>=32){l=r>>m}else{l=((1<>>m}H[x+8>>2]=l;ca=1;l=H[da>>2];j=(H[Z+24>>2]+(!H[E+20>>2]|!j?0:(j|0)==3?2:1)|0)-l|0;R:{if((j|0)>=1024){ca=898846567431158e293;if(j>>>0<2047){j=j-1023|0;break R}ca=Infinity;j=(j>>>0>=3069?3069:j)-2046|0;break R}if((j|0)>-1023){break R}ca=2004168360008973e-307;if(j>>>0>4294965304){j=j+969|0;break R}ca=0;j=(j>>>0<=4294964336?-2960:j)+1938|0}oa=+H[da+4>>2]*.00048828125+1;u(0,0);u(1,j+1023<<20);ta=x,va=O(oa*(ca*+w())),L[ta+32>>2]=va;H[x+28>>2]=(l+H[E+804>>2]|0)-1;j=H[x+20>>2];S:{T:{if(!(j|!ba)){j=Fa(D);H[x+20>>2]=j;if(!j){Ba(k,1,2854,0);break L}if(D){y(j,0,D)}H[x+24>>2]=D;break T}if(D>>>0>K[x+24>>2]){j=Ha(j,D);if(!j){Ba(k,1,2854,0);Ca(H[x+20>>2]);H[x+20>>2]=0;H[x+24>>2]=0;break L}H[x+20>>2]=j;l=H[x+24>>2];m=D-l|0;if(m){y(j+l|0,0,m)}H[x+24>>2]=D}if(!ba){break S}}j=H[x+20>>2];M=0;while(1){m=H[z+16>>2];l=(M>>>0)/(m>>>0)|0;m=M-N(l,m)|0;r=(m<>2];S=(r|0)>(s|0)?r:s;H[j>>2]=S;r=(l<>2];C=(r|0)>(s|0)?r:s;H[j+4>>2]=C;m=(m+1<>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=(l+1<>2];r=(l|0)<(r|0)?l:r;H[j+12>>2]=r;l=(m>>31)+ma|0;T=l+1|0;s=l;l=m+la|0;s=m>>>0>l>>>0?T:s;S=S>>U;m=U&31;if((U&63)>>>0>=32){l=s>>m}else{l=((1<>>m}s=l-S<>U;H[j+16>>2]=s;l=(r>>31)+ka|0;T=l+1|0;m=l;l=r+ja|0;r=l>>>0>>0?T:m;C=C>>R;m=R&31;if((R&63)>>>0>=32){l=r>>m}else{l=((1<>>m}l=l-C<>R;H[j+20>>2]=l;r=N(l,s);re(r,0,68);if(qa){Ba(k,1,2935,0);break L}l=N(r,68);m=H[j+24>>2];U:{V:{if(!(m|!r)){m=Fa(l);H[j+24>>2]=m;if(!m){break L}if(!l){break V}y(m,0,l);break V}if(l>>>0<=K[j+28>>2]){break U}m=Ha(m,l);if(!m){Ca(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ba(k,1,2549,0);break L}H[j+24>>2]=m;s=H[j+28>>2];T=l-s|0;if(!T){break V}y(m+s|0,0,T)}H[j+28>>2]=l}l=H[j+20>>2];m=H[j+16>>2];s=H[j+32>>2];W:{if(!s){l=gc(m,l,k);break W}l=ec(s,m,l,k)}H[j+32>>2]=l;l=H[j+20>>2];m=H[j+16>>2];s=H[j+36>>2];X:{if(!s){l=gc(m,l,k);break X}l=ec(s,m,l,k)}H[j+36>>2]=l;if(r){l=0;while(1){W=H[j+16>>2];T=(l>>>0)/(W>>>0)|0;m=H[j+24>>2]+N(l,68)|0;P=H[m>>2];Y:{if(P){pa=H[m+56>>2];sa=H[m+4>>2];s=H[m+48>>2];Ca(H[m+60>>2]);H[m+48>>2]=0;H[m+52>>2]=0;H[m+64>>2]=0;H[m+56>>2]=0;H[m+60>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;H[m>>2]=P;H[m+48>>2]=s;Z:{if(!s){break Z}s=N(s,24);if(!s){break Z}y(P,0,s)}H[m+56>>2]=pa;H[m+4>>2]=sa;break Y}s=Ea(10,24);H[m>>2]=s;if(!s){break L}H[m+48>>2]=10}s=(l-N(T,W)|0)+S|0;P=s<>2];H[m+8>>2]=(P|0)>(W|0)?P:W;T=C+T|0;P=T<>2];H[m+12>>2]=(P|0)>(W|0)?P:W;s=s+1<>2];H[m+16>>2]=(s|0)<(P|0)?s:P;P=m;m=T+1<>2];H[P+20>>2]=(m|0)<(s|0)?m:s;l=l+1|0;if((r|0)!=(l|0)){continue}break}}j=j+40|0;M=M+1|0;if((M|0)!=(ba|0)){continue}break}}da=da+8|0;x=x+36|0;ea=ea+1|0;if(ea>>>0>2]){continue}break}z=z+152|0;j=n;_=_+1|0;if(_>>>0>2]){continue}break}}Z=Z+52|0;q=q+76|0;E=E+1080|0;fa=fa+1|0;if(fa>>>0>2]){continue}break}j=1;break K}Ba(k,1,2982,0);break L}Ba(k,1,2373,0)}j=0}if(!j){Ba(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[t+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[t>>2]=j+1;Ba(k,4,11825,t);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=Rb(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ba(k,1,q,0)}Ba(k,1,3702,0);j=0}a=j;na=t+80|0;return a|0}function Vb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break k}}Ba(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){k=H[a+36>>2];b=0;break i}H[a+44>>2]=0;i=H[a+68>>2];b=1;break i;case 1:l:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break l}}Ba(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){e=H[a+36>>2];b=0;break e}H[a+44>>2]=0;i=H[a+48>>2];b=1;break e;case 2:m:{A=H[a+52>>2];x=H[a+196>>2];if(A>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break m}}Ba(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){y=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;j=H[a+200>>2];while(1){O=j+(u<<4)|0;l=H[O+8>>2];if(l){q=H[O+12>>2];b=0;while(1){g=l+(b^-1)|0;d=q+(b<<4)|0;s=g+H[d>>2]|0;n:{if(s>>>0>31){break n}c=H[O>>2];if(c>>>0>-1>>>s>>>0){break n}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;o:{if(g>>>0>31){break o}c=H[O+4>>2];if(c>>>0>-1>>>g>>>0){break o}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((l|0)!=(b|0)){continue}break}}u=u+1|0;if((x|0)!=(u|0)){continue}break};if(!k|!i){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}o=H[a+48>>2];b=1;break f;case 3:p:{A=H[a+52>>2];l=H[a+196>>2];if(A>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ba(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){B=H[a+200>>2];e=H[a+28>>2];y=B+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;B=H[a+200>>2];while(1){x=(p<<4)+B|0;s=H[x+8>>2];if(s){q=H[x+12>>2];b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;q:{if(j>>>0>31){break q}c=H[x>>2];if(c>>>0>-1>>>j>>>0){break q}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;r:{if(g>>>0>31){break r}c=H[x+4>>2];if(c>>>0>-1>>>g>>>0){break r}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((s|0)!=(b|0)){continue}break}}p=p+1|0;if((l|0)!=(p|0)){continue}break};if(!k|!i){break d}s:{if(I[a|0]){p=H[a+108>>2];break s}p=H[a+208>>2];H[a+108>>2]=p;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=1;break g;case 4:break j;default:break d}}t:{p=H[a+52>>2];b=H[a+196>>2];if(p>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break t}}Ba(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){p=H[a+28>>2];o=H[a+200>>2]+(p<<4)|0;u=H[a+40>>2];b=0;break h}H[a+28>>2]=p;H[a+44>>2]=0;b=1;break h}u:while(1){v:{w:{if(!b){k=k+1|0;break w}H[a+40>>2]=i;if(K[a+56>>2]<=i>>>0){break b}e=H[a+48>>2];b=0;break v}b=1}x:while(1){y:{z:{A:{B:{if(!b){H[a+32>>2]=e;if(K[a+60>>2]<=e>>>0){break B}H[a+28>>2]=c;b=c;o=0;break y}H[a+36>>2]=k;if(K[a+76>>2]<=k>>>0){b=H[a+28>>2];o=1;break y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],k)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break A}break a}i=H[a+40>>2]+1|0;break z}b=0;continue u}b=1;continue u}while(1){C:{D:{E:{if(!o){if(b>>>0>=q>>>0){break E}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break C}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}k=H[a+72>>2];b=1;continue x}b=b+1|0;H[a+28>>2]=b;break D}e=H[a+32>>2]+1|0;b=0;continue x}o=0;continue}o=1;continue}}}}F:while(1){G:{H:{if(!b){u=u+1|0;H[a+40>>2]=u;break H}if(p>>>0>=r>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;o=H[a+200>>2]+(p<<4)|0;s=H[o+8>>2];if(!s){break b}q=H[o+12>>2];k=0;e=0;b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;I:{if(j>>>0>31){break I}c=H[o>>2];if(c>>>0>-1>>>j>>>0){break I}c=c<>>0>e>>>0?e:c:c;H[a+228>>2]=e}g=g+H[d+4>>2]|0;J:{if(g>>>0>31){break J}c=H[o+4>>2];if(c>>>0>-1>>>g>>>0){break J}c=c<>>0>k>>>0?k:c:c;H[a+232>>2]=k}b=b+1|0;if((s|0)!=(b|0)){continue}break}if(!e|!k){break d}K:{if(I[a|0]){k=H[a+108>>2];break K}k=H[a+208>>2];H[a+108>>2]=k;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=0;break G}b=1}L:while(1){M:{N:{O:{P:{if(!b){H[a+224>>2]=k;if(K[a+112>>2]<=k>>>0){break P}B=H[a+100>>2];b=0;break M}if(K[a+56>>2]<=u>>>0){i=H[a+32>>2];b=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],u)|0)+N(H[a+20>>2],p)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}break a}p=p+1|0;H[a+28>>2]=p;break N}b=0;continue F}b=1;continue F}while(1){Q:{R:{S:{T:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break S}i=H[a+48>>2];break T}i=i+1|0}H[a+32>>2]=i;b=H[a+60>>2];d=H[o+8>>2];if((b>>>0>>0?b:d)>>>0>i>>>0){g=H[o>>2];c=g;n=d+(i^-1)|0;m=n;d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[o+4>>2];if((b&c)!=(c|0)){break Q}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,C);A=v-1|0;j=H[a+212>>2];l=A+j|0;d=f-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,f);D=H[a+204>>2];j=A+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,f);z=H[o+12>>2]+(i<<4)|0;M=H[z>>2];t=M+n|0;b=t&31;if((t&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break Q}h=c;P=H[z+4>>2];n=P+n|0;e=n&31;if((n&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break Q}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=n&31;if((n&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=n<>>32-e|b<>2];if((t&63)>>>0>=32){b=g<>>32-n;e=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=j<>>32-t|b<>2];if(!n|(!H[z+12>>2]|(j|0)==(x|0))){break Q}if((s|0)==(O|0)){break Q}u=H[a+68>>2];H[a+40>>2]=u;b=d;c=c+A|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(n,(ve(c,b,w,C)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue L}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break R}c=H[a+224>>2];b=H[a+232>>2];k=c+b-(c>>>0)%(b>>>0)|0;b=0;continue L}b=0;continue}b=1;continue}}}}U:while(1){V:{W:{if(!b){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=p;if(K[a+112>>2]<=p>>>0){break b}v=H[a+100>>2];b=0;break V}b=1}X:while(1){Y:{Z:{_:{$:{if(!b){H[a+220>>2]=v;if(K[a+104>>2]<=v>>>0){break $}H[a+28>>2]=A;e=A;b=0;break Y}if(K[a+56>>2]<=E>>>0){u=H[a+32>>2];b=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];p=c+b-(c>>>0)%(b>>>0)|0;break Z}b=0;continue U}b=1;continue U}while(1){aa:{ba:{ca:{da:{if(!b){if(e>>>0>=P>>>0){break ca}u=H[a+48>>2];H[a+32>>2]=u;y=(e<<4)+B|0;break da}u=u+1|0;H[a+32>>2]=u}b=H[a+60>>2];d=H[y+8>>2];if((b>>>0>>0?b:d)>>>0>u>>>0){g=H[y>>2];c=g;f=d+(u^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;k=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[y+4>>2];if((b&c)!=(c|0)){break aa}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;o=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,o,b);b=h;w=H[a+208>>2];d=w+F|0;b=w>>>0>d>>>0?b+1|0:b;s=ve(d,b,o,n);C=k-1|0;j=H[a+212>>2];l=C+j|0;d=t-!k|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,k,t);L=H[a+204>>2];j=C+L|0;b=L>>>0>j>>>0?b+1|0:b;j=ve(j,b,k,t);D=H[y+12>>2]+(u<<4)|0;z=H[D>>2];m=z+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break aa}h=c;M=H[D+4>>2];f=M+f|0;r=f&31;if((f&63)>>>0>=32){b=c<>>32-r;r=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break aa}l=H[a+224>>2];r=!!(we(l,r,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-r|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[D+12>>2]|(j|0)==(x|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,o,n)>>>M)-(s>>>M)|0)+g|0,H[S+36>>2]=T;b=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];v=c+b-(c>>>0)%(b>>>0)|0;b=0;continue X}b=0;continue}b=1;continue}}}}ea:while(1){fa:{ga:{if(!b){y=y+1|0;H[a+40>>2]=y;break ga}H[a+32>>2]=o;if(K[a+60>>2]<=o>>>0){break b}E=H[a+108>>2];b=0;break fa}b=1}ha:while(1){ia:{ja:{ka:{la:{if(!b){H[a+224>>2]=E;if(K[a+112>>2]<=E>>>0){break la}B=H[a+100>>2];b=0;break ia}if(K[a+56>>2]<=y>>>0){p=H[a+28>>2];b=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],y)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break ka}break a}o=H[a+32>>2]+1|0;break ja}b=0;continue ea}b=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break oa}H[a+28>>2]=A;p=A;break pa}p=p+1|0;H[a+28>>2]=p}if(p>>>0>>0){m=H[a+32>>2];e=H[a+200>>2]+(p<<4)|0;b=H[e+8>>2];if(m>>>0>=b>>>0){break ma}g=H[e>>2];c=g;f=b+(m^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[e+4>>2];if((b&c)!=(c|0)){break ma}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,n);C=v-1|0;j=H[a+212>>2];l=C+j|0;d=t-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,t);D=H[a+204>>2];j=C+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,t);z=H[e+12>>2]+(m<<4)|0;M=H[z>>2];m=M+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break ma}h=c;P=H[z+4>>2];f=P+f|0;e=f&31;if((f&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break ma}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-e|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[z+12>>2]|(j|0)==(x|0))){break ma}if((s|0)==(O|0)){break ma}y=H[a+68>>2];H[a+40>>2]=y;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,w,n)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];E=c+b-(c>>>0)%(b>>>0)|0;b=0;continue ha}b=0;continue}b=1;continue}}}}qa:while(1){ra:{sa:{if(!b){e=e+1|0;break sa}H[a+32>>2]=i;if(K[a+60>>2]<=i>>>0){break b}k=H[a+68>>2];b=0;break ra}b=1}ta:while(1){ua:{va:{wa:{xa:{if(!b){H[a+40>>2]=k;if(K[a+56>>2]<=k>>>0){break xa}H[a+28>>2]=c;b=c;o=0;break ua}H[a+36>>2]=e;if(K[a+76>>2]<=e>>>0){b=H[a+28>>2];o=1;break ua}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],e)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break wa}break a}i=H[a+32>>2]+1|0;break va}b=0;continue qa}b=1;continue qa}while(1){ya:{za:{Aa:{if(!o){if(b>>>0>=q>>>0){break Aa}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break ya}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}e=H[a+72>>2];b=1;continue ta}b=b+1|0;H[a+28>>2]=b;break za}k=H[a+40>>2]+1|0;b=0;continue ta}o=0;continue}o=1;continue}}}}return 0}Ba(H[a+236>>2],1,1343,0)}return 0}G[b>>1]=1;return 1}function nd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=O(0),t=0,u=0,v=0,w=O(0),x=0,z=0,A=0,C=O(0),D=O(0),E=O(0),G=0,J=0,K=0,L=0,M=0,Q=O(0),R=0,S=0,T=0;n=na-8320|0;na=n;H[n+64>>2]=0;j=2;g=H[a>>2];a:{b:{if((g|0)==176622093){break b}if((g|0)!=1375686655){if(!((g|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}g=Ea(1,96);k=0;c:{if(!g){break c}H[g+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[g+88>>2]=68;H[g+84>>2]=69;H[g+80>>2]=70;H[g+16>>2]=71;H[g+4>>2]=72;H[g+28>>2]=73;H[g+24>>2]=74;H[g+20>>2]=75;H[g>>2]=76;H[g+92>>2]=77;H[g+44>>2]=78;H[g+40>>2]=79;H[g+36>>2]=80;H[g+32>>2]=81;H[g+12>>2]=82;H[g+8>>2]=83;i=Jb();H[g+48>>2]=i;if(i){break e}break d;case 2:break f;default:break d}}H[g+88>>2]=84;H[g+84>>2]=85;H[g+80>>2]=86;H[g+16>>2]=87;H[g+4>>2]=88;H[g+92>>2]=89;H[g+44>>2]=90;H[g+40>>2]=91;H[g+36>>2]=92;H[g+32>>2]=93;H[g+28>>2]=94;H[g+24>>2]=95;H[g+20>>2]=96;H[g+12>>2]=97;H[g+8>>2]=98;H[g>>2]=99;i=Ea(1,136);g:{if(i){k=Jb();H[i>>2]=k;h:{if(!k){break h}F[i+124|0]=0;H[i+116>>2]=0;H[i+120>>2]=0;H[i+108>>2]=0;H[i+112>>2]=0;k=qb();H[i+4>>2]=k;if(!k){break h}k=qb();H[i+8>>2]=k;if(!k){break h}break g}Fc(i)}i=0}H[g+48>>2]=i;if(!i){break d}}H[g+72>>2]=1;H[g+64>>2]=1;H[g+60>>2]=0;H[g+52>>2]=0;H[g+56>>2]=0;H[g+68>>2]=1;k=g;break c}Ca(g);k=0}g=k;if(g){H[g+60>>2]=0;H[g+72>>2]=100}if(g){H[g+56>>2]=0;H[g+68>>2]=101}if(g){H[g+52>>2]=0;H[g+64>>2]=102}i=n+68|0;if(i){y(i,0,8248);H[i+8248>>2]=0;H[i+8200>>2]=-1;H[i+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;i=n+52|0;i:{if(!i){break i}a=Ea(1,72);if(a){j:{H[a+64>>2]=1048576;k=Fa(1048576);H[a+32>>2]=k;if(!k){Ca(a);a=0;break j}H[a+36>>2]=k;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=i}if(a){H[a+8>>2]=H[i+8>>2];H[a+12>>2]=0}if(!(!a|!(I[a+68|0]&2))){H[a+16>>2]=64}if(a){H[a+24>>2]=66}if(a){H[a+28>>2]=67}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ba(g+52|0,1,9902,0);a=0;break k}ra[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);fb(b);hb(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ba(g+52|0,1,9983,0);a=0;break l}a=ra[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);fb(b);hb(g);Ua(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=ra[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);fb(b);hb(g);Ua(H[n+64>>2]);break a}a=H[n+64>>2];n:{if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(a){break n}}Y(1316);hb(g);fb(b);Ua(H[n+64>>2]);break a}fb(b);hb(g);l=H[n+64>>2];a=H[l+28>>2];if(a){Ca(a);l=H[n+64>>2];H[l+28>>2]=0;H[l+32>>2]=0}v=H[l+16>>2];o:{p:{if(!c){if(!(!e|(v|0)!=4)){p=1;v=4;break o}q:{b=H[l+20>>2];if(!((b|0)==3|(v|0)!=3)){a=H[l+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[l+20>>2]=3;break p}if(v>>>0>2){break q}H[l+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(v>>>0<4){break t}b=H[l+24>>2];a=H[b>>2];if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]|(a|0)!=H[b+156>>2]){break t}a=H[b+4>>2];if((a|0)!=H[b+56>>2]|(a|0)!=H[b+108>>2]){break t}if((a|0)==H[b+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Ga(26072,8179,n+16|0);break o}f=N(H[b+12>>2],H[b+8>>2]);C=O(O(1)/O((-1<>2]^-1)>>>0));D=O(O(1)/O((-1<>2]^-1)>>>0));w=O(O(1)/O((-1<>2]^-1)>>>0));Q=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(f|0)){c=a<<2;g=c+H[b+148>>2]|0;i=H[g>>2];k=c+H[b+96>>2]|0;j=H[k>>2];m=c+H[b+44>>2]|0;s=O(O(1)-O(C*O(H[c+H[b+200>>2]>>2])));E=O(O(O(O(1)-O(Q*O(H[m>>2])))*O(255))*s);if(O(P(E))>2]=c;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))>2]=c;s=O(O(O(O(1)-O(D*O(i|0)))*O(255))*s);if(O(P(s))>2]=c;a=a+1|0;continue}break};Ca(H[b+200>>2]);a=H[l+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[l+20>>2]=1;a=H[l+16>>2]-1|0;H[l+16>>2]=a;h=3;while(1){if(a>>>0<=h>>>0){break o}a=H[l+24>>2]+N(h,52)|0;B(a,a+52|0,52);h=h+1|0;a=H[l+16>>2];continue};case 0:break p;case 1:break r;default:break o}}b=H[l+24>>2];a=H[b>>2];u:{v:{if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]){break v}a=H[b+4>>2];if((a|0)!=H[b+56>>2]){break v}if((a|0)==H[b+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Ga(26072,8221,n+32|0);break o}a=H[b+24>>2];c=-1<>2]?0:a;i=H[b+84>>2]?0:a;k=N(H[b+12>>2],H[b+8>>2]);a=0;while(1){if((a|0)!=(k|0)){f=a<<2;j=f+H[b+44>>2]|0;m=f+H[b+148>>2]|0;s=O(H[m>>2]-g|0);h=f+H[b+96>>2]|0;C=O(H[h>>2]-i|0);D=O(H[j>>2]);w=O(O(O(s*O(1.4019900560379028))+O(O(C*O(-3680000008898787e-20))+D))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;w=O(O(O(s*O(-.7141128182411194))+O(O(D*O(1.0003000497817993))+O(C*O(-.34412500262260437))))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;s=O(O(O(s*O(-7999999979801942e-21))+O(O(D*O(.9998229742050171))+O(C*O(1.7720400094985962))))+O(.5));if(O(P(s))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;a=a+1|0;continue}break}H[l+20>>2]=1;break o}v=c>>>0>v>>>0?v:c;p=1;break o}w:{x:{c=H[l+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];G=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;g=Ia(c);i=Ia(c);k=Ia(c);if(!(!g|!i|!k)){m=-1<>2]&1;L=f-b|0;K=H[l>>2]&1;x=q-K|0;if(!b){c=k;f=i;b=g;break w}c=k;f=i;b=g;while(1){if((p|0)==(q|0)){break w}Ka(o,m,H[j>>2],0,0,b,f,c);p=p+1|0;c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;continue}}Ca(g);Ca(i);Ca(k);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];h=H[c+44>>2];t=H[c+60>>2];g=H[c+8>>2];x=H[c+12>>2];c=N(g,x)<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){o=-1<>2]&1;a=g-z|0;G=a&1;u=a>>>1|0;J=a&-2;a=m;j=k;c=i;while(1){if((q|0)!=(x|0)){if(z){Ka(r,o,H[h>>2],0,0,c,j,a);j=j+4|0;c=c+4|0;h=h+4|0;a=a+4|0}g=0;while(1){if(g>>>0>>0){Ka(r,o,H[h>>2],H[b>>2],H[f>>2],c,j,a);Ka(r,o,H[h+4>>2],H[b>>2],H[f>>2],c+4|0,j+4|0,a+4|0);g=g+2|0;f=f+4|0;b=b+4|0;a=a+8|0;j=j+8|0;c=c+8|0;h=h+8|0;continue}break}z:{if(!G){break z}g=H[h>>2];A:{if((t|0)==(u|0)){Ka(r,o,g,0,0,c,j,a);break A}Ka(r,o,g,H[b>>2],H[f>>2],c,j,a)}a=a+4|0;j=j+4|0;c=c+4|0;h=h+4|0;if(t>>>0<=u>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){q=-1<>2],H[a>>2],H[h>>2],g,b,f);c=c+1|0;f=f+4|0;b=b+4|0;g=g+4|0;h=h+4|0;a=a+4|0;j=j+4|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);H[H[l+24>>2]+148>>2]=m;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Ga(26072,8264,n);break o}J=x>>>1|0;z=x&-2;R=L&-2;u=q<<2;while(1){if(M>>>0>>0){p=c+u|0;r=f+u|0;q=b+u|0;t=j+u|0;if(K){Ka(o,m,H[j>>2],0,0,b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;t=t+4|0;c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}A=0;while(1){if(z>>>0>A>>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);Ka(o,m,H[t+4>>2],H[a>>2],H[h>>2],q+4|0,r+4|0,p+4|0);A=A+2|0;h=h+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;t=t+8|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}B:{if((x|0)==(z|0)){break B}A=H[j>>2];C:{if((G|0)==(J|0)){Ka(o,m,A,0,0,b,f,c);Ka(o,m,H[t>>2],0,0,q,r,p);break C}Ka(o,m,A,H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p)}c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;if(G>>>0<=J>>>0){break B}h=h+4|0;a=a+4|0}M=M+2|0;c=c+u|0;f=f+u|0;b=b+u|0;j=j+u|0;continue}break}D:{if(!(L&1)){break D}if(K){Ka(o,m,H[j>>2],0,0,b,f,c);c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);p=p+2|0;h=h+4|0;a=a+4|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}if((x|0)==(z|0)){break D}j=H[j>>2];if((G|0)==(J|0)){Ka(o,m,j,0,0,b,f,c);break D}Ka(o,m,j,H[a>>2],H[h>>2],b,f,c)}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=g;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=i;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=k;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;p=0}c=H[n+64>>2];E:{if(d){break E}b=0;while(1){if((b|0)==(v|0)){break E}a=H[c+24>>2]+N(b,52)|0;d=H[a+24>>2];if((d|0)!=8){F:{if(d>>>0<=7){f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];if(H[a+32>>2]){i=1<>2];k=d>>31<<7|d>>>25;S=m,T=ue(d<<7,k,i,0),H[S>>2]=T;h=h+1|0;continue}}d=-1<>2],0,255),qa,d,0);H[i>>2]=k;h=h+1|0;continue}}d=d-8|0;f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];h=0;if(H[a+32>>2]){while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>d;h=h+1|0;continue}}while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>>d;h=h+1|0;continue}}H[a+24>>2]=8}b=b+1|0;continue}}a=H[c+24>>2];b=N(H[a+12>>2],H[a+8>>2]);G:{if(!p){if(H[c+20>>2]==2){if(H[c+16>>2]==1){ma(H[a+44>>2],b|0);break G}if(!e){break G}da(H[a+44>>2],H[a+96>>2],b|0);break G}ca(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G}H:{switch(v-1|0){case 0:ba(H[a+44>>2],b|0);break G;case 2:aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G;case 3:break H;default:break G}}$(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Ua(H[n+64>>2]);j=0}na=n+8320|0;return j|0}function ac(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0,O=0,P=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}E=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];G=(b>>>0)/(s>>>0)|0;M=(N(s,G)-b|0)+s|0;I=(g|0)!=8;z=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(z|0)?j-((c>>>0)%(j>>>0)|0)|0:j;t=e-z|0;r=j>>>0>>0?j:t;A=r&-4;u=r&3;O=r&-8;J=r&7;x=r-1|0;P=(g|0)==2&(r|0)==1;L=N(k-j|0,s);C=(N(z-c|0,h)<<2)+f|0;F=G;t=b;while(1){j=(b|0)==(t|0)?M:s;k=d-t|0;q=j>>>0>>0?j:k;k=s-j|0;l=F<<2;j=H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{if(i){h:{i:{j:{k:{if(j){l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;if((g|0)==1){break h}m=(N(g,j)<<2)+C|0;if((q|0)==1){break i}if(P){break j}if(q>>>0<=7|I){break k}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)!=1){if(!r){break b}p=q&-4;n=q&3;l=(N(t-b|0,g)<<2)+C|0;o=0;D=q-1>>>0<3;while(1){l:{if(!q){break l}m=0;j=0;k=0;if(!D){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((p|0)!=(k|0)){continue}break}if(!n){break l}}while(1){H[(N(g,j)<<2)+l>>2]=0;j=j+1|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!r){break b}l=q<<2;k=(t-b<<2)+C|0;o=0;if(x>>>0>=7){break g}break f}if(!r){break b}D=q&-4;p=q&3;n=0;v=q-1>>>0<3;break c}j=0;k=q&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=q>>>0){break b}o=0;k=j;n=q-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-q>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((q|0)!=(k|0)){continue}break}break b}if(!r){break b}k=0;if(x>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;m=j+m|0;p=l;l=s<<2;o=p+l|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];l=l+o|0;m=j+m|0;k=k+4|0;if((A|0)!=(k|0)){continue}break}if(!u){break b}}j=0;while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)!=4){if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break e}break d}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}if(!j){j=Ea(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2]=j}l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;m:{n:{o:{p:{q:{r:{if((g|0)!=1){m=(N(g,j)<<2)+C|0;if((q|0)==1){break r}if(q>>>0<=7|I){break q}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)==4){break p}if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break o}break n}if(!r){break b}o=0;if(x>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}j=0;while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}if(!r){break b}D=q&-4;p=q&3;n=0;break m}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;m=h<<2;j=m+j|0;n=H[j+12>>2];k=l;l=s<<2;k=k+l|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;l=l+k|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}p=j;j=h<<2;n=p+j|0;p=l;l=s<<2;p=p+l|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}j=j+n|0;l=l+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){s:{if(!q){break s}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];v=j|1;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|2;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|3;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break s}}while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=!l;if(!j){y(k,0,l)}p=k;k=h<<2;m=p+k|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}k=k+m|0;o=o+8|0;if((O|0)!=(o|0)){continue}break}if(!J){break b}}j=0;while(1){if(l){y(k,0,l)}k=(h<<2)+k|0;j=j+1|0;if((J|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}p=l;l=s<<2;n=p+l|0;p=j;j=h<<2;p=p+j|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}l=l+n|0;j=j+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){t:{if(!q){break t}k=0;j=0;o=0;if(!v){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];w=j|1;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|2;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|3;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break t}}while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}}F=F+1|0;t=q+t|0;if(t>>>0>>0){continue}break}E=E+1|0;z=r+z|0;if(z>>>0>>0){continue}break}}return 1}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!c){return 0}if(!Gb(H[a>>2],b,c,d)){Ba(d,1,6210,0);return 0}n=c;m=d;g=na-240|0;na=g;r=1;o=a;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{c=H[a+116>>2];c:{if(!c){a=H[a+120>>2];break c}b=H[n+16>>2];a=H[o+120>>2];if(!(!a|!H[a+12>>2])){b=I[a+18|0]}d:{d=J[c+4>>1];if(d){c=H[c>>2];while(1){f=c+N(e,6)|0;h=J[f>>1];if(h>>>0>=b>>>0){H[g+180>>2]=b;H[g+176>>2]=h;Ba(m,1,13715,g+176|0);r=0;break a}e:{f=J[f+4>>1];if((f+1&65535)>>>0<2){break e}f=f-1|0;if(f>>>0>>0){break e}H[g+164>>2]=b;H[g+160>>2]=f;Ba(m,1,13715,g+160|0);r=0;break a}e=e+1|0;if((d|0)!=(e|0)){continue}break}break d}if(b){break b}break c}while(1){b=b-1|0;e=0;while(1){if(J[c+N(e,6)>>1]!=(b|0)){e=e+1|0;if((d|0)!=(e|0)){continue}break b}break}if(b){continue}break}}f:{if(!a){break f}c=H[a+12>>2];if(!c){break f}g:{b=I[a+18|0];h:{if(b){e=0;h=1;while(1){a=H[n+16>>2];d=J[c+(e<<2)>>1];if(a>>>0<=d>>>0){H[g+148>>2]=a;H[g+144>>2]=d;Ba(m,1,13715,g+144|0);h=0}e=e+1|0;if((b|0)!=(e|0)){continue}break}a=Ea(b,4);if(!a){break h}e=0;while(1){d=c+(e<<2)|0;f=I[d+2|0];i:{if(f>>>0>=2){H[g+68>>2]=f;H[g+64>>2]=e;Ba(m,1,12094,g- -64|0);h=0;break i}d=I[d+3|0];if(d>>>0>=b>>>0){H[g+128>>2]=d;Ba(m,1,12038,g+128|0);h=0;break i}j=(f|0)!=1;i=(d<<2)+a|0;if(!(j|!H[i>>2])){H[g+80>>2]=d;Ba(m,1,11527,g+80|0);h=0;break i}if(!(f|!d)){H[g+100>>2]=d;H[g+96>>2]=e;Ba(m,1,11901,g+96|0);h=0;break i}if(!(j|(d|0)==(e|0))){H[g+120>>2]=d;H[g+116>>2]=e;H[g+112>>2]=e;Ba(m,1,11937,g+112|0);h=0;break i}H[i>>2]=1}e=e+1|0;if((b|0)!=(e|0)){continue}break}h=!h;e=0;while(1){j:{d=e<<2;if(I[(c+d|0)+2|0]?H[d+a>>2]:1){e=e+1|0;if((b|0)!=(e|0)){continue}if(h&1){break j}if(H[n+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+a>>2]){e=e+1|0;if((b|0)!=(e|0)){continue}break g}break}d=0;Ba(m,2,9253,0);f=b&3;e=0;if(b>>>0>=4){h=b&252;b=0;while(1){j=c+(e<<2)|0;F[j+3|0]=e;F[j+2|0]=1;j=e|1;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|2;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|3;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;e=e+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}if(!f){break g}}while(1){b=c+(e<<2)|0;F[b+3|0]=e;F[b+2|0]=1;e=e+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}break g}H[g+48>>2]=e;h=1;Ba(m,1,11101,g+48|0);e=e+1|0;if((b|0)!=(e|0)){continue}}break}Ca(a);r=0;break a}a=Ea(b,4);if(a){break g}}r=0;Ba(m,1,12285,0);break a}Ca(a)}a=H[o+120>>2];k:{if(!a){break k}l=H[a+12>>2];if(!l){Ca(H[a+4>>2]);Ca(H[H[o+120>>2]+8>>2]);Ca(H[H[o+120>>2]>>2]);a=H[o+120>>2];b=H[a+12>>2];if(b){Ca(b);a=H[o+120>>2]}Ca(a);H[o+120>>2]=0;break k}j=H[n+24>>2];l:{c=I[a+18|0];m:{if(c){u=H[a>>2];h=H[a+4>>2];i=H[a+8>>2];e=0;n:{while(1){if(H[(j+N(J[l+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((c|0)!=(e|0)){continue}break n}break}H[g+32>>2]=e;Ba(m,1,13877,g+32|0);r=0;break a}f=Fa(N(c,52));if(!f){break m}d=0;while(1){a=l+(d<<2)|0;e=J[a>>1];b=N(I[a+2|0]?I[a+3|0]:d,52)+f|0;a=j+N(e,52)|0;H[b+48>>2]=H[a+48>>2];e=H[a+44>>2];H[b+40>>2]=H[a+40>>2];H[b+44>>2]=e;e=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=e;e=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=e;e=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=e;e=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=e;e=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=e;b=N(d,52)+f|0;a=Ia(N(H[a+8>>2],H[a+12>>2])<<2);H[b+44>>2]=a;if(!a){if(d){a=d&65535;while(1){Ca(H[(N(a,52)+f|0)-8>>2]);a=a-1|0;if(a){continue}break}}Ca(f);r=0;Ba(m,1,13825,0);break a}H[b+24>>2]=I[d+i|0];H[b+32>>2]=I[d+h|0];d=d+1|0;if((c|0)!=(d|0)){continue}break}h=J[H[o+120>>2]+16>>1]-1|0;while(1){a=N(q,52)+f|0;d=N(H[a+12>>2],H[a+8>>2]);b=l+(q<<2)|0;e=H[(j+N(J[b>>1],52)|0)+44>>2];o:{if(!I[b+2|0]){if(!d){break o}i=H[a+44>>2];p=d&3;a=0;b=0;if(d>>>0>=4){t=d&-4;k=0;while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];s=d|4;H[s+i>>2]=H[e+s>>2];s=d|8;H[s+i>>2]=H[e+s>>2];d=d|12;H[d+i>>2]=H[d+e>>2];b=b+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!p){break o}}while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];b=b+1|0;a=a+1|0;if((p|0)!=(a|0)){continue}break}break o}if(!d){break o}b=I[b+3|0];a=(b<<2)+u|0;i=H[(N(b,52)+f|0)+44>>2];b=0;if((d|0)!=1){t=d&1;s=d&-2;d=0;while(1){k=b<<2;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];k=k|4;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];b=b+2|0;d=d+2|0;if((s|0)!=(d|0)){continue}break}if(!t){break o}}d=b<<2;b=H[d+e>>2];H[d+i>>2]=H[a+(N(c,(b|0)>=0?(b|0)<(h|0)?b:h:0)<<2)>>2]}q=q+1|0;if((c|0)!=(q|0)){continue}break}break l}f=Fa(N(c,52));if(f){break l}}r=0;Ba(m,1,13825,0);break a}a=H[n+16>>2];if(a){e=0;while(1){b=H[(j+N(e,52)|0)+44>>2];if(b){Ca(b)}e=e+1|0;if((a|0)!=(e|0)){continue}break}}Ca(j);H[n+16>>2]=c;H[n+24>>2]=f}e=H[o+116>>2];if(!e){break a}h=H[e>>2];i=J[e+4>>1];if(i){e=0;p=i-2&65535;d=1;while(1){a=H[n+16>>2];q=N(e,6)+h|0;b=J[q>>1];p:{if(a>>>0<=b>>>0){H[g+20>>2]=a;H[g+16>>2]=b;Ba(m,2,7334,g+16|0);break p}c=J[q+4>>1];if((c+1&65535)>>>0<=1){G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1];break p}c=c-1|0;j=c&65535;if(j>>>0>=a>>>0){H[g+4>>2]=a;H[g>>2]=j;Ba(m,2,7293,g);break p}q:{if(J[q+2>>1]|(b|0)==(j|0)){break q}f=H[n+24>>2];a=f+N(b,52)|0;H[g+232>>2]=H[a+48>>2];l=H[a+44>>2];H[g+224>>2]=H[a+40>>2];H[g+228>>2]=l;l=H[a+36>>2];H[g+216>>2]=H[a+32>>2];H[g+220>>2]=l;l=H[a+28>>2];H[g+208>>2]=H[a+24>>2];H[g+212>>2]=l;l=H[a+20>>2];H[g+200>>2]=H[a+16>>2];H[g+204>>2]=l;l=H[a+12>>2];H[g+192>>2]=H[a+8>>2];H[g+196>>2]=l;l=H[a+4>>2];H[g+184>>2]=H[a>>2];H[g+188>>2]=l;l=N(j,52);f=l+f|0;H[a+48>>2]=H[f+48>>2];k=H[f+44>>2];H[a+40>>2]=H[f+40>>2];H[a+44>>2]=k;k=H[f+36>>2];H[a+32>>2]=H[f+32>>2];H[a+36>>2]=k;k=H[f+28>>2];H[a+24>>2]=H[f+24>>2];H[a+28>>2]=k;k=H[f+20>>2];H[a+16>>2]=H[f+16>>2];H[a+20>>2]=k;k=H[f+12>>2];H[a+8>>2]=H[f+8>>2];H[a+12>>2]=k;k=H[f+4>>2];H[a>>2]=H[f>>2];H[a+4>>2]=k;a=l+H[n+24>>2]|0;H[a+48>>2]=H[g+232>>2];f=H[g+228>>2];H[a+40>>2]=H[g+224>>2];H[a+44>>2]=f;f=H[g+220>>2];H[a+32>>2]=H[g+216>>2];H[a+36>>2]=f;f=H[g+212>>2];H[a+24>>2]=H[g+208>>2];H[a+28>>2]=f;f=H[g+204>>2];H[a+16>>2]=H[g+200>>2];H[a+20>>2]=f;f=H[g+196>>2];H[a+8>>2]=H[g+192>>2];H[a+12>>2]=f;f=H[g+188>>2];H[a>>2]=H[g+184>>2];H[a+4>>2]=f;if(i>>>0<=e+1>>>0){break q}f=d;if(!(e-i&1)){a=c;f=N(d,6)+h|0;l=J[f>>1];r:{if((l|0)!=(b|0)){a=b;if((l|0)!=(j|0)){break r}}G[f>>1]=a}f=d+1|0}if((p|0)==(e&65535)){break q}while(1){a=c;l=N(f,6)+h|0;k=J[l>>1];s:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break s}}G[l>>1]=a}a=c;k=J[l+6>>1];t:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break t}}G[l+6>>1]=a}f=f+2|0;if((i|0)!=(f&65535)){continue}break}}G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1]}d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}e=H[o+116>>2];h=H[e>>2]}if(h){Ca(h);e=H[o+116>>2]}Ca(e);H[o+116>>2]=0;break a}r=0;Ba(m,1,9499,0)}na=g+240|0;return r|0}function Tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0;k=na-48|0;na=k;H[a+8>>2]=1;a:{b:{d=k+40|0;c:{if((Ja(b,d,2,c)|0)!=2){break c}Da(d,k+44|0,2);if(H[k+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[k+16>>2]=e;H[k+20>>2]=d;Ba(c,4,12769,k+16|0);f=H[a+224>>2];j=H[f>>2];e=H[f+24>>2];d=e+1|0;g=H[f+32>>2];if(d>>>0<=g>>>0){g=H[f+28>>2];break b}o=O(O(g>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;g=Ha(H[f+28>>2],N(d,24));if(g){H[f+28>>2]=g;e=H[f+24>>2];d=e+1|0;break b}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;Ba(c,1,3899,0)}Ba(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=j;H[e+12>>2]=j>>31;G[e>>1]=65359;H[f+24>>2]=d;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+40|0,2);d:{e:{g=H[k+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[k>>2]=g;Ba(c,1,2268,k);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}h=2;Ba(c,2,3847,0);e=2472;h:{i:{if((Ja(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Da(H[a+16>>2],k+44|0,2);f=24912;g=H[k+44>>2];if(g>>>0>=65280){while(1){d=f;i=H[d>>2];if(i){f=d+12|0;if((g|0)!=(i|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(i){if((i|0)==65424){H[k+40>>2]=65424;break f}j=H[b+56>>2];f=H[a+224>>2];g=H[f+24>>2];e=g+1|0;d=H[f+32>>2];if(e>>>0<=d>>>0){d=H[f+28>>2];break h}o=O(O(d>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;d=Ha(H[f+28>>2],N(d,24));if(d){H[f+28>>2]=d;g=H[f+24>>2];e=g+1|0;break h}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;e=3899;break i}h=h+2|0}if((Ja(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ba(c,1,e,0);Ba(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=h;g=j-h|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[f+24>>2]=e;H[k+40>>2]=i;g=24912;if((i|0)==65424){break f}while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(i|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ba(c,1,5397,0);a=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+36|0,2);e=H[k+36>>2];if(e>>>0<=1){Ba(c,1,6074,0);a=0;break a}e=e-2|0;H[k+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ha(g,e);if(!g){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[k+36>>2];H[a+20>>2]=e}e=Ja(b,g,e,c);if((e|0)!=H[k+36>>2]){Ba(c,1,2472,0);a=0;break a}if(!(ra[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ba(c,1,2490,0);a=0;break a}j=H[b+56>>2];i=H[k+36>>2];d=H[a+224>>2];g=H[d+24>>2];h=g+1|0;e=H[d+32>>2];j:{if(h>>>0<=e>>>0){e=H[d+28>>2];break j}o=O(O(e>>>0)+O(100));if(o=O(0)){e=~~o>>>0}else{e=0}H[d+32>>2]=e;e=Ha(H[d+28>>2],N(e,24));if(!e){break d}H[d+28>>2]=e;g=H[d+24>>2];h=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=i+4;g=(j-i|0)-4|0;H[e+8>>2]=g;H[e+12>>2]=g>>31;G[e>>1]=f;H[d+24>>2]=h;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}m=(f|0)==65372?1:m;l=(f|0)==65362?1:l;n=(f|0)==65361?1:n;Da(H[a+16>>2],k+40|0,2);g=H[k+40>>2];if((g|0)!=65424){continue}}break}if(n){break e}}Ba(c,1,4785,0);a=0;break a}if(!l){Ba(c,1,4831,0);a=0;break a}if(!m){Ba(c,1,4877,0);a=0;break a}d=0;e=0;h=0;j=na-16|0;na=j;m=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){g=H[a+140>>2]+(h<<3)|0;l=H[g>>2];if(l){i=H[g+4>>2];g=d-i|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){f=i-d|0;l=d+l|0;while(1){if(f>>>0<4){d=5671;break m}Da(l,j+12|0,4);d=H[j+12>>2];if((d^-1)>>>0>>0){d=5645;break m}i=f-4|0;n=i>>>0>>0;g=n?d-i|0:g;e=d+e|0;f=i-d|0;l=((n?0:d)+l|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0>>0){continue}break}if(!d){break l}m=0;Ba(c,1,3067,0);break k}m=0;Ba(c,1,d,0);break k}d=Fa(e);H[a+160>>2]=d;if(!d){m=0;Ba(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];n:{f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){l=g<<3;n=l+h|0;i=H[n>>2];if(i){h=H[a+160>>2]+d|0;f=H[n+4>>2];o:{if(f>>>0<=e>>>0){if(f){B(h,i,f)}d=d+f|0;e=e-f|0;break o}if(e){B(h,i,e)}d=d+e|0;h=f-e|0;e=e+i|0;while(1){if(h>>>0<4){break n}Da(e,j+8|0,4);e=e+4|0;i=H[a+160>>2]+d|0;f=h-4|0;h=H[j+8>>2];if(f>>>0>>0){if(f){B(i,e,f)}d=d+f|0;e=H[j+8>>2]-f|0;break o}if(h){B(i,e,h)}h=H[j+8>>2];d=h+d|0;e=e+h|0;h=f-h|0;if(h){continue}break}e=0}Ca(H[l+H[a+140>>2]>>2]);h=H[a+140>>2];f=l+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Ca(h);H[a+140>>2]=0;break k}m=0;Ba(c,1,5671,0)}na=j+16|0;if(!m){Ba(c,1,8085,0);a=0;break a}Ba(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;h=0;i=na-16|0;na=i;g=H[a+68>>2];p:{if(!g){H[a+76>>2]=1;break p}if(H[a+76>>2]){break p}d=H[a+72>>2];j=H[a+224>>2];e=H[j+40>>2];q:{if((g|0)!=1){m=g&1;l=g&-2;while(1){n=(b<<3)+d|0;p=J[n>>1];f=e+N(p,40)|0;H[f>>2]=p;H[f+8>>2]=H[f+8>>2]+1;n=J[n+8>>1];f=e+N(n,40)|0;H[f>>2]=n;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}if(!m){break q}}f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[j+36>>2];r:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[i>>2]=b;Ba(c,1,9304,i);break r}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[j+8>>2];b=H[j+12>>2];e=0;while(1){s:{l=e<<3;m=H[H[a+224>>2]+40>>2]+N(J[l+d>>1],40)|0;h=H[m+16>>2];if(!h){h=Ea(H[m+8>>2],24);H[m+16>>2]=h;if(!h){break s}g=H[a+68>>2];d=H[a+72>>2]}p=h;h=H[m+4>>2];j=p+N(h,24)|0;H[j>>2]=f;H[j+4>>2]=b;l=H[(d+l|0)+4>>2];f=l+f|0;H[j+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[j+20>>2]=b;H[m+4>>2]=h+1;e=e+1|0;if(g>>>0>e>>>0){continue}break p}break}Ba(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break p}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Ca(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}na=i+16|0;H[a+8>>2]=8;a=1;break a}Ca(H[d+28>>2]);H[d+32>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;Ba(c,1,3899,0);a=0}na=k+48|0;return a|0}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=na-160|0;na=f;a:{if(c>>>0<=35){c=0;Ba(d,1,6095,0);break a}j=H[a+96>>2];c=c-36|0;h=(c>>>0)/3|0;if((N(h,3)|0)!=(c|0)){c=0;Ba(d,1,6095,0);break a}c=f+156|0;Da(b,c,2);G[a+104>>1]=H[f+156>>2];Da(b+2|0,j+8|0,4);Da(b+6|0,j+12|0,4);Da(b+10|0,j,4);Da(b+14|0,j+4|0,4);Da(b+18|0,a+116|0,4);Da(b+22|0,a+120|0,4);Da(b+26|0,a+108|0,4);Da(b+30|0,a+112|0,4);Da(b+34|0,c,2);b:{c:{d:{c=H[f+156>>2];if(c>>>0<=16384){H[j+16>>2]=c;if((c|0)!=(h|0)){H[f+132>>2]=h;H[f+128>>2]=c;Ba(d,1,14980,f+128|0);c=0;break a}c=H[j+4>>2];g=H[j+12>>2];l=H[j+8>>2];e=H[j>>2];if(!(c>>>0>>0&l>>>0>e>>>0)){H[f+120>>2]=g-c;H[f+124>>2]=0-(c>>>0>g>>>0);H[f+112>>2]=l-e;H[f+116>>2]=0-(e>>>0>l>>>0);Ba(d,1,14542,f+112|0);c=0;break a}i=H[a+116>>2];k=H[a+120>>2];if(!(k?i:0)){H[f+4>>2]=k;H[f>>2]=i;Ba(d,1,15094,f);c=0;break a}e:{n=H[a+108>>2];f:{if(n>>>0>e>>>0){break f}i=i+n|0;if(e>>>0>=(i>>>0>>0?-1:i)>>>0){break f}i=H[a+112>>2];if(i>>>0>c>>>0){break f}k=i+k|0;if(c>>>0<(i>>>0>k>>>0?-1:k)>>>0){break e}}c=0;Ba(d,1,2792,0);break a}g:{if(H[a+248>>2]){break g}i=H[a+240>>2];if(!i){break g}k=H[a+244>>2];if(!k){break g}e=l-e|0;c=g-c|0;if((e|0)==(i|0)&(c|0)==(k|0)){break g}H[f+108>>2]=c;H[f+104>>2]=e;H[f+100>>2]=k;H[f+96>>2]=i;Ba(d,1,14006,f+96|0);c=0;break a}e=Ea(h,52);H[j+24>>2]=e;if(!e){break d}h:{if(!H[j+16>>2]){break h}c=f+152|0;Da(b+36|0,c,1);h=H[f+152>>2];k=h>>>7|0;H[e+32>>2]=k;n=(h&127)+1|0;H[e+24>>2]=n;l=H[a+248>>2];Da(b+37|0,c,1);H[e>>2]=H[f+152>>2];Da(b+38|0,c,1);g=H[f+152>>2];H[e+4>>2]=g;c=0;i=H[e>>2];if(i-256>>>0<4294967041){h=0;break b}h=0;if(g-256>>>0<4294967041){break b}g=H[e+24>>2];if(g>>>0>31){break c}H[e+36>>2]=0;H[e+40>>2]=H[a+184>>2];h=1;if(K[j+16>>2]<=1){break h}k=l?0:k;l=l?0:n;b=b+39|0;while(1){Da(b,f+152|0,1);i=H[f+152>>2];g=i>>>7|0;H[e+84>>2]=g;i=(i&127)+1|0;H[e+76>>2]=i;if(!(H[a+248>>2]|(I[a+212|0]&4|(i|0)==(l|0)&(g|0)==(k|0)))){H[f+84>>2]=g;H[f+80>>2]=i;H[f+76>>2]=h;H[f+72>>2]=k;H[f+68>>2]=l;H[f+64>>2]=h;Ba(d,2,14778,f- -64|0)}g=f+152|0;Da(b+1|0,g,1);H[e+52>>2]=H[f+152>>2];Da(b+2|0,g,1);g=H[f+152>>2];H[e+56>>2]=g;i=H[e+52>>2];if(i-256>>>0<4294967041|g-256>>>0<=4294967040){break b}g=H[e+76>>2];if(g>>>0>=32){break c}b=b+3|0;H[e+88>>2]=0;H[e+92>>2]=H[a+184>>2];e=e+52|0;h=h+1|0;if(h>>>0>2]){continue}break}}c=0;h=H[a+116>>2];if(!h){break a}g=H[a+120>>2];if(!g){break a}l=0-!h|0;e=l;p=H[a+108>>2];k=H[j+8>>2]-p|0;i=h-1|0;b=k+i|0;e=k>>>0>b>>>0?e+1|0:e;b=ve(b,e,h,0);H[a+128>>2]=b;n=0-!g|0;e=n;q=H[a+112>>2];o=H[j+12>>2]-q|0;m=o;k=g-1|0;o=o+k|0;e=m>>>0>o>>>0?e+1|0:e;e=ve(o,e,g,0);H[a+132>>2]=e;i:{if(!(!b|!e)){if(b>>>0<=65535/(e>>>0)>>>0){break i}}H[f+20>>2]=e;H[f+16>>2]=b;Ba(d,1,14120,f+16|0);break a}o=N(b,e);j:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(h>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(g>>>0);e=l;b=H[a+36>>2]-p|0;m=b;b=b+i|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,h,0),H[v+36>>2]=w;e=n;b=H[a+40>>2]-q|0;m=b;b=b+k|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,g,0),H[v+40>>2]=w;break j}H[a+40>>2]=e;H[a+36>>2]=b;H[a+28>>2]=0;H[a+32>>2]=0}b=Ea(o,5644);H[a+180>>2]=b;if(!b){Ba(d,1,3935,0);break a}b=Ea(H[j+16>>2],1080);H[H[a+12>>2]+5584>>2]=b;if(!H[H[a+12>>2]+5584>>2]){Ba(d,1,3935,0);break a}b=Ea(10,20);H[H[a+12>>2]+5616>>2]=b;b=H[a+12>>2];if(!H[b+5616>>2]){Ba(d,1,3935,0);break a}H[b+5624>>2]=10;b=Ea(10,20);H[H[a+12>>2]+5628>>2]=b;b=H[a+12>>2];if(!H[b+5628>>2]){Ba(d,1,3935,0);break a}H[b+5636>>2]=10;e=H[j+16>>2];k:{if(!e){break k}h=H[j+24>>2];b=0;if((e|0)!=1){g=e&1;l=e&-2;e=0;while(1){i=h+N(b,52)|0;if(!H[i+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}i=b|1;k=h+N(i,52)|0;if(!H[k+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(i,1080)|0)+1076>>2]=1<>2]-1}b=b+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}if(!g){break k}}e=h+N(b,52)|0;if(H[e+32>>2]){break k}H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}if(o){b=H[a+180>>2];e=0;while(1){h=Ea(H[j+16>>2],1080);H[b+5584>>2]=h;if(!h){Ba(d,1,3935,0);break a}b=b+5644|0;e=e+1|0;if(o>>>0>e>>>0){continue}break}}b=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=b;b=Ea(b,40);d=H[a+224>>2];H[d+40>>2]=b;e=0;l:{if(!b){break l}e=1;if(!H[d+36>>2]){break l}d=0;while(1){m:{e=0;g=N(d,40);b=g+b|0;H[b+20>>2]=0;H[b+28>>2]=100;h=Ea(100,24);l=H[a+224>>2];b=H[l+40>>2];H[(g+b|0)+24>>2]=h;if(!h){break m}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[j+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[j+12>>2];c=c>>>0>>0?c:d;l=c-1|0;k=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[j+8>>2];a=a>>>0>>0?a:d;i=a-1|0;n=0-!a|0;a=H[j+4>>2];b=a>>>0>>0?b:a;o=b-1|0;p=0-!b|0;a=H[j>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[j+24>>2];b=0;while(1){e=p;d=H[a+4>>2];c=d+o|0;j=ve(c,c>>>0>>0?e+1|0:e,d,0);H[a+20>>2]=j;e=u;h=H[a>>2];c=h+q|0;s=ve(c,c>>>0>>0?e+1|0:e,h,0);H[a+16>>2]=s;c=H[a+40>>2];g=c&31;if((c&63)>>>0>=32){e=-1<>>32-g}g=m^-1;e=e^-1;m=e;e=k;t=d+l|0;e=t>>>0>>0?e+1|0:e;e=ve(t,e,d,0)-j|0;d=m;j=e;e=e+g|0;d=j>>>0>e>>>0?d+1|0:d;j=e;e=c&31;if((c&63)>>>0>=32){d=d>>>e|0}else{d=((1<>>e}H[a+12>>2]=d;e=n;d=h+i|0;e=d>>>0>>0?e+1|0:e;d=ve(d,e,h,0)-s|0;e=m;d=d+g|0;e=d>>>0>>0?e+1|0:e;h=d;d=c&31;if((c&63)>>>0>=32){c=e>>>d|0}else{c=((1<>>d}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}c=1;break a}H[f+144>>2]=c;Ba(d,1,7932,f+144|0);c=0;break a}c=0;H[j+16>>2]=0;Ba(d,1,3935,0);break a}H[f+52>>2]=g;H[f+48>>2]=h;Ba(d,1,15402,f+48|0);break a}H[f+40>>2]=g;H[f+36>>2]=i;H[f+32>>2]=h;Ba(d,1,14340,f+32|0)}na=f+160|0;return c|0}function fd(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0,B=0,C=0;n=na-560|0;na=n;H[n+44>>2]=0;x(+b);i=s(1)|0;s(0)|0;a:{if((i|0)<0){r=1;y=1082;b=-b;x(+b);i=s(1)|0;s(0)|0;break a}if(e&2048){r=1;y=1085;break a}r=e&1;y=r?1088:1083;A=!r}b:{if((i&2146435072)==2146435072){d=r+3|0;Na(a,32,c,d,e&-65537);La(a,y,r);f=f&32;La(a,b!=b?f?1207:1435:f?1312:1476,3);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d;break b}v=n+16|0;c:{d:{e:{b=pc(b,n+44|0);b=b+b;if(b!=0){g=H[n+44>>2];H[n+44>>2]=g-1;t=f|32;if((t|0)!=97){break e}break c}t=f|32;if((t|0)==97){break c}m=H[n+44>>2];break d}m=g-29|0;H[n+44>>2]=m;b=b*268435456}k=(d|0)<0?6:d;p=(n+48|0)+((m|0)>=0?288:0)|0;h=p;while(1){d=b<4294967295&b>=0?~~b>>>0:0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((m|0)<=0){i=m;g=h;j=p;break f}j=p;i=m;while(1){z=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}d=0;i=0;while(1){w=H[g>>2];o=z&31;if((z&63)>>>0>=32){l=w<>>32-o;w=w<>>0>o>>>0?i+1|0:i;d=ve(o,l,1e9,0);i=qa;B=g,C=o+re(d,i,-1e9)|0,H[B>>2]=C;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!l&o>>>0<1e9){break g}j=j-4|0;H[j>>2]=d}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[n+44>>2]-z|0;H[n+44>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){u=((k+25>>>0)/9|0)+1|0;l=(t|0)==102;while(1){d=0-i|0;d=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}o=1e9>>>d|0;z=-1<>2];H[h>>2]=w+(i>>>d|0);i=N(o,i&z);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=d+H[n+44>>2]|0;H[n+44>>2]=i;j=h+j|0;d=l?p:j;g=g-d>>2>(u|0)?d+(u<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(k-((t|0)!=102?i:0)|0)-((t|0)==103&(k|0)!=0)|0;if((d|0)<(N(g-p>>2,9)-9|0)){h=(n+48|0)+((m|0)<0?-4092:-3804)|0;d=d+9216|0;m=(d|0)/9|0;l=h+(m<<2)|0;h=10;d=d+N(m,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}m=H[l>>2];u=(m>>>0)/(h>>>0)|0;d=N(u,h);o=l+4|0;j:{if((d|0)==(m|0)&(o|0)==(g|0)){break j}m=m-d|0;k:{if(!(u&1)){b=9007199254740992;if(!(F[l-4|0]&1)|((h|0)!=1e9|j>>>0>=l>>>0)){break k}}b=9007199254740994}q=(g|0)==(o|0)?1:1.5;o=h>>>1|0;q=m>>>0>>0?.5:(o|0)==(m|0)?q:1.5;if(!(I[y|0]!=45|A)){q=-q;b=-b}H[l>>2]=d;if(b+q==b){break j}d=d+h|0;H[l>>2]=d;if(d>>>0>=1e9){while(1){H[l>>2]=0;l=l-4|0;if(l>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[l>>2]+1|0;H[l>>2]=d;if(d>>>0>999999999){continue}break}}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=l+4|0;g=d>>>0>>0?d:g}while(1){h=g;m=g>>>0<=j>>>0;if(!m){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((t|0)!=103){d=e&8;break l}d=k?k:1;g=(d|0)>(i|0)&(i|0)>-5;k=(g?i^-1:-1)+d|0;f=(g?-1:-2)+f|0;d=e&8;if(d){break l}g=-9;m:{if(m){break m}l=H[h-4>>2];if(!l){break m}d=10;g=0;if((l>>>0)%10|0){break m}while(1){m=g;g=g+1|0;d=N(d,10);if(!((l>>>0)%(d>>>0)|0)){continue}break}g=m^-1}m=N(h-p>>2,9);if((f&-33)==70){d=0;g=(g+m|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g;break l}d=0;g=((i+m|0)+g|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g}l=-1;t=d|k;if(((t?2147483645:2147483646)|0)<(k|0)){break b}m=(((t|0)!=0)+k|0)+1|0;o=f&-33;n:{if((o|0)==70){if((m^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}g=i>>31;g=$a((g^i)-g|0,0,v);if((v-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((v-g|0)<2){continue}break}}u=g-2|0;F[u|0]=f;F[g-1|0]=(i|0)<0?45:43;g=v-u|0;if((g|0)>(m^2147483647)){break b}}f=g+m|0;if((f|0)>(r^2147483647)){break b}f=f+r|0;Na(a,32,c,f,e);La(a,y,r);Na(a,48,c,f,e^65536);o:{p:{q:{if((o|0)==70){d=n+16|9;i=j>>>0>p>>>0?p:j;j=i;while(1){g=$a(H[j>>2],0,d);r:{if((i|0)!=(j|0)){if(n+16>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break r}if((d|0)!=(g|0)){break r}g=g-1|0;F[g|0]=48}La(a,g,d-g|0);j=j+4|0;if(p>>>0>=j>>>0){continue}break}if(t){La(a,1684,1)}if((k|0)<=0|h>>>0<=j>>>0){break q}while(1){g=$a(H[j>>2],0,d);if(g>>>0>n+16>>>0){while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}}La(a,g,(k|0)>=9?9:k);g=k-9|0;j=j+4|0;if(h>>>0<=j>>>0){break p}i=(k|0)>9;k=g;if(i){continue}break}break p}s:{if((k|0)<0){break s}p=h>>>0>j>>>0?h:j+4|0;i=n+16|9;h=j;while(1){g=$a(H[h>>2],0,i);if((i|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(n+16>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break t}La(a,g,1);g=g+1|0;if(!(d|k)){break t}La(a,1684,1)}m=g;g=i-g|0;La(a,m,(g|0)<(k|0)?g:k);k=k-g|0;h=h+4|0;if(p>>>0<=h>>>0){break s}if((k|0)>=0){continue}break}}Na(a,48,k+18|0,18,0);La(a,u,v-u|0);break o}g=k}Na(a,48,g+9|0,9,0)}Na(a,32,c,f,e^8192);l=(c|0)>(f|0)?c:f;break b}j=(f<<26>>31&9)+y|0;u:{if(d>>>0>11){break u}g=12-d|0;q=16;while(1){q=q*16;g=g-1|0;if(g){continue}break}if(I[j|0]==45){b=-(q+(-b-q));break u}b=b+q-q}h=H[n+44>>2];g=h>>31;g=$a((g^h)-g|0,0,v);if((v|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[n+44>>2]}k=f&32;i=g-2|0;F[i|0]=f+15;F[g-1|0]=(h|0)<0?45:43;g=!(e&8)&(d|0)<=0;h=n+16|0;while(1){f=h;p=P(b)<2147483647?~~b:-2147483648;F[h|0]=k|I[p+26048|0];b=(b-+(p|0))*16;h=h+1|0;if(!(g&b==0|(h-(n+16|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}l=-1;g=v-i|0;if((2147483643-(g+r|0)|0)<(d|0)){break b}f=h;h=n+16|0;f=f-h|0;k=d?(f-2|0)<(d|0)?d+2|0:f:f;p=r|2;d=k+(p+g|0)|0;Na(a,32,c,d,e);La(a,j,p);Na(a,48,c,d,e^65536);La(a,h,f);Na(a,48,k-f|0,0,0);La(a,i,g);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d}na=n+560|0;return l|0}function sc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=na+-64|0;na=j;H[j+60>>2]=b;z=j+41|0;A=j+39|0;t=j+40|0;a:{b:{c:{d:{e:while(1){h=0;f:while(1){k=b;if((o^2147483647)<(h|0)){break d}o=h+o|0;g:{h:{i:{j:{h=b;i=I[h|0];if(i){while(1){k:{b=i&255;l:{if(!b){b=h;break l}if((b|0)!=37){break k}i=h;while(1){if(I[i+1|0]!=37){b=i;break l}h=h+1|0;n=I[i+2|0];b=i+2|0;i=b;if((n|0)==37){continue}break}}h=h-k|0;y=o^2147483647;if((h|0)>(y|0)){break d}if(a){La(a,k,h)}if(h){continue f}H[j+60>>2]=b;h=b+1|0;q=-1;i=F[b+1|0]-48|0;if(!(I[b+2|0]!=36|i>>>0>9)){w=1;q=i;h=b+3|0}H[j+60>>2]=h;l=0;i=F[h|0];b=i-32|0;m:{if(b>>>0>31){n=h;break m}n=h;b=1<>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;b=0;break p}b=H[(b<<3)+d>>2]}p=b;b=n+3|0;i=1;break o}if(w){break j}b=n+1|0;if(!a){H[j+60>>2]=b;w=0;p=0;break n}h=H[c>>2];H[c>>2]=h+4;p=H[h>>2];i=0}w=i;H[j+60>>2]=b;if((p|0)>=0){break n}p=0-p|0;l=l|8192;break n}p=rc(j+60|0);if((p|0)<0){break d}b=H[j+60>>2]}h=0;m=-1;u=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;m=0;break s}m=H[(i<<3)+d>>2]}break r}if(w){break j}b=b+2|0;m=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;m=H[i>>2]}H[j+60>>2]=b;u=(m|0)>=0;break q}H[j+60>>2]=b+1;m=rc(j+60|0);b=H[j+60>>2];u=1}while(1){x=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25519|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((q|0)>=0){if(!a){H[(q<<2)+e>>2]=h;continue e}h=(q<<3)+d|0;i=H[h+4>>2];H[j+48>>2]=H[h>>2];H[j+52>>2]=i;break t}if(!a){break g}qc(j+48|0,h,c,g);break t}if((q|0)>=0){break c}h=0;if(!a){continue f}}if(I[a|0]&32){break b}i=l&-65537;l=l&8192?i:l;q=0;v=1072;n=t;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];h=r<<24>>24;h=x?(r&15)==3?h&-45:h:h;switch(h-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(h-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((h|0)==83){break y}break h}i=H[j+48>>2];r=H[j+52>>2];v=1072;break D}h=0;M:{switch(x|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f}m=m>>>0<=8?8:m;l=l|8;h=120}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){x=h&32;while(1){b=b-1|0;F[b|0]=x|I[(s&15)+26048|0];s=(k&15)<<28|s>>>4;k=k>>>4|0;if(s|k){continue}break}}k=b;if(!(l&8)|!(i|r)){break C}v=(h>>>4|0)+1072|0;q=2;break C}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){while(1){b=b-1|0;F[b|0]=s&7|48;s=(k&7)<<29|s>>>3;k=k>>>3|0;if(s|k){continue}break}}k=b;if(!(l&8)){break C}b=z-b|0;m=(b|0)<(m|0)?m:b;break C}i=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){h=0-(b+((i|0)!=0)|0)|0;r=h;i=0-i|0;H[j+48>>2]=i;H[j+52>>2]=h;q=1;v=1072;break D}if(l&2048){q=1;v=1073;break D}q=l&1;v=q?1074:1072}k=$a(i,r,t)}if((m|0)<0&u){break d}l=u?l&-65537:l;if(!((i|r)!=0|m)){k=t;m=0;break h}b=!(i|r)+(t-k|0)|0;m=(b|0)<(m|0)?m:b;break h}h=I[j+48|0];break i}h=m>>>0>=2147483647?2147483647:m;l=h;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}l=l-1|0;n=(l|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(l){continue}break}}if(!n){break O}if(!(!I[b|0]|l>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;l=l-4|0;if(l>>>0>3){continue}break}}if(!l){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;l=l-1|0;if(l){continue}break}}b=0}b=b?b-k|0:h;n=b+k|0;if((m|0)>=0){l=i;m=b;break h}l=i;m=b;if(I[n|0]){break d}break h}h=H[j+48>>2];if(h|H[j+52>>2]){break x}h=0;break i}if(m){i=H[j+48>>2];break w}h=0;Na(a,32,p,0,l);break v}H[j+12>>2]=0;H[j+8>>2]=h;i=j+8|0;H[j+48>>2]=i;m=-1}h=0;while(1){R:{k=H[i>>2];if(!k){break R}k=oc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>m-h>>>0){break R}i=i+4|0;h=h+k|0;if(m>>>0>h>>>0){continue}}break}n=61;if((h|0)<0){break c}Na(a,32,p,h,l);if(!h){h=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=oc(m,k);n=k+n|0;if(n>>>0>h>>>0){break v}La(a,m,k);i=i+4|0;if(h>>>0>n>>>0){continue}break}}Na(a,32,p,h,l^8192);h=(h|0)<(p|0)?p:h;continue f}if((m|0)<0&u){break d}n=61;h=ra[f|0](a,M[j+48>>3],p,m,l,h)|0;if((h|0)>=0){continue f}break c}i=I[h+1|0];h=h+1|0;continue}}if(a){break a}if(!w){break g}h=1;while(1){a=H[(h<<2)+e>>2];if(a){qc((h<<3)+d|0,a,c,g);o=1;h=h+1|0;if((h|0)!=10){continue}break a}break}if(h>>>0>=10){o=1;break a}while(1){if(H[(h<<2)+e>>2]){break j}o=1;h=h+1|0;if((h|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=h;m=1;k=A;l=i}i=n-k|0;m=(i|0)<(m|0)?m:i;if((m|0)>(q^2147483647)){break d}n=61;b=m+q|0;h=(b|0)<(p|0)?p:b;if(y>>>0>>0){break c}Na(a,32,h,b,l);La(a,v,q);Na(a,48,h,b,l^65536);Na(a,48,m,i,0);La(a,k,i);Na(a,32,h,b,l^8192);b=H[j+60>>2];continue}break}break}o=0;break a}n=61}H[6597]=n}o=-1}na=j- -64|0;return o}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=na-80|0;na=i;H[i+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}j=H[a+100>>2];if(H[j>>2]|H[j+4>>2]|(H[j+8>>2]!=H[a+116>>2]|H[j+12>>2]!=H[a+120>>2])){break b}if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}c:{d:{if(!H[i+76>>2]){break d}if(!ib(a,H[i+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}d=1;break a}Ba(c,1,8776,0);break a}e=H[b+24>>2];while(1){b=N(g,52);Ca(H[(b+e|0)+44>>2]);c=H[a+100>>2];e=H[c+24>>2];j=b+e|0;m=H[a+232>>2];d=H[H[H[m+20>>2]>>2]+20>>2]+N(g,76)|0;H[j+44>>2]=H[d+36>>2];H[j+36>>2]=H[(b+H[H[m+24>>2]+24>>2]|0)+36>>2];H[d+36>>2]=0;d=1;g=g+1|0;if(g>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){j=2;if(H[a+40>>2]==H[a+132>>2]){break e}}j=2;if(H[a+76>>2]){break e}if(!Ab(b)){break e}q=H[a+128>>2];j=N(q,H[a+132>>2]);if(j){h=H[H[a+224>>2]+40>>2];f:{g:{if((j|0)==1){j=0;break g}k=j&1;n=j&-2;j=0;while(1){d=h+N(g,40)|0;f=H[d+4>>2];if(f){l=(H[d+16>>2]+N(f,24)|0)-8|0;f=H[l>>2];o=f;p=f>>>0>j>>>0;f=H[l+4>>2];l=p&(f|0)>=(m|0)|(f|0)>(m|0);j=l?o:j;m=l?f:m}f=H[d+44>>2];if(f){f=(H[d+56>>2]+N(f,24)|0)-8|0;d=H[f>>2];o=d;l=d>>>0>j>>>0;d=H[f+4>>2];f=l&(d|0)>=(m|0)|(d|0)>(m|0);j=f?o:j;m=f?d:m}g=g+2|0;e=e+2|0;if((n|0)!=(e|0)){continue}break}if(!k){break f}}d=h+N(g,40)|0;h=H[d+4>>2];if(!h){break f}h=(H[d+16>>2]+N(h,24)|0)-8|0;d=H[h>>2];f=d;k=d>>>0>j>>>0;d=H[h+4>>2];h=k&(d|0)>=(m|0)|(d|0)>(m|0);j=h?f:j;m=h?d:m}j=j+2|0;m=j>>>0<2?m+1|0:m}else{j=2;m=0}g=0;k=H[a+32>>2];p=H[a+40>>2];h:{if(k>>>0>=p>>>0){break h}h=H[a+28>>2];f=H[a+36>>2];if(h>>>0>=f>>>0){break h}n=f-h&3;s=H[H[a+224>>2]+40>>2];t=h-f>>>0>4294967292;while(1){l=s+N(N(k,q),40)|0;d=h;e=0;if(n){while(1){g=H[(l+N(d,40)|0)+4>>2]+g|0;d=d+1|0;e=e+1|0;if((n|0)!=(e|0)){continue}break}}if(!t){while(1){e=l+N(d,40)|0;g=H[e+124>>2]+(H[e+84>>2]+(H[e+44>>2]+(H[e+4>>2]+g|0)|0)|0)|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}k=k+1|0;if((p|0)!=(k|0)){continue}break}}f=Fa(g<<3);H[a+88>>2]=f;if(!g|!f){break e}g=0;d=H[a+40>>2];n=H[a+32>>2];i:{if(d>>>0<=n>>>0){break i}e=H[a+36>>2];if(e>>>0<=K[a+28>>2]){break i}while(1){f=H[a+28>>2];if(e>>>0>f>>>0){s=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],n),40)|0;while(1){h=s+N(f,40)|0;d=H[h+4>>2];if(d){q=d&3;p=H[h+16>>2];h=0;j:{k:{if(d>>>0<4){d=0;break k}t=d&-4;d=0;k=0;while(1){e=p+N(d,24)|0;r=H[e+4>>2];l=g<<3;o=l+H[a+88>>2]|0;H[o>>2]=H[e>>2];H[o+4>>2]=r;r=H[e+28>>2];o=l+H[a+88>>2]|0;H[o+8>>2]=H[e+24>>2];H[o+12>>2]=r;r=H[e+52>>2];o=l+H[a+88>>2]|0;H[o+16>>2]=H[e+48>>2];H[o+20>>2]=r;o=H[e+76>>2];l=l+H[a+88>>2]|0;H[l+24>>2]=H[e+72>>2];H[l+28>>2]=o;d=d+4|0;g=g+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!q){break j}}while(1){k=p+N(d,24)|0;l=H[k+4>>2];e=H[a+88>>2]+(g<<3)|0;H[e>>2]=H[k>>2];H[e+4>>2]=l;d=d+1|0;g=g+1|0;h=h+1|0;if((q|0)!=(h|0)){continue}break}}e=H[a+36>>2]}f=f+1|0;if(e>>>0>f>>>0){continue}break}d=H[a+40>>2]}n=n+1|0;if(n>>>0>>0){continue}break}f=H[a+88>>2]}H[a+84>>2]=g;e=na-208|0;na=e;H[e+8>>2]=1;H[e+12>>2]=0;h=g<<3;l:{if(!h){break l}H[e+16>>2]=8;H[e+20>>2]=8;d=2;while(1){g=(e+16|0)+(d<<2)|0;k=H[g-4>>2]+(H[g-8>>2]+8|0)|0;H[g>>2]=k;d=d+1|0;if(h>>>0>k>>>0){continue}break}d=h-8|0;m:{if((d|0)<=0){g=0;h=1;d=1;k=0;break m}g=d+f|0;h=1;d=1;while(1){n:{if((h&3)==3){Bb(f,d,e+16|0);ub(e+8|0,2);d=d+2|0;break n}n=e+16|0;k=d-1|0;o:{if(K[n+(k<<2)>>2]>=g-f>>>0){tb(f,h,H[e+12>>2],d,0,n);break o}Bb(f,d,e+16|0)}if((d|0)==1){sb(e+8|0,1);d=0;break n}sb(e+8|0,k);d=1}h=H[e+8>>2]|1;H[e+8>>2]=h;f=f+8|0;if(g>>>0>f>>>0){continue}break}g=H[e+12>>2];k=(g|0)!=0}tb(f,h,g,d,0,e+16|0);h=H[e+8>>2];if(!(k|((d|0)!=1|(h|0)!=1))){break l}while(1){p:{if((d|0)<=1){h=wc(h,g);ub(e+8|0,h);d=d+h|0;break p}g=e+8|0;sb(g,2);H[e+8>>2]=H[e+8>>2]^7;ub(g,1);n=f-8|0;k=e+16|0;h=d-2|0;tb(n-H[k+(h<<2)>>2]|0,H[e+8>>2],H[e+12>>2],d-1|0,1,k);sb(g,1);d=H[e+8>>2]|1;H[e+8>>2]=d;tb(n,d,H[e+12>>2],h,1,k);d=h}f=f-8|0;g=H[e+12>>2];h=H[e+8>>2];if(g|((d|0)!=1|(h|0)!=1)){continue}break}}na=e+208|0}d=H[a+128>>2];e=0;q:{while(1){r:{if(!(!H[H[a+180>>2]+5596>>2]|((d|0)!=1|H[a+132>>2]!=1))){H[i+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break r}d=0;if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}if(!H[i+76>>2]){break q}d=H[i+72>>2]}h=d+1|0;f=ib(a,d,0,0,b,c);g=N(H[a+128>>2],H[a+132>>2]);if(!f){H[i+4>>2]=g;H[i>>2]=h;Ba(c,1,7537,i);d=0;break a}H[i+36>>2]=g;H[i+32>>2]=h;Ba(c,4,11795,i+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){d=0;break a}s:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){g=H[a+100>>2];f=H[a+96>>2];if(H[g>>2]!=H[f>>2]|H[g+4>>2]!=H[f+4>>2]|(H[g+8>>2]!=H[f+8>>2]|H[g+12>>2]!=H[f+12>>2])){break s}}d=H[a+180>>2]+N(d,5644)|0;g=H[d+5596>>2];if(!g){break s}Ca(g);H[d+5596>>2]=0;H[d+5600>>2]=0}H[i+16>>2]=h;Ba(c,4,16601,i+16|0);if(!(Qa(b)|qa)&H[a+8>>2]==64){break q}e=e+1|0;d=H[a+128>>2];if((e|0)==(N(d,H[a+132>>2])|0)){break q}h=H[a+84>>2];if(!h|(h|0)!=H[a+80>>2]){continue}break}nc(b,j,m,c)}d=Gc(a,c)}na=i+80|0;return d|0}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}d=0;f:{g:{if((b|0)==2){e=-1;i=b;break g}f=b-1|0;k=f&1;j=f&-2;e=-1;i=b;while(1){f=c;H[a>>2]=c+1;l=I[c|0];c=c+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break k}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];l:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break l}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];m:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break m}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];n:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break n}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];o:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break o}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function Ub(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=na-32|0;na=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(Qb(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ba(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;fc(H[b+32>>2]);fc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}q=o&7;b=H[b+24>>2];if(o>>>0>=8){o=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((o|0)!=(j|0)){continue}break}if(!q){break b}}j=0;while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ba(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ba(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Fa(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Ra(l,1)){hc(l);a=ic(l);db(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ba(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(Qb(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=dc(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Ra(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!dc(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Ra(l,1)){break h}a=2;if(!Ra(l,1)){break h}a=Ra(l,2);if((a|0)!=3){a=a+3|0;break h}a=Ra(l,5);if((a|0)!=31){a=a+6|0;break h}a=Ra(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Ra(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ha(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];kb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ha(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;kb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ba(i,1,15535,p+16|0);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ba(i,1,15535,p);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}db(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!hc(l)){db(l);break a}a=ic(l);db(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ba(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}na=p+32|0;return x}function Gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}f=H[a+96>>2];if(!f|!H[f+16>>2]|(e|0)!=H[H[f+24>>2]+40>>2]){break b}f=H[c+16>>2];if(!f){break b}n=H[c+24>>2];if(H[n+40>>2]|H[n+44>>2]){break b}i=f&7;c:{if(f>>>0>=8){p=f&-8;while(1){f=N(h,52)+n|0;H[f+404>>2]=e;H[f+352>>2]=e;H[f+300>>2]=e;H[f+248>>2]=e;H[f+196>>2]=e;H[f+144>>2]=e;H[f+92>>2]=e;H[f+40>>2]=e;h=h+8|0;g=g+8|0;if((g|0)!=(p|0)){continue}break}if(!i){break c}}while(1){H[(N(h,52)+n|0)+40>>2]=e;h=h+1|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}e=0;p=0;n=na-32|0;na=n;v=H[c+16>>2];d:{if(!v){e=1;break d}h=H[c>>2];f=h>>31;q=f;e:{if((f|0)<0){break e}i=H[c+4>>2];f=i>>31;m=f;if((f|0)<0){break e}g=H[c+8>>2];f=g>>31;s=f;if((f|0)<0){break e}j=H[c+12>>2];r=j>>31;if((r|0)<0){break e}f=H[c+24>>2];y=h-1|0;w=q-!h|0;z=i-1|0;x=m-!i|0;A=g-1|0;B=s-!g|0;C=j-1|0;D=r-!j|0;while(1){e=H[f>>2];h=e+y|0;i=e>>>0>h>>>0?w+1|0:w;j=ve(h,i,e,0);H[f+16>>2]=j;i=H[f+4>>2];h=i+z|0;g=i>>>0>h>>>0?x+1|0:x;r=ve(h,g,i,0);H[f+20>>2]=r;h=H[f+40>>2];g=h&31;if((h&63)>>>0>=32){q=1<>>32-g}s=m-1|0;g=q-!m|0;u=g;t=e>>31;l=t+B|0;o=l+1|0;g=l;l=e+A|0;g=ue(l,l>>>0>>0?o:g,e,t);e=u+(g>>31)|0;o=e+1|0;l=e;e=g+s|0;t=g>>>0>e>>>0?o:l;g=h&31;l=(j>>31)+u|0;E=l+1|0;o=l;l=j+s|0;j=j>>>0>l>>>0?E:o;if((h&63)>>>0>=32){g=t>>g}else{g=((1<>>g}e=h&31;if((h&63)>>>0>=32){e=j>>e}else{e=((1<>>e}e=g-e|0;if((e|0)<0){H[n+4>>2]=e;H[n>>2]=p;Ba(d,1,13510,n);e=0;break d}H[f+8>>2]=e;e=i>>31;g=e+D|0;o=g+1|0;l=g;g=i+C|0;j=g>>>0>>0?o:l;i=ue(g,j,i,e);e=(i>>31)+u|0;g=e+1|0;l=e;e=i+s|0;g=i>>>0>e>>>0?g:l;i=h&31;j=q+(r>>31)|0;o=j+1|0;l=j;j=m+r|0;q=j>>>0>>0?o:l;m=j-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<>>i}i=q-!j|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<>>e}e=l-m|0;if((e|0)<0){H[n+20>>2]=e;H[n+16>>2]=p;Ba(d,1,13579,n+16|0);e=0;break d}H[f+12>>2]=e;f=f+52|0;e=1;p=p+1|0;if((v|0)!=(p|0)){continue}break}break d}Ba(d,1,6720,0)}na=n+32|0;if(e){break b}return 0}e=H[a+100>>2];if(!e){e=Eb();H[a+100>>2]=e;if(!e){break a}}Ec(c,e);if(!Wa(H[a+216>>2],22,d)){break a}h=H[a+216>>2];f=H[h>>2];e=H[h+8>>2];f:{if(f){k=1;g:{if((f|0)!=1){n=f&1;i=f&-2;f=0;while(1){m=0;h:{if(!k){break h}m=0;if(!(ra[H[e>>2]](a,b,d)|0)){break h}m=(ra[H[e+4>>2]](a,b,d)|0)!=0}k=m;e=e+8|0;f=f+2|0;if((i|0)!=(f|0)){continue}break}if(!n){break g}}if(!k){k=0;break g}k=(ra[H[e>>2]](a,b,d)|0)!=0}Pa(h);if(k){break f}Ua(H[a+96>>2]);H[a+96>>2]=0;return 0}Pa(h)}f=0;b=0;d=0;i:{j:{k:{e=H[a+60>>2];if(!e){if(H[c+16>>2]){break k}k=1;break i}h=Fa(N(e,52));if(!h){break j}e=0;if(H[c+16>>2]){b=H[c+24>>2];while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[c+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;e=H[c+16>>2];if(d>>>0>>0){continue}break}}if(H[a+60>>2]){d=H[H[a+100>>2]+24>>2];e=0;while(1){b=h+N(e,52)|0;f=N(H[H[a+64>>2]+(e<<2)>>2],52);d=f+d|0;H[b+48>>2]=H[d+48>>2];k=H[d+44>>2];H[b+40>>2]=H[d+40>>2];H[b+44>>2]=k;k=H[d+36>>2];H[b+32>>2]=H[d+32>>2];H[b+36>>2]=k;k=H[d+28>>2];H[b+24>>2]=H[d+24>>2];H[b+28>>2]=k;k=H[d+20>>2];H[b+16>>2]=H[d+16>>2];H[b+20>>2]=k;k=H[d+12>>2];H[b+8>>2]=H[d+8>>2];H[b+12>>2]=k;k=H[d+4>>2];H[b>>2]=H[d>>2];H[b+4>>2]=k;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[b+36>>2]=H[f+36>>2];H[b+44>>2]=H[f+44>>2];H[f+44>>2]=0;e=e+1|0;f=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[c+16>>2]}if(e){b=H[H[a+100>>2]+24>>2];d=0;while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[H[a+100>>2]+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}f=H[a+60>>2]}H[c+16>>2]=f;Ca(H[c+24>>2]);H[c+24>>2]=h;k=1;break i}e=H[c+24>>2];d=H[H[a+100>>2]+24>>2];while(1){f=N(b,52);e=f+e|0;H[e+36>>2]=H[(d+f|0)+36>>2];Ca(H[e+44>>2]);e=H[c+24>>2];m=f+e|0;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[m+44>>2]=H[f+44>>2];H[f+44>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}k=1;break i}Ua(H[a+96>>2]);H[a+96>>2]=0;k=0}}return k|0}function zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;i=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];h=H[a+20>>2];m=H[a+8>>2];a:{b:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=h>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(h-e&1){j=i+(e<<6)|0;e=(e<<2)+b|0;L[j>>2]=L[e>>2];L[j+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(h|0)){break a}while(1){f=i+(e<<6)|0;j=(e<<2)+b|0;L[f>>2]=L[j>>2];g=f;f=c<<2;L[g+4>>2]=L[f+j>>2];j=e+1|0;g=i+(j<<6)|0;j=(j<<2)+b|0;L[g>>2]=L[j>>2];L[g+4>>2]=L[f+j>>2];e=e+2|0;if((h|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;g=h-e&3;if(g){j=0;while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;j=j+1|0;if((g|0)!=(j|0)){continue}break}}if(e-h>>>0>4294967292){break a}while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((h|0)!=(f|0)){continue}break}break a}if(e>>>0>=h>>>0){break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];g=c+g<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+(c<<2)>>2];e=e+1|0;if((h|0)!=(e|0)){continue}break}break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];d:{if((d|0)==3){break d}g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];if((d|0)==4){break d}g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];if((d|0)==5){break d}g=c+g|0;L[f+20>>2]=L[(g<<2)+b>>2];if((d|0)==6){break d}g=j+(g<<2)|0;L[f+24>>2]=L[g>>2];if((d|0)==7){break d}L[f+28>>2]=L[g+(c<<2)>>2]}e=e+1|0;if((h|0)!=(e|0)){continue}break}}b=(m<<2)+b|0;f=b+(c<<2)|0;e=H[a+24>>2];i=l+32|0;e:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=i+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=i+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=i+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:c=e;a=k-e&3;if(a){f=0;while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];c=c+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];a=c+1|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+2|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+3|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];c=c+4|0;if((k|0)!=(c|0)){continue}break};break e;default:break f}}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];h=c+e|0;L[a+4>>2]=L[b+(h<<2)>>2];h=c+h|0;L[a+8>>2]=L[b+(h<<2)>>2];g:{if((d|0)==3){break g}h=c+h|0;L[a+12>>2]=L[b+(h<<2)>>2];if((d|0)==4){break g}h=c+h|0;L[a+16>>2]=L[b+(h<<2)>>2];if((d|0)==5){break g}h=c+h|0;L[a+20>>2]=L[b+(h<<2)>>2];if((d|0)==6){break g}h=f+(h<<2)|0;L[a+24>>2]=L[h>>2];if((d|0)==7){break g}L[a+28>>2]=L[h+(c<<2)>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];d=c+e|0;L[a+4>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+8>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+12>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+16>>2]=L[b+(d<<2)>>2];d=c+d<<2;L[a+20>>2]=L[d+b>>2];d=d+f|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+(c<<2)>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-176|0;na=f;a:{if(b&384){Ac(5943,11,c);break a}b:{if(!(b&1)){break b}g=H[a+96>>2];if(!g){break b}d=na-80|0;na=d;Ac(1792,13,c);F[d+79|0]=0;F[d+78|0]=9;e=H[g+4>>2];H[d+68>>2]=H[g>>2];H[d+72>>2]=e;e=d+78|0;H[d+64>>2]=e;Ga(c,7520,d- -64|0);i=H[g+12>>2];H[d+52>>2]=H[g+8>>2];H[d+56>>2]=i;H[d+48>>2]=e;Ga(c,7503,d+48|0);H[d+36>>2]=H[g+16>>2];H[d+32>>2]=e;Ga(c,7277,d+32|0);if(!(!H[g+24>>2]|!H[g+16>>2])){while(1){l=d+78|0;H[d+16>>2]=l;H[d+20>>2]=j;Ga(c,1824,d+16|0);i=H[g+24>>2];e=na-48|0;na=e;F[e+46|0]=9;F[e+47|0]=0;F[e+45|0]=9;i=N(j,52)+i|0;k=H[i+4>>2];H[e+36>>2]=H[i>>2];H[e+40>>2]=k;k=e+45|0;H[e+32>>2]=k;Ga(c,7209,e+32|0);H[e+20>>2]=H[i+24>>2];H[e+16>>2]=k;Ga(c,7455,e+16|0);H[e+4>>2]=H[i+32>>2];H[e>>2]=k;Ga(c,7428,e);na=e+48|0;H[d>>2]=l;Ga(c,1702,d);j=j+1|0;if(j>>>0>2]){continue}break}}Ac(1710,2,c);na=d+80|0}if(!(!(b&2)|!H[a+96>>2])){Ac(1931,36,c);d=H[a+112>>2];H[f+160>>2]=H[a+108>>2];H[f+164>>2]=d;Ga(c,2425,f+160|0);d=H[a+120>>2];H[f+144>>2]=H[a+116>>2];H[f+148>>2]=d;Ga(c,2391,f+144|0);d=H[a+132>>2];H[f+128>>2]=H[a+128>>2];H[f+132>>2]=d;Ga(c,2409,f+128|0);Hb(H[a+12>>2],H[H[a+96>>2]+16>>2],c);Ac(1710,2,c)}c:{if(!(b&8)|!H[a+96>>2]){break c}e=N(H[a+128>>2],H[a+132>>2]);if(!e){break c}d=H[a+180>>2];while(1){Hb(d,H[H[a+96>>2]+16>>2],c);d=d+5644|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}if(!(b&16)){break a}a=H[a+224>>2];Ac(1893,37,c);b=H[a>>2];d=H[a+4>>2];e=H[a+12>>2];H[f+120>>2]=H[a+8>>2];H[f+124>>2]=e;H[f+112>>2]=b;H[f+116>>2]=d;Ga(c,5730,f+112|0);Ac(1875,17,c);if(!(!H[a+28>>2]|!H[a+24>>2])){d=0;while(1){b=H[a+28>>2]+N(d,24)|0;e=J[b>>1];h=H[b+8>>2];g=H[b+12>>2];H[f+96>>2]=H[b+16>>2];H[f+88>>2]=h;H[f+92>>2]=g;H[f+80>>2]=e;Ga(c,7397,f+80|0);d=d+1|0;if(d>>>0>2]){continue}break}}Ac(1708,4,c);e=H[a+40>>2];d:{if(!e){break d}g=H[a+36>>2];if(!g){break d}h=0;d=0;while(1){b=e+N(d,40)|0;j=H[b+4>>2];e:{if(!j){break e}b=H[b+16>>2];if(!b){break e}i=H[b>>2];k=H[b+4>>2];if((k|0)<0){i=1}else{i=!i&(k|0)<=0}if(i|(H[b+8>>2]|H[b+12>>2])){break e}if(xc(1439)){break d}}h=h+j|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}if(!h){break d}Ac(1858,16,c);if(H[a+36>>2]){h=H[a+40>>2];g=0;while(1){b=N(g,40);j=H[(b+h|0)+4>>2];H[f+68>>2]=j;H[f+64>>2]=g;Ga(c,7467,f- -64|0);h=H[a+40>>2];f:{if(!j){break f}d=0;if(!H[(b+h|0)+16>>2]){break f}while(1){e=H[(b+H[a+40>>2]|0)+16>>2]+N(d,24)|0;h=H[e>>2];i=H[e+4>>2];k=H[e+8>>2];l=H[e+12>>2];m=H[e+20>>2];H[f+56>>2]=H[e+16>>2];H[f+60>>2]=m;H[f+48>>2]=k;H[f+52>>2]=l;H[f+40>>2]=h;H[f+44>>2]=i;H[f+32>>2]=d;Ga(c,10938,f+32|0);d=d+1|0;if((j|0)!=(d|0)){continue}break}h=H[a+40>>2]}e=b+h|0;g:{if(!H[e+24>>2]){break g}d=0;if(!H[e+20>>2]){break g}while(1){e=H[(b+h|0)+24>>2]+N(d,24)|0;h=J[e>>1];j=H[e+8>>2];i=H[e+12>>2];H[f+16>>2]=H[e+16>>2];H[f+8>>2]=j;H[f+12>>2]=i;H[f>>2]=h;Ga(c,7397,f);d=d+1|0;h=H[a+40>>2];if(d>>>0>2]){continue}break}}g=g+1|0;if(g>>>0>2]){continue}break}}Ac(1708,4,c)}Ac(1710,2,c)}na=f+176|0}function oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-128|0;na=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ba(d,1,4047,0);Ba(d,1,4047,0);break a}Da(b,a+228|0,2);Da(b+2|0,e+124|0,4);Da(b+6|0,e+116|0,1);Da(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ba(d,1,7843,e+112|0);break a}f=H[a+180>>2]+N(c,5644)|0;h=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{g=H[a+44>>2];if((g|0)>=0&(c|0)!=(g|0)){break b}g=H[f+5588>>2]+1|0;if((g|0)==(b|0)){break b}H[e+104>>2]=g;H[e+100>>2]=b;H[e+96>>2]=c;Ba(d,1,7867,e+96|0);f=0;break a}H[f+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ba(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ba(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{b=H[f+5592>>2];if(b){g=H[e+116>>2];if(g>>>0>>0){break g}H[e+52>>2]=b;H[e+48>>2]=g;Ba(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}g=H[e+120>>2];if(g){break f}break d}g=H[e+120>>2];if(!g){break e}}b=(I[a+92|0]>>>4&1)+g|0;H[e+120>>2]=b;g=H[e+116>>2];j=H[f+5592>>2];if(g>>>0>j-1>>>0){H[e+20>>2]=j;H[e+16>>2]=g;Ba(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0<=g>>>0){H[e+36>>2]=b;H[e+32>>2]=g;Ba(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[f+5592>>2]=b}if((H[e+116>>2]+1|0)!=(b|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(h,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|h>>>0>2])){f=h>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ba(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;if(f){H[h+4>>2]=f;b=H[e+120>>2];H[h+8>>2]=b;c=H[h+16>>2];if(!c){b=Ea(b,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ba(d,1,6947,0);break a}b=Ha(c,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{g=H[h+16>>2];if(g){break i}H[h+8>>2]=10;g=Ea(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;H[h+16>>2]=g;if(g){break i}f=0;H[h+8>>2]=0;Ba(d,1,6947,0);break a}f=1;b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){break a}h=b;b=c+1|0;H[h+8>>2]=b;b=Ha(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ba(d,1,12133,e+80|0);f=0}na=e+128|0;return f|0}function nb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=H[a+8>>2];e=f+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=f+1|0;g=H[a>>2];o=g+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=g+(a<<2)|0;v=N(c,f)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){f=H[b+v>>2];e=H[b>>2]-(f+1>>1)|0;h=0;a=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];i=H[(N(a+s|0,c)<<2)+b>>2];p=g+(h<<2)|0;H[p>>2]=e;k=e;e=x-((f+i|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);f=i;a=j;if(k){continue}break}}H[g+(h<<2)>>2]=e;if(r){a=H[b+w>>2]-(f+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+f;f=0;a=0;h=0;e=0;b:{if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break b}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}c:{switch(e-1|0){case 0:if((d|0)<=0){break a}a=d&3;if(d>>>0>=4){d=d&2147483644;c=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}if(!a){break a}}c=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;c=c+1|0;if((a|0)!=(c|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;f=N(c,f)<<2;while(1){i=b+f|0;j=H[b>>2]-(H[i>>2]+1>>1)|0;H[a+4>>2]=j;i=j+H[i>>2]|0;H[a>>2]=i;H[b>>2]=i;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break c}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;g=H[a>>2];r=(g+(e<<2)|0)-4|0;a=e-2|0;s=g+(a<<2)|0;o=e&1;i=!o;t=((e-i|0)-4>>>1|0)+1|0;u=N(c,f)<<2;v=a-i>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;f=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((f+a|0)+2>>2)|0;H[g>>2]=e+a;h=1;a=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;i=H[l+(N(j,c)<<2)>>2];y=g+(h<<2)|0;H[y>>2]=e;k=e;e=p-((f+i|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);a=j;f=i;if(k){continue}break}}H[g+(h<<2)>>2]=e;d:{if(!o){a=H[b+w>>2]-(f+1>>1)|0;H[s>>2]=(e+a>>1)+f;break d}a=e+f|0}H[r>>2]=a;f=0;a=0;h=0;e=0;e:{if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break e}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Xb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Kd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=na-112|0;na=e;j=1024;a:{b:{h=Ea(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+88|0,4);Da(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Qa(b);g=qa;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ba(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+100|0,4);if(!H[e+100>>2]){break g}Ba(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Da(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ba(c,1,5702,0);Ca(h);a=0;break a}i=H[e+88>>2];if(!i){Ba(c,1,3268,0);Ca(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ba(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25296;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25264;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25240;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25248;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ba(c,1,2062,0);Ca(h);a=0;break a}g=25280;break n}g=25288;break n}g=25304;break n}g=25272}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ba(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ba(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=rb(b,f,c);if(!qa&(d|0)==(f|0)){continue}Ba(c,1,3748,0);Ca(h);a=0;break a}g=25232}f=i-f|0}d=f;f=Qa(b);i=qa;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Qa(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ba(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ha(h,d);if(f){break c}Ca(h);Ba(c,1,2193,0);a=0;break a}if(!(d&2)){Ba(c,1,2132,0);Ca(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=rb(b,d,c);if(!qa&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ba(c,2,3748,0)}Ca(h);a=1;break a}Ba(c,1,3748,0);Ca(h);a=0;break a}if((Ja(b,f,d,c)|0)!=(d|0)){Ba(c,1,3798,0);Ca(f);a=0;break a}h=f;if(ra[H[g+4>>2]](a,f,d,c)|0){continue}break}Ca(f);a=0;break a}Ba(c,1,4923,0);a=0;break a}Ca(h);a=0}na=e+112|0;return a|0}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=na-16|0;na=f;if(H[a+8>>2]==16){i=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{i=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4721,0);a=0;break a}Da(b,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ba(d,1,4721,0);a=0;break a}Da(b+2|0,f+8|0,1);e=H[i+5628>>2];h=H[i+5632>>2];b:{c:{if(!h){break c}j=H[f+8>>2];a=e;while(1){if((j|0)!=H[a>>2]){a=a+20|0;g=g+1|0;if((h|0)!=(g|0)){continue}break c}break}j=0;if((g|0)!=(h|0)){break b}}if(H[i+5636>>2]==(h|0)){a=h+10|0;H[i+5636>>2]=a;a=Ha(e,N(a,20));if(!a){Ca(H[i+5628>>2]);H[i+5636>>2]=0;H[i+5628>>2]=0;H[i+5632>>2]=0;Ba(d,1,4747,0);a=0;break a}H[i+5628>>2]=a;e=H[i+5632>>2];j=N(H[i+5636>>2]-e|0,20);if(j){y(a+N(e,20)|0,0,j)}h=H[i+5632>>2];e=H[i+5628>>2]}a=e+N(h,20)|0;j=1}H[a>>2]=H[f+8>>2];Da(b+3|0,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}Da(b+5|0,f+4|0,2);e=H[f+4>>2];if(e>>>0>=2){Ba(d,2,3130,0);a=1;break a}h=c-7|0;if(e){c=b+7|0;while(1){if(h>>>0<=2){Ba(d,1,4721,0);a=0;break a}Da(c,f+12|0,1);if(H[f+12>>2]!=1){Ba(d,2,5579,0);a=1;break a}Da(c+1|0,f,2);e=H[f>>2];b=e&32767;H[a+4>>2]=b;h=h-3|0;e=(e>>>15|0)+1|0;k=N(e,b)+2|0;if(h>>>0>>0){Ba(d,1,4721,0);a=0;break a}c=c+3|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f,2);e=H[f>>2];b=e&32767;H[f>>2]=b;if((b|0)!=H[a+4>>2]){Ba(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=h-k|0;if(l>>>0>k>>>0){Ba(d,1,4721,0);a=0;break a}c=c+2|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f+12|0,3);e=H[f+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;h=e&255;H[f+8>>2]=h;d:{if(!h){break d}m=H[i+5620>>2];if(m){g=H[i+5616>>2];b=0;while(1){if((h|0)==H[g+8>>2]){H[a+8>>2]=g;break d}g=g+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}e=e>>>8&255;H[f+8>>2]=e;e:{if(!e){break e}h=H[i+5620>>2];if(h){g=H[i+5616>>2];b=0;while(1){if((e|0)==H[g+8>>2]){H[a+12>>2]=g;break e}g=g+20|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}h=k-l|0;c=c+3|0;n=n+1|0;if(n>>>0>2]){continue}break}}if(h){Ba(d,1,4721,0);a=0;break a}a=1;if(!j){break a}H[i+5632>>2]=H[i+5632>>2]+1;a=1}na=f+16|0;return a|0}function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Ta(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+28>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;c=H[d+4>>2];H[g>>2]=H[d>>2];H[g+4>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;b=H[b>>2]+7&-8;H[d>>2]=b+16;o=a;f=H[b>>2];a=H[b+4>>2];d=H[b+8>>2];c=H[b+12>>2];p=c;h=na-32|0;na=h;b=c&65535;e=c;c=d;d=e>>>16&32767;g=d;a:{if(d-15361>>>0<=2045){b=b<<4|c>>>28;d=c<<4|a>>>28;e=g-15360|0;a=a&268435455;b:{if((a|0)==134217728&(f|0)!=0|a>>>0>134217728){c=b;d=d+1|0;b=d?c:c+1|0;break b}if(f|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;b=a>>>0>d>>>0?b+1|0:b}c=b>>>0>1048575;f=c?0:d;a=c?0:b;b=0;c=c+e|0;b=c>>>0>>0?1:b;break a}if(!(!(c|f|(a|b))|((d|0)!=32767|(k|0)!=0))){e=b<<4|c>>>28;f=c<<4|a>>>28;a=e|524288;c=2047;b=0;break a}if(g>>>0>17406){f=0;a=0;c=2047;b=0;break a}e=!(d|k);l=e?15360:15361;k=l-g|0;if((k|0)>112){f=0;a=0;c=0;b=0;break a}d=c;b=e?b:b|65536;if((g|0)!=(l|0)){m=f;c=a;i=d;e=b;l=128-k|0;c:{if(l&64){g=f;e=l+-64|0;c=e&31;if((e&63)>>>0>=32){e=f<>>32-c|a<>>0>=32){g=i<>>32-j|e<>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<>>32-j|c<>2]=m;H[h+20>>2]=c;H[h+24>>2]=i;H[h+28>>2]=e;m=(H[h+16>>2]|H[h+24>>2]|(H[h+20>>2]|H[h+28>>2]))!=0}d:{if(k&64){c=d;f=k+-64|0;a=f&31;if((f&63)>>>0>=32){e=0;f=b>>>a|0}else{e=b>>>a|0;f=((1<>>a}a=e;d=0;b=0;break d}if(!k){break d}g=d;c=64-k|0;e=c&31;if((c&63)>>>0>=32){c=d<>>32-e|b<>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<>>f}f=i|a;a=c|g;e=d;d=k&31;if((k&63)>>>0>=32){c=0;d=b>>>d|0}else{c=b>>>d|0;d=((1<>>d}b=c}H[h>>2]=f;H[h+4>>2]=a;H[h+8>>2]=d;H[h+12>>2]=b;a=H[h+8>>2];d=H[h+4>>2];f=a<<4|d>>>28;a=H[h+12>>2]<<4|a>>>28;c=d&268435455;b=H[h>>2]|m;e:{if((c|0)==134217728&(b|0)!=0|c>>>0>134217728){f=f+1|0;a=f?a:a+1|0;break e}if(b|(c|0)!=134217728){break e}b=a;a=f;f=f+(f&1)|0;a=a>>>0>f>>>0?b+1|0:b}c=a>>>0>1048575;a=c?a^1048576:a;b=0}na=h+32|0;u(0,f|0);u(1,a|(p&-2147483648|c<<20));q=o,r=+w(),M[q>>3]=r}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){d=H[r+36>>2];H[b+36>>2]=d;f=H[o+28>>2];c=f+N(d,152)|0;t=H[a+64>>2];a:{if(t){d=f+N(H[o+24>>2],152)|0;p=H[d-144>>2]-H[d-152>>2]|0;f=c+12|0;e=c+4|0;d=H[c+8>>2];g=H[c>>2];c=36;break a}f=c+148|0;e=c+140|0;d=H[c+144>>2];g=H[c+136>>2];p=d-g|0;c=52}u=H[c+o>>2];b:{c:{if(!u){break c}k=H[e>>2];l=H[f>>2];f=d-g|0;e=H[b+40>>2];c=e&31;if((e&63)>>>0>=32){c=-1<>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<>>c}c=H[b+16>>2];j=c+m|0;m=c>>>0>j>>>0?i+1|0:i;i=e&31;c=H[b+8>>2];if((e&63)>>>0>=32){i=m>>>i|0}else{i=((1<>>i}e=c+i|0;d:{if(g>>>0>i>>>0){m=g-i|0;i=0;if(e>>>0>=d>>>0){j=0;d=f;break d}d=e-g|0;j=f-d|0;break d}i=i-g|0;if(e>>>0>=d>>>0){d=f-i|0;m=0;j=0;break d}j=d-e|0;m=0;d=c}f=l-k|0;e=H[b+12>>2];g=e+h|0;e:{if(h>>>0>>0){s=k-h|0;h=0;n=0;if(g>>>0>=l>>>0){break e}n=f;f=g-k|0;n=n-f|0;break e}h=h-k|0;if(g>>>0>=l>>>0){f=f-h|0;s=0;n=0;break e}s=0;f=e;n=l-g|0}k=n;g=0;if((h|i|(j|k)|(d|f))<0){break b}k=N(h,p)+i|0;l=H[b+44>>2];h=N(c,s)+m|0;f:{g:{if(!(k|l|(h|(c|0)!=(p|0))|(c|0)!=(d|0))){if((e|0)!=(f|0)){break g}d=(t?36:52)+o|0;H[b+44>>2]=H[d>>2];H[d>>2]=0;break c}if(l){break f}}re(e,0,c);if(qa|!e){break b}c=N(c,e);if(c>>>0>1073741823){break b}c=Ia(c<<2);H[b+44>>2]=c;if(!c){break b}e=H[b+8>>2];g=H[b+12>>2];if((e|0)==(d|0)&(g|0)==(f|0)){break f}e=N(e,g)<<2;if(!e){break f}y(c,0,e)}if(!f){break c}d=d<<2;g=H[b+44>>2]+(h<<2)|0;c=(k<<2)+u|0;if((f|0)!=1){k=f&1;l=f&2147483646;f=0;while(1){h=!d;if(!h){B(g,c,d)}i=p<<2;c=i+c|0;e=(H[b+8>>2]<<2)+g|0;if(!h){B(e,c,d)}c=c+i|0;g=e+(H[b+8>>2]<<2)|0;f=f+2|0;if((l|0)!=(f|0)){continue}break}if(!k){break c}}if(!d){break c}B(g,c,d)}o=o+76|0;r=r+52|0;b=b+52|0;g=1;v=v+1|0;if(v>>>0>2]){continue}}break}return g}function wb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){jb(b);Ca(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Ca(b);H[a+16>>2]=0;H[a+20>>2]=0}Ca(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Ca(H[a+72>>2]);H[a+72>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Ca(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Ca(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Ca(b);H[a+52>>2]=0;H[a+56>>2]=0}Tb(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){jb(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Ca(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Ca(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Ca(b);H[a+140>>2]=0}Ca(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Ca(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Ca(H[a+192>>2])}y(a+104|0,0,112);pb(H[a+216>>2]);H[a+216>>2]=0;pb(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Ca(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Ca(c);H[d+40>>2]=0}Ca(d)}H[a+224>>2]=0;Ua(H[a+96>>2]);H[a+96>>2]=0;Ua(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Ca(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Ca(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){ra[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Ca(H[d>>2]);Ca(d)}Ca(f)}H[a+236>>2]=0;Ca(a)}}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=na-256|0;na=k;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[k>>2]=c;H[k+128>>2]=b;e=c;g=b;while(1){o=h;h=h+1|0;j=h<<2;l=(e+1|0)/2|0;H[j+k>>2]=l;n=j+(k+128|0)|0;j=(g+1|0)/2|0;H[n>>2]=j;i=N(e,g);f=i+f|0;e=l;g=j;if(i>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0;break d}f=f<<4;if(f>>>0<=K[a+16>>2]){break b}b=Ha(H[a+12>>2],f);if(b){break c}Ba(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0}Ca(a);a=0;break a}H[a+12>>2]=b;c=H[a+16>>2];d=f-c|0;if(d){y(b+c|0,0,d)}H[a+16>>2]=f;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){l=0;e=(N(b,c)<<4)+g|0;f=e;while(1){b=l<<2;h=H[b+k>>2];e:{if((h|0)<=0){break e}j=h-1|0;d=0;f:{g:{b=H[b+(k+128|0)>>2];if((b|0)<=0){i=h&3;if(h>>>0>=4){break g}h=0;break f}while(1){c=f;f=b;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;i=(f|0)>2;f=f-2|0;if(i){continue}}break}i=((d|0)==(j|0)|d)&1;f=i?e:c+(b<<4)|0;e=i?e:c;d=d+1|0;if((h|0)!=(d|0)){continue}break}break e}m=h&2147483644;h=0;c=0;while(1){n=(h|0)==(j|0);h=h+4|0;e=n?e:f;f=e;c=c+4|0;if((m|0)!=(c|0)){continue}break}if(i){break f}break e}while(1){c=f;m=((h|0)==(j|0)|h)&1;f=m?e:c+(b<<4)|0;e=m?e:c;h=h+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}l=l+1|0;if((o|0)!=(l|0)){continue}break}}H[g>>2]=0}b=H[a+8>>2];if(!b){break a}c=b&3;e=H[a+12>>2];if(b>>>0>=4){b=b&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((c|0)!=(g|0)){continue}break}}na=k+256|0;return a}function Xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=na-16|0;na=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(!c){Ba(d,1,4259,0);break a}i=H[a+96>>2];e=1;Da(b,g+8|0,1);f=H[g+8>>2];if(f>>>0>=2){Ba(d,2,9792,0);break a}if((f+1|0)!=(c|0)){e=0;Ba(d,2,4259,0);break a}c=H[i+16>>2];b:{if(!c){break b}d=c&7;e=H[h+5584>>2];if(c>>>0>=8){i=c&-8;c=0;while(1){H[e+8636>>2]=0;H[e+7556>>2]=0;H[e+6476>>2]=0;H[e+5396>>2]=0;H[e+4316>>2]=0;H[e+3236>>2]=0;H[e+2156>>2]=0;H[e+1076>>2]=0;e=e+8640|0;c=c+8|0;if((i|0)!=(c|0)){continue}break}if(!d){break b}}c=0;while(1){H[e+1076>>2]=0;e=e+1080|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}c=H[h+5608>>2];if(c){Ca(c);H[h+5608>>2]=0;f=H[g+8>>2]}if(!f){e=1;break a}i=0;while(1){b=b+1|0;Da(b,g+12|0,1);c:{if(!H[h+5632>>2]){break c}d=H[h+5628>>2];if(H[d>>2]!=H[g+12>>2]){break c}f=H[d+4>>2];j=H[a+96>>2];if((f|0)!=H[j+16>>2]){break c}c=H[d+8>>2];if(c){e=0;f=N(f,f);if(H[c+16>>2]!=(N(f,H[(H[c>>2]<<2)+24896>>2])|0)){break a}k=Fa(f<<2);H[h+5608>>2]=k;if(!k){break a}ra[H[(H[c>>2]<<2)+25200>>2]](H[c+12>>2],k,f)}c=H[d+12>>2];if(!c){break c}e=0;d=H[j+16>>2];if(H[c+16>>2]!=(N(d,H[(H[c>>2]<<2)+24896>>2])|0)){break a}f=Fa(d<<2);if(!f){break a}ra[H[(H[c>>2]<<2)+25216>>2]](H[c+12>>2],f,d);c=H[j+16>>2];d:{if(!c){break d}j=c&7;e=H[h+5584>>2];e:{if(c>>>0<8){c=f;break e}k=c&-8;d=0;c=f;while(1){H[e+1076>>2]=H[c>>2];H[e+2156>>2]=H[c+4>>2];H[e+3236>>2]=H[c+8>>2];H[e+4316>>2]=H[c+12>>2];H[e+5396>>2]=H[c+16>>2];H[e+6476>>2]=H[c+20>>2];H[e+7556>>2]=H[c+24>>2];H[e+8636>>2]=H[c+28>>2];e=e+8640|0;c=c+32|0;d=d+8|0;if((k|0)!=(d|0)){continue}break}if(!j){break d}}d=0;while(1){H[e+1076>>2]=H[c>>2];e=e+1080|0;c=c+4|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}Ca(f)}e=1;i=i+1|0;if(i>>>0>2]){continue}break}}na=g+16|0;return e|0}function xb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=ve(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=ve(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=ve(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=ve(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

    >>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function lb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}b=H[a+20>>2];a:{if((b|0)>=4){d=H[a>>2];c=H[d-3>>2];e=b-4|0;H[a+20>>2]=e;H[a>>2]=d-4;break a}if((b|0)<=0){e=b;break a}f=H[a>>2];d=24;b:{if((b|0)==1){break b}l=b&1;k=b&2147483646;while(1){h=f-1|0;H[a>>2]=h;i=I[f|0];f=f-2|0;H[a>>2]=f;H[a+20>>2]=b-1;h=I[h|0];b=b-2|0;H[a+20>>2]=b;c=i<>2]=f-1;f=I[f|0];H[a+20>>2]=b-1;c=f<>2];k=c&255;H[a+24>>2]=k>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;l=i+(g+(d>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=l;j=H[a+12>>2];b=f<>>24|d<>>0>=32){d=b<>>32-c;b=b<>2];b=d|j;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(l>>>0<=31){c:{if((e|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=e-4;H[a>>2]=b-4;break c}if((e|0)<=0){c=0;break c}b=H[a>>2];d:{if((e|0)==1){d=24;c=0;break d}i=e&1;j=e&2147483646;d=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=e-1;m=I[m|0];e=e-2|0;H[a+20>>2]=e;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=e-1;c=b<>2]=e>>>0>143;k=k>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=k+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;j=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;H[a+16>>2]=j+(l+(d>>>0<=143?8:(c&127)==127?7:8)|0);b=a;a=f<>>24|d<>>0>=32){c=a<>>32-e;a=a<>2]=g;H[b+12>>2]=c|h}return g}function Sc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Fa(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Fa(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Fa(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Fa(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Ea(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Ea(1,4);H[e+20>>2]=d;b=e;if(d){break c}Ca(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Ea(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Ea(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}Tb(H[a+232>>2]);i=0;H[a+232>>2]=0;Ba(c,1,3668,0)}return i|0}function pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=na-80|0;na=e;H[e+76>>2]=1;j=H[a+44>>2];d=H[H[a+224>>2]+40>>2];a:{b:{if(!d|!H[d+16>>2]){break b}c:{d=d+N(j,40)|0;if(!H[d+4>>2]){d=H[a+52>>2];f=H[a+48>>2]+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break c}d=0;Ba(c,1,5440,0);break a}d=H[d+16>>2];if(!bb(b,H[d>>2],H[d+4>>2],c)){Ba(c,1,5440,0);d=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);d=0;break a}Da(H[a+16>>2],e+72|0,2);if(H[e+72>>2]==65424){break c}Ba(c,1,4073,0);d=0;break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}f=N(H[a+132>>2],H[a+128>>2]);d:{if(!f){break d}i=f&7;h=H[a+180>>2];d=0;if(f>>>0>=8){k=f&-8;while(1){f=h+N(g,5644)|0;H[f+45096>>2]=-1;H[f+39452>>2]=-1;H[f+33808>>2]=-1;H[f+28164>>2]=-1;H[f+22520>>2]=-1;H[f+16876>>2]=-1;H[f+11232>>2]=-1;H[f+5588>>2]=-1;g=g+8|0;l=l+8|0;if((k|0)!=(l|0)){continue}break}if(!i){break d}}while(1){H[(h+N(g,5644)|0)+5588>>2]=-1;g=g+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}d=0;if(!cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){break a}i=j+1|0;while(1){e:{if(!H[e+76>>2]){break e}f=H[e+72>>2];if(!ib(a,f,0,0,b,c)){break a}h=H[a+128>>2];k=H[a+132>>2];g=f+1|0;H[e+32>>2]=g;H[e+36>>2]=N(h,k);Ba(c,4,11795,e+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}d=H[a+180>>2]+N(f,5644)|0;h=H[d+5596>>2];if(h){Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[e+16>>2]=g;Ba(c,4,16601,e+16|0);if((f|0)==(j|0)){d=H[a+224>>2];f=H[d+8>>2];d=H[d+12>>2];f=f+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break e}d=0;Ba(c,1,5440,0);break a}H[e+4>>2]=i;H[e>>2]=g;Ba(c,2,13648,e);d=0;if(cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){continue}break a}break}d=Gc(a,c)}na=e+80|0;return d|0}function Ma(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}c=H[a+24>>2];a:{if((c|0)>=4){b=H[a>>2];d=H[b>>2];e=c-4|0;H[a+24>>2]=e;H[a>>2]=b+4;break a}d=H[a+28>>2]?-1:0;if((c|0)<=0){e=c;break a}b=H[a>>2];if((c|0)!=1){j=c&1;i=c&2147483646;while(1){e=b;H[a>>2]=b+1;k=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=c-1;e=I[e+1|0];c=c-2|0;H[a+24>>2]=c;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=c-1;d=(255<>2];i=d>>>24|0;H[a+20>>2]=(i|0)==255;c=d>>>16&255;f=d>>>8&255;b=b?7:8;d=d&255;g=b+((d|0)==255?7:8)|0;k=((f|0)==255?7:8)+g|0;j=(h+((c|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=d|(f<>>0>=32){d=b<>>32-c;b=b<>2];b=d|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){b:{if((e|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=e-4;H[a>>2]=b+4;break b}f=0;d=H[a+28>>2]?-1:0;if((e|0)<=0){break b}b=H[a>>2];if((e|0)!=1){l=e&1;m=e&2147483646;g=0;while(1){c=b;H[a>>2]=b+1;n=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=e-1;c=I[c+1|0];e=e-2|0;H[a+24>>2]=e;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=e-1;d=(255<>>24|0;H[a+20>>2]=(e|0)==255;c=d>>>16&255;f=d>>>8&255;g=(i|0)==255?7:8;d=d&255;i=g+((d|0)==255?7:8)|0;l=((f|0)==255?7:8)+i|0;H[a+16>>2]=(((c|0)==255?7:8)+j|0)+l;b=a;a=d|(f<>>0>=32){c=a<>>32-e;a=a<>2]=h;H[b+12>>2]=c|k}return h}function Lc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;h=na-32|0;na=h;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ba(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Da(c,f+4|0,1);g=H[f+4>>2]+1|0;H[f+4>>2]=g;if(g>>>0>=34){H[h+4>>2]=33;H[h>>2]=g;Ba(e,1,7635,h);a=0;break a}j=H[a+184>>2];if(j>>>0>=g>>>0){H[h+24>>2]=g;H[h+20>>2]=j;H[h+16>>2]=b;Ba(e,1,16423,h+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Da(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Da(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ba(e,1,5468,0);break a}Da(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ba(e,1,6564,0);break a}Da(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ba(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;g=H[f+4>>2];if(!(F[f|0]&1)){if(!g){break a}j=g&3;d=f+944|0;e=f+812|0;b=0;c=0;if(g>>>0>=4){k=g&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;i=f|4;H[i+e>>2]=15;H[d+i>>2]=15;i=f|8;H[i+e>>2]=15;H[d+i>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}if(!j){break a}}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}break a}if(b>>>0>=g>>>0){b:{if(!g){g=0;break b}Da(c+5|0,h+28|0,1);a=H[h+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){j=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Da(a,h+28|0,1);c:{b=H[h+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ba(e,1,6025,0);break a}i=c<<2;H[i+k>>2]=g;H[j+i>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ba(e,1,2607,0)}na=h+32|0;return a}function gc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=na-256|0;na=j;g=Ea(1,20);a:{if(!g){Ba(c,1,6413,0);g=0;break a}H[g+4>>2]=b;H[g>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=h;h=h+1|0;e=h<<2;d=(b+1|0)/2|0;H[e+j>>2]=d;i=e+(j+128|0)|0;e=(a+1|0)/2|0;H[i>>2]=e;i=N(a,b);f=i+f|0;b=d;a=e;if(i>>>0>1){continue}break}H[g+8>>2]=f;if(!f){Ca(g);g=0;break a}d=Ea(f,16);H[g+12>>2]=d;if(!d){Ba(c,1,3564,0);Ca(g);g=0;break a}l=H[g+8>>2];H[g+16>>2]=l<<4;a=d;if(p){f=(N(H[g+4>>2],H[g>>2])<<4)+d|0;b=f;while(1){c=n<<2;e=H[c+j>>2];b:{if((e|0)<=0){break b}o=e-1|0;i=0;c:{d:{c=H[c+(j+128|0)>>2];if((c|0)<=0){k=e&3;if(e>>>0>=4){break d}h=0;break c}while(1){h=f;f=c;while(1){e:{H[a>>2]=b;if((f|0)==1){a=a+16|0;b=b+16|0;break e}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(f|0)>2;f=f-2|0;if(k){continue}}break}k=((i|0)==(o|0)|i)&1;f=k?b:h+(c<<4)|0;b=k?b:h;i=i+1|0;if((e|0)!=(i|0)){continue}break}break b}m=e&2147483644;h=0;e=0;while(1){q=(h|0)==(o|0);h=h+4|0;f=q?b:f;b=f;e=e+4|0;if((m|0)!=(e|0)){continue}break}if(k){break c}break b}while(1){e=f;m=((h|0)==(o|0)|h)&1;f=m?b:e+(c<<4)|0;b=m?b:e;h=h+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;f:{if(!l){break f}a=l&3;if(l>>>0>=4){c=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!a){break f}}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}na=j+256|0;return g}function Zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+16>>2]=0;H[a+20>>2]=0;H[a+28>>2]=d;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ha(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!b){return 0}a:{if(!a){a=gb(8,b);break a}if(!b){Ca(a);a=0;break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;d=h+8|0;j=a-4|0;f=j;e=H[f>>2];b=e+f|0;c=H[b>>2];c:{d:{e:{if((c|0)!=H[(b+c|0)-4>>2]){c=c+e|0;if(c>>>0>=d+16>>>0){e=H[b+4>>2];b=H[b+8>>2];H[e+8>>2]=b;H[b+4>>2]=e;b=d+f|0;c=c-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;e=H[b>>2]-8|0;f:{if(e>>>0<=127){g=(e>>>3|0)-1|0;break f}c=Q(e);g=((e>>>29-c^4)-(c<<2)|0)+110|0;if(e>>>0<=4095){break f}c=((e>>>30-c^2)-(c<<1)|0)+71|0;g=c>>>0>=63?63:c}c=g;e=c<<4;H[b+4>>2]=e+26400;e=e+26408|0;H[b+8>>2]=H[e>>2];H[e>>2]=b;H[H[b+8>>2]+4>>2]=b;e=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b}H[6858]=g|H[6858];H[6859]=c|e;H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;c=1;break c}if(c>>>0>>0){break e}d=H[b+4>>2];b=H[b+8>>2];H[d+8>>2]=b;H[b+4>>2]=d;H[f>>2]=c;H[(f+(c&-4)|0)-4>>2]=c;c=1;break c}if(e>>>0>=d+16>>>0){H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;b=d+f|0;c=e-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;d=H[b>>2]-8|0;g:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break g}f=Q(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break g}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;H[b+4>>2]=d+26400;d=d+26408|0;H[b+8>>2]=H[d>>2];H[d>>2]=b;H[H[b+8>>2]+4>>2]=b;d=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b;b=e}H[6858]=b|H[6858];H[6859]=c|d;c=1;break c}c=1;if(d>>>0<=e>>>0){break d}}c=0}}if(c){break a}b=gb(8,h);if(!b){break b}i=H[j>>2]-8|0;ab(b,a,h>>>0>>0?h:i);Ca(a);i=b}a=i}return a}function ne(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=na-16|0;na=f;H[f+12>>2]=c;k=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){c=0;Ba(d,1,4565,0);break a}Da(b,e,1);if(K[e>>2]>=8){c=0;Ba(d,1,4531,0);break a}Da(b+1|0,f+8|0,1);c=H[f+8>>2];H[e+4>>2]=c;if((c|0)>=5){Ba(d,1,4490,0);H[e+4>>2]=-1}Da(b+2|0,e+8|0,2);g=H[e+8>>2];if(g-65536>>>0<=4294901760){H[f>>2]=g;Ba(d,1,8111,f);c=0;break a}c=H[a+188>>2];H[e+12>>2]=c?c:g;Da(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){c=0;Ba(d,1,5536,0);break a}g=b+5|0;H[f+12>>2]=H[f+12>>2]-5;c=H[k+16>>2];b:{if(!c){break b}k=c&7;h=H[e>>2]&1;e=H[e+5584>>2];b=0;if(c>>>0>=8){c=c&-8;while(1){i=e+N(b,1080)|0;H[i+7560>>2]=h;H[i+6480>>2]=h;H[i+5400>>2]=h;H[i+4320>>2]=h;H[i+3240>>2]=h;H[i+2160>>2]=h;H[i+1080>>2]=h;H[i>>2]=h;b=b+8|0;j=j+8|0;if((c|0)!=(j|0)){continue}break}if(!k){break b}}while(1){H[e+N(b,1080)>>2]=h;b=b+1|0;l=l+1|0;if((k|0)!=(l|0)){continue}break}}c=0;if(!Lc(a,0,g,f+12|0,d)){Ba(d,1,4565,0);break a}if(H[f+12>>2]){Ba(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];g=H[b+4>>2]<<2;l=b+944|0;e=b+812|0;j=1;c=b;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!g;if(!d){B(c+1892|0,e,g)}if(!d){B(c+2024|0,l,g)}c=c+1080|0;j=j+1|0;if(j>>>0>2]+16>>2]){continue}break}}c=1}na=f+16|0;return c|0}function gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=a>>>0<=8?8:a;k=j+48|0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}c=H[6859];e=c;h=H[6858];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){i=(b>>>3|0)-1|0;break c}d=Q(b);i=((b>>>29-d^4)-(d<<2)|0)+110|0;if(b>>>0<=4095){break c}d=((b>>>30-d^2)-(d<<1)|0)+71|0;i=d>>>0>=63?63:d}g=i;f=g&31;if((g&63)>>>0>=32){d=0;c=c>>>f|0}else{d=c>>>f|0;c=((1<>>f}if(c|d){while(1){f=d;d:{if(f|c){e=f-1|0;i=e+1|0;d=e;e=c-1|0;h=(e|0)!=-1?i:d;d=Q(f^h);d=(d|0)==32?Q(c^e)+32|0:d;e=63-d|0;qa=0-(d>>>0>63)|0;break d}qa=0;e=64}h=e;e=h&31;if((h&63)>>>0>=32){d=0;i=f>>>e|0}else{d=f>>>e|0;i=((1<>>e}g=g+h|0;c=g<<4;f=H[c+26408>>2];e=c+26400|0;e:{if((f|0)!=(e|0)){c=Cb(f,j,b);if(c){break a}c=H[f+4>>2];h=H[f+8>>2];H[c+8>>2]=h;H[h+4>>2]=c;H[f+8>>2]=e;H[f+4>>2]=H[e+4>>2];H[e+4>>2]=f;H[H[f+4>>2]+8>>2]=f;g=g+1|0;c=(d&1)<<31|i>>>1;d=d>>>1|0;break e}c=H[6859];l=27432,m=H[6858]&ye(-2,-1,g),H[l>>2]=m;H[6859]=qa&c;c=i^1}if(c|d){continue}break}h=H[6858];e=H[6859]}d=Q(e);f=63-((d|0)==32?Q(h)+32|0:d)|0;f:{if(!(e|h)){g=0;break f}c=f<<4;g=H[c+26408>>2];if(!e&h>>>0<1073741824){break f}d=98;e=c+26400|0;if((e|0)==(g|0)){break f}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((e|0)==(g|0)){break f}c=d;d=c-1|0;if(c){continue}break}}d=a>>>0>8;a=j;if(zc((d?k:48)+b|0)){continue}break}if(!g){break b}a=(f<<4)+26400|0;if((a|0)==(g|0)){break b}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((a|0)!=(g|0)){continue}break}}c=0}return c}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;qa=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;qa=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];h=b;f=e;b=b-e|0;c=c-(e>>>0>h>>>0)|0}a:{if((c|0)>0){h=1}else{h=!!b&(c|0)>=0}if(h){while(1){h=H[a+12>>2];e=c+g|0;i=b+f|0;e=H[a+60>>2]+(i>>>0>>0?e+1|0:e)|0;j=i;i=i+H[a+56>>2]|0;e=j>>>0>i>>>0?e+1|0:e;if((e|0)==(h|0)&i>>>0>K[a+8>>2]|e>>>0>h>>>0){Ba(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;h=ra[H[a+28>>2]](d,e,H[a>>2])|0;i=H[a+68>>2];if(h){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=i|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((e&i)==-1){Ba(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+i|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;h=b;b=b-e|0;c=c-((e>>>0>h>>>0)+i|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;qa=g;return f|0}qa=a?-1:g;return b|0}function yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-80|0;na=e;a:{if(c>>>0<=2){Ba(d,1,14478,0);break a}if(I[a+124|0]){Ba(d,4,11193,0);g=1;break a}g=1;Da(b,a+40|0,1);Da(b+1|0,a+52|0,1);Da(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ba(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ba(d,2,15155,e+48|0)}Da(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Fa(36);if(!f){g=0;Ba(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Da(b+7|0,e+76|0,4);Da(b+11|0,e+72|0,4);Da(b+15|0,e+68|0,4);Da(b+19|0,e- -64|0,4);Da(b+23|0,e+60|0,4);Da(b+27|0,e+56|0,4);Da(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ba(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Ea(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Da(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ba(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}na=e+80|0;return g|0}function Ja(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=ra[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=ra[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ba(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Ta(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;mb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;mb(f,l,c,j,a,O(-.8829110860824585));mb(i,b,g,h,e,O(.05298011749982834));mb(f,l,c,j,a,O(1.5861343145370483))}}function _b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=H[a+28>>2]+N(b,152)|0;c=H[e-144>>2]-H[e-152>>2]|0;d=H[e-140>>2]-H[e-148>>2]|0;f=d>>>0>=64?64:d;g=c>>>0>=64?64:c;a:{if(!(!c|!d|(!g|!f)|g>>>0>4294967295/(f>>>0)>>>2>>>0)){e=Ea(1,28);H[e+12>>2]=f;H[e+8>>2]=g;H[e+4>>2]=d;H[e>>2]=c;j=d;d=d+f|0;i=j>>>0>d>>>0;d=ve(d-1|0,i-!d|0,f,0);H[e+20>>2]=d;j=c;c=c+g|0;f=j>>>0>c>>>0;c=ve(c-1|0,f-!c|0,g,0);H[e+16>>2]=c;re(d,0,c);b:{if(qa){break b}c=Ea(4,N(c,d));H[e+24>>2]=c;if(!c){break b}break a}Ca(e)}e=0}if(!e){return 0}c:{if(b){while(1){q=N(p,152);g=q+H[a+28>>2]|0;c=H[g+24>>2];if(c){j=g+28|0;d=H[g+20>>2];f=H[g+16>>2];n=0;while(1){if(N(d,f)){i=N(n,36)+j|0;o=0;while(1){k=H[i+20>>2]+N(o,40)|0;c=H[k+20>>2];h=H[k+16>>2];if(N(c,h)){f=0;while(1){l=H[k+24>>2]+N(f,68)|0;r=H[l+60>>2];if(r){h=H[l+8>>2];d=h-H[i>>2]|0;m=H[i+16>>2];if(m&1){c=H[a+28>>2]+q|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}s=H[l+12>>2];c=s-H[i+4>>2]|0;if(m&2){m=H[a+28>>2]+q|0;c=(c+H[m-140>>2]|0)-H[m-148>>2]|0}h=H[l+16>>2]-h|0;if(!Za(e,d,c,d+h|0,(H[l+20>>2]-s|0)+c|0,r,1,h)){break c}h=H[k+16>>2];c=H[k+20>>2]}f=f+1|0;if(f>>>0>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}p=p+1|0;if((p|0)!=(b|0)){continue}break}}return e}Va(e);return 0}function $d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=na-16|0;na=h;if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4132,0);a=0;break a}Da(b,h+12|0,2);b:{if(H[h+12>>2]){Ba(d,2,3608,0);break b}if(c>>>0<=6){Ba(d,1,4132,0);a=0;break a}Da(b+2|0,h+12|0,2);g=H[e+5616>>2];k=I[h+12|0];f=H[e+5620>>2];c:{d:{if(!f){break d}a=g;while(1){if(H[a+8>>2]!=(k|0)){a=a+20|0;i=i+1|0;if((i|0)!=(f|0)){continue}break d}break}if((f|0)!=(i|0)){break c}}if(H[e+5624>>2]==(f|0)){a=f+10|0;H[e+5624>>2]=a;a=Ha(g,N(a,20));g=H[e+5616>>2];if(!a){Ca(g);H[e+5624>>2]=0;H[e+5616>>2]=0;H[e+5620>>2]=0;Ba(d,1,4158,0);a=0;break a}e:{if((a|0)==(g|0)){break e}l=H[e+5632>>2];if(!l){break e}m=H[e+5628>>2];i=0;while(1){f=N(i,20)+m|0;j=H[f+8>>2];if(j){H[f+8>>2]=a+(j-g|0)}j=H[f+12>>2];if(j){H[f+12>>2]=a+(j-g|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[e+5616>>2]=a;g=H[e+5620>>2];f=N(H[e+5624>>2]-g|0,20);if(f){y(a+N(g,20)|0,0,f)}f=H[e+5620>>2];g=H[e+5616>>2]}H[e+5620>>2]=f+1;a=N(f,20)+g|0}e=H[a+12>>2];if(e){Ca(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Da(b+4|0,h+12|0,2);if(H[h+12>>2]){Ba(d,2,3023,0);break b}c=c-6|0;e=Fa(c);H[a+12>>2]=e;if(!e){Ba(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}na=h+16|0;return a|0}function Tb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Ca(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Ca(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Ca(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Ca(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Ca(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Ca(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Ca(d);H[g+20>>2]=0;Ca(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Ca(b);H[a+20>>2]=0}Ca(H[a+68>>2]);Ca(a)}}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function $b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];e=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];c=H[b>>2]-(d+1>>1)|0;i=H[a>>2];if(e>>>0>=4){k=(e-4>>>1|0)+1|0;a=1;while(1){f=d;d=a<<2;m=H[d+b>>2];d=H[d+h>>2];j=c;l=i+(g<<2)|0;H[l>>2]=c;c=m-((d+f|0)+2>>2)|0;H[l+4>>2]=f+(j+c>>1);g=g+2|0;f=(a|0)!=(k|0);a=a+1|0;if(f){continue}break}}H[i+(g<<2)>>2]=c;if(e&1){f=e-1|0;a=H[(f<<1)+b>>2]-(d+1>>1)|0;H[i+(f<<2)>>2]=a;c=a+c>>1;j=-8}else{j=-4}a=e<<2;H[j+(a+i|0)>>2]=c+d;if(!a){break a}B(b,i,a);return}b:{switch(e-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break b}}if((e|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];c=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=c+a;g=1;m=e-2|0;l=e&1;a=!l;if(m-a>>>0>=2){o=((e-a|0)-4>>>1|0)+1|0;a=1;while(1){f=d;p=H[(a<<2)+b>>2];j=a+1|0;d=H[k+(j<<2)>>2];i=c;n=h+(g<<2)|0;H[n>>2]=c;c=p-((d+f|0)+2>>2)|0;H[n+4>>2]=f+(i+c>>1);g=g+2|0;f=(a|0)!=(o|0);a=j;if(f){continue}break}}H[h+(g<<2)>>2]=c;c:{if(!l){g=H[((e<<1)+b|0)-4>>2]-(d+1>>1)|0;H[h+(m<<2)>>2]=(g+c>>1)+d;break c}g=c+d|0}a=e<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function Hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=na-256|0;na=d;if(a){Ac(1806,17,c);H[d+240>>2]=H[a>>2];Ga(c,2348,d+240|0);H[d+224>>2]=H[a+4>>2];Ga(c,2361,d+224|0);H[d+208>>2]=H[a+8>>2];Ga(c,7260,d+208|0);H[d+192>>2]=H[a+16>>2];Ga(c,2319,d+192|0);if((b|0)>0){while(1){e=H[a+5584>>2];H[d+176>>2]=h;Ga(c,1844,d+176|0);e=e+N(h,1080)|0;H[d+160>>2]=H[e>>2];Ga(c,2347,d+160|0);H[d+144>>2]=H[e+4>>2];Ga(c,7374,d+144|0);H[d+128>>2]=H[e+8>>2];Ga(c,7162,d+128|0);H[d+112>>2]=H[e+12>>2];Ga(c,7178,d+112|0);H[d+96>>2]=H[e+16>>2];Ga(c,2330,d+96|0);H[d+80>>2]=H[e+20>>2];Ga(c,7440,d+80|0);Ac(1567,23,c);if(H[e+4>>2]){i=e+944|0;j=e+812|0;f=0;while(1){g=f<<2;k=H[j+g>>2];H[d+68>>2]=H[i+g>>2];H[d+64>>2]=k;Ga(c,1693,d- -64|0);f=f+1|0;if(f>>>0>2]){continue}break}}Bc(c);H[d+48>>2]=H[e+24>>2];Ga(c,7194,d+48|0);H[d+32>>2]=H[e+804>>2];Ga(c,7243,d+32|0);i=1;Ac(1591,20,c);a:{if(H[e+24>>2]!=1){f=H[e+4>>2];if((f|0)<=0){break a}i=N(f,3)-2|0}j=e+28|0;f=0;while(1){g=j+(f<<3)|0;l=d,m=ye(H[g>>2],H[g+4>>2],32),H[l+16>>2]=m;H[d+20>>2]=qa;Ga(c,1693,d+16|0);f=f+1|0;if((i|0)!=(f|0)){continue}break}}Bc(c);H[d>>2]=H[e+808>>2];Ga(c,7226,d);Ac(1707,5,c);h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ac(1708,4,c)}na=d+256|0}function se(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;oa=a-N(b,c)|0;pa=0;qa=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}oa=a;pa=e&f;a=e>>>te(d)|0;qa=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}oa=0;a=(e>>>0)/(d>>>0)|0;pa=e-N(a,d)|0;qa=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}oa=a&f;pa=0;if((c|0)==1){break a}c=te(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}qa=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}oa=f;pa=e;j=b<<1|a>>>31;a=l|a<<1;qa=j|o;return a}oa=a;pa=b;a=0;b=0}qa=b;return a}function Kc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=na-16|0;na=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ba(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Da(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ba(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Da(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Da(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+12>>2]=c;H[b+4>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}na=h+16|0;return d}function fe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=na-32|0;na=f;g=1;a:{if(c>>>0<=1){g=0;Ba(d,1,10062,0);break a}if(H[a+76>>2]){break a}Da(b,f+28|0,1);Da(b+1|0,f+24|0,1);e=H[f+24>>2];i=e>>>4&3;if((i|0)==3){H[a+76>>2]=1;Ba(d,2,11558,0);break a}c=c-2|0;j=(e>>>5&2)+2|0;h=i+j|0;e=(c>>>0)/(h>>>0)|0;if((c|0)!=(N(e,h)|0)){H[a+76>>2]=1;Ba(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(e^-1)>>>0){c=c+e|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ba(d,2,9400,0);break a}h=Ha(H[a+72>>2],c<<3);if(!h){H[a+76>>2]=1;Ba(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=h;c:{if(i){k=e>>>0<=1?1:e;e=0;while(1){Da(c,f+20|0,i);b=H[f+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+i|0;Da(b,f+16|0,j);c=H[a+68>>2];g=h+(c<<3)|0;G[g>>1]=H[f+20>>2];H[g+4>>2]=H[f+16>>2];g=1;H[a+68>>2]=c+1;c=b+j|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}break a}i=e>>>0<=1?1:e;b=H[a+68>>2];e=0;while(1){H[f+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Da(c,f+16|0,j);k=H[a+68>>2];g=h+(k<<3)|0;G[g>>1]=b;H[g+4>>2]=H[f+16>>2];g=1;b=k+1|0;H[a+68>>2]=b;c=c+j|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}H[a+76>>2]=1;H[f>>2]=b;Ba(d,2,7799,f)}na=f+32|0;return g|0}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=na-16|0;na=h;a:{if(!(I[a+100|0]&2)){Ba(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ba(d,1,3403,0);break b}g=h+12|0;Da(b,g,4);e=H[h+12>>2];Da(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Da(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Da(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ba(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ba(d,1,9148,0);break b}if(c>>>0>>0){Ba(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25296;break j}if((g|0)==1885564018){break l}f=25264;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25272;break j}f=25280;break j}f=25288;break j}f=25304}if(ra[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ba(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ba(d,1,e,0)}Ba(d,1,1968,0);a=0}na=h+16|0;return a|0}function Jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!Wa(H[b+8>>2],54,d)){break a}i=H[b+4>>2];f=H[i>>2];e=H[i+8>>2];b:{if(f){g=1;c:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;d:{if(!g){break d}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break d}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break c}}if(!g){g=0;break c}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(g){break b}break a}Pa(i)}i=H[b+8>>2];f=H[i>>2];e=H[i+8>>2];e:{if(f){g=1;f:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;g:{if(!g){break g}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break g}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break f}}if(!g){g=0;break f}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(!g){break a}break e}Pa(i)}if(!I[b+132|0]){Ba(d,1,11696,0);return 0}if(!I[b+133|0]){Ba(d,1,11667,0);return 0}l=Mb(a,H[b>>2],c,d);if(!c|!l){break a}a=H[c>>2];if(!a){break a}e=1;h:{i:{switch(H[b+48>>2]-12|0){case 5:e=2;break h;case 6:e=3;break h;case 12:e=4;break h;case 0:e=5;break h;case 4:break h;default:break i}}e=-1}H[a+20>>2]=e;c=H[b+108>>2];if(!c){break a}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return l|0}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Eb();H[b+96>>2]=e;a:{b:{if(!e){break b}c:{if(Wa(H[b+220>>2],18,d)){if(Wa(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];f=H[i>>2];g=H[i+8>>2];d:{if(f){e=1;e:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;f:{if(!e){break f}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break f}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break e}}if(!e){e=0;break e}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break d}break a}Pa(i)}g:{if(Wa(H[b+216>>2],20,d)){if(Wa(H[b+216>>2],21,d)){break g}}break a}i=H[b+216>>2];f=H[i>>2];g=H[i+8>>2];h:{if(f){e=1;i:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;j:{if(!e){break j}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break j}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break i}}if(!e){e=0;break i}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break h}break a}Pa(i)}a=Eb();H[c>>2]=a;if(!a){break b}Ec(H[b+96>>2],a);l=1}return l|0}Ua(H[b+96>>2]);H[b+96>>2]=0;return 0}function zc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=H[6516];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=sa()<<16>>>0){break b}if(ga(a|0)|0){break b}}H[6597]=48;b=-1;break a}H[6516]=a}d=b;if((d|0)!=-1){a=d+c|0;H[a-4>>2]=16;f=a-16|0;H[f>>2]=16;b=H[6856];if(b){e=H[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=H[d-4>>2]&-2;g=d-e|0;h=H[g-4>>2];H[b+8>>2]=a;b=h&-2;a=g-b|0;if(H[(a+H[a>>2]|0)-4>>2]&1){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6856]=d;a=d+16|0}b=f-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26400;c=c+26408|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6859];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6858]=e|H[6858];H[6859]=b|c}return(d|0)!=-1}function Ec(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Ca(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Ca(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Fa(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);d=g+c|0;c=H[a+24>>2]+g|0;H[d+48>>2]=H[c+48>>2];e=H[c+44>>2];H[d+40>>2]=H[c+40>>2];H[d+44>>2]=e;e=H[c+36>>2];H[d+32>>2]=H[c+32>>2];H[d+36>>2]=e;e=H[c+28>>2];H[d+24>>2]=H[c+24>>2];H[d+28>>2]=e;e=H[c+20>>2];H[d+16>>2]=H[c+16>>2];H[d+20>>2]=e;e=H[c+12>>2];H[d+8>>2]=H[c+8>>2];H[d+12>>2]=e;e=H[c+4>>2];H[d>>2]=H[c>>2];H[d+4>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Fa(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function mb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;b=c?g+-64|0:a;i=d>>>0>>0?d:e;if(i>>>0>c>>>0){h=L[b>>2];while(1){a=b;b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if(K[a+44>>2]>=8){e=H[a+36>>2];n=e<<5;o=N(e,28);p=N(e,24);q=N(e,20);r=e<<4;i=N(e,12);j=e<<3;g=H[a+40>>2];k=8;while(1){zb(a,g,H[a+36>>2],8);Ta(a);h=H[a+32>>2];if(h){f=H[a>>2];b=0;a:{if((h|0)!=1){s=h&1;t=h&-2;l=0;while(1){c=(b<<2)+g|0;d=f+(b<<5)|0;L[c>>2]=L[d>>2];m=e<<2;L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];d=b|1;c=(d<<2)+g|0;d=f+(d<<5)|0;L[c>>2]=L[d>>2];L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];b=b+2|0;l=l+2|0;if((t|0)!=(l|0)){continue}break}if(!s){break a}}c=(b<<2)+g|0;b=f+(b<<5)|0;L[c>>2]=L[b>>2];L[c+(e<<2)>>2]=L[b+4>>2];L[c+j>>2]=L[b+8>>2];L[c+i>>2]=L[b+12>>2]}d=H[a>>2];b=0;while(1){f=(b<<2)+g|0;c=d+(b<<5)|0;L[f+r>>2]=L[c+16>>2];L[f+q>>2]=L[c+20>>2];L[f+p>>2]=L[c+24>>2];L[f+o>>2]=L[c+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}g=g+n|0;k=k+8|0;if(k>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-16|0;na=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Da(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ba(d,1,3526,f);break a}Da(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ba(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Fa(N(i,k)<<2);if(!h){break a}j=Fa(i);if(!j){Ca(h);break a}l=Fa(i);if(!l){Ca(h);Ca(j);break a}g=Fa(20);if(!g){Ca(h);Ca(j);Ca(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Da(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Da(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}na=f+16|0;return e|0}function od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;qa=-1;return-1}f=0;e=0;while(1){g=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((g&h)==-1){Ba(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;qa=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}qa=e;return f|0}function xc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a;a:{if(b&3){while(1){c=I[b|0];if(!c|(c|0)==61){break a}b=b+1|0;if(b&3){continue}break}}b:{c:{d=H[b>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break c}while(1){c=d^1027423549;if(((16843008-c|c)&-2139062144)!=-2139062144){break c}d=H[b+4>>2];c=b+4|0;b=c;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break b}c=b}while(1){b=c;d=I[b|0];if(!d){break a}c=b+1|0;if((d|0)!=61){continue}break}}if((a|0)==(b|0)){return 0}g=b-a|0;d:{if(I[g+a|0]){break d}f=H[6860];if(!f){break d}b=H[f>>2];if(!b){break d}while(1){e:{d=a;c=b;h=g;e=0;f:{if(!g){break f}e=I[d|0];if(e){g:{while(1){i=I[c|0];if((i|0)!=(e|0)|!i){break g}h=h-1|0;if(!h){break g}c=c+1|0;e=I[d+1|0];d=d+1|0;if(e){continue}break}e=0}}else{e=0}e=e-I[c|0]|0}if(!e){b=b+g|0;if(I[b|0]==61){break e}}b=H[f+4>>2];f=f+4|0;if(b){continue}break d}break}j=b+1|0}return j}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ba(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Da(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+5164>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7063,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+5164>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function Cb(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26400;d=d+26408|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6858];f=H[6859];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6858]=g|d;H[6859]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function he(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-16|0;na=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ba(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ba(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Da(b,c,1);b=b+1|0;Da(b,c+4|0,h);b=b+h|0;Da(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Da(b+2|0,c+12|0,1);b=b+3|0;Da(b,c+16|0,h);b=b+h|0;Da(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}na=g+16|0;return a|0}function jb(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Ca(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Ca(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Ca(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Ca(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Ca(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Ca(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Ca(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Ca(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Ca(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Ca(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Ca(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-32|0;na=e;a:{if(H[a+72>>2]){Ba(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ba(d,1,14445,0);break a}Da(b,a+16|0,4);Da(b+4|0,a+12|0,4);Da(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14289,e);c=0;break a}if(c>>>0>=16385){c=0;Ba(d,1,14203,0);break a}c=Ea(c,12);H[a+72>>2]=c;if(!c){c=0;Ba(d,1,14240,0);break a}c=1;Da(b+10|0,a+24|0,1);Da(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ba(d,4,16272,e+16|0)}Da(b+12|0,a+32|0,1);Da(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}na=e+32|0;return c|0}function qc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:ra[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function ce(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Da(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+140>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7085,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+140>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function cd(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a<<3;i=c+28640|0;d=M[c+28672>>3];if(d!=0){e=M[i>>3];g=S(e,b);b=g-e;if(b<0x10000000000000000&b>=0){f=~~b>>>0;if(P(b)>=1){c=~~(b>0?R(T(b*2.3283064365386963e-10),4294967295):U((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(d<0x10000000000000000&d>=0){j=~~d>>>0;if(P(d)>=1){h=~~(d>0?R(T(d*2.3283064365386963e-10),4294967295):U((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0}else{h=0}}else{h=0}c=ve(f,c,j,h);f=qa;c=c+1|0;f=c?f:f+1|0;e=(+(c>>>0)+ +(f>>>0)*4294967296)*d+e;g=e-g}M[i>>3]=e;fa(a|0,+g)|0;c=(a|0)==2?27:(a|0)==1?26:14;a=c-1|0;a:{if(H[6892]>>>a&1){H[6894]=H[6894]|1<>2];if(a){ra[a|0](c)}}}function jd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=na-32|0;na=d;e=H[a+28>>2];H[d+16>>2]=e;f=H[a+20>>2];H[d+28>>2]=c;H[d+24>>2]=b;b=f-e|0;H[d+20>>2]=b;f=b+c|0;i=2;b=d+16|0;a:{while(1){b:{c:{d:{if(!yc(Z(H[a+60>>2],b|0,i|0,d+12|0)|0)){g=H[d+12>>2];if((g|0)==(f|0)){break d}if((g|0)>=0){break c}break b}if((f|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;e=(j?8:0)+b|0;h=g-(j?h:0)|0;H[e>>2]=h+H[e>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;f=f-g|0;i=i-j|0;b=e;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}na=d+32|0;return a|0}function Ca(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26400;b=b+26408|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6858];c=H[6859];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6858]=e|b;H[6859]=a|c}}function td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ba(d,1,8882,0);break a}Da(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ba(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ba(d,1,8882,0);break a}d=Fa(N(f,6));if(!d){break a}c=Fa(8);H[a+116>>2]=c;if(!c){Ca(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Da(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Da(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Da(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}na=e+16|0;return g|0}function Lb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-32|0;na=g;f=H[a+96>>2];a:{if(!f){Ba(d,1,13752,0);e=0;break a}f=Ea(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ba(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ba(d,1,3487,g)}Ca(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(f);Ca(H[a+64>>2]);d:{if(b){d=b<<2;e=Fa(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}na=g+32|0;return e|0}function Fc(a){a=a|0;var b=0,c=0;if(a){wb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Ca(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Ca(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Ca(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Ca(c);b=H[a+116>>2];H[b>>2]=0}Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Ca(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Ca(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Ca(c);b=H[a+120>>2];H[b>>2]=0}Ca(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){pb(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){pb(b);H[a+8>>2]=0}Ca(a)}}function Jb(){var a=0,b=0,c=0;a:{a=Ea(1,256);if(a){H[a>>2]=1;H[a+208>>2]=1;F[a+212|0]=I[a+212|0]|6;b=Ea(1,5644);H[a+12>>2]=b;if(!b){break a}b=Ea(1,1e3);H[a+16>>2]=b;if(!b){break a}H[a+48>>2]=0;H[a+52>>2]=0;H[a+44>>2]=-1;H[a+20>>2]=1e3;b:{c=Ea(1,48);if(c){H[c+24>>2]=0;H[c+32>>2]=100;b=Ea(100,24);H[c+28>>2]=b;if(b){break b}Ca(c)}H[a+224>>2]=0;break a}H[c+40>>2]=0;H[a+224>>2]=c;b=qb();H[a+220>>2]=b;if(!b){break a}b=qb();H[a+216>>2]=b;if(!b){break a}c:{if(!xc(1419)){break c}}b=jc();H[a+236>>2]=b;if(!b){b=jc();H[a+236>>2]=b;if(!b){break a}}}else{a=0}return a}wb(a);return 0}function tb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;g=na-240|0;na=g;H[g+236>>2]=c;H[g+232>>2]=b;H[g>>2]=a;l=!e;a:{b:{c:{d:{if((b|0)!=1){h=a;i=1;break d}h=a;i=1;if(c){break d}e=a;break c}while(1){j=(d<<2)+f|0;e=h-H[j>>2]|0;if((Ic(e,a)|0)<=0){e=h;break c}k=l^-1;l=1;e:{if(!((k|(d|0)<2)&1)){j=H[j-8>>2];k=h-8|0;if((Ic(k,e)|0)>=0){break e}if((Ic(k-j|0,e)|0)>=0){break e}}H[(i<<2)+g>>2]=e;b=wc(b,c);ub(g+232|0,b);i=i+1|0;d=b+d|0;h=e;c=H[g+236>>2];b=H[g+232>>2];if(c|(b|0)!=1){continue}break b}break}e=h;break b}if(!l){break a}}vc(g,i);Bb(e,d,f)}na=g+240|0}function me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ba(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Da(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ba(d,1,14067,0);break a}c=1;b=b+f|0;Da(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Lc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ba(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ba(d,1,4669,0)}na=e+16|0;return c|0}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;f=na-32|0;na=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ba(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ba(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ba(b,1,2897,0);e=0}na=f+32|0;return e}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=na-16|0;na=f;e=H[a+120>>2];a:{if(!e){Ba(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ba(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ba(d,1,8803,0);c=0;break a}g=Fa(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Da(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Da(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Da(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}na=f+16|0;return c|0}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ba(d,1,4617,0);break a}Da(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ba(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Da(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ba(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}na=e+16|0;return f|0}function tc(a,b,c,d,e){var f=0,g=0;f=na-208|0;na=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];if((sc(0,b,f+200|0,f+80|0,c,d,e)|0)>=0){c=H[a>>2];H[a>>2]=c&-33;a:{b:{c:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=H[a+44>>2];H[a+44>>2]=f;break c}if(H[a+16>>2]){break b}}if(Db(a)){break a}}sc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(g){ra[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=g;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|c&32}na=f+208|0}function je(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ba(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Da(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ba(d,1,7712,e);a=0;break a}if(!Kc(a,c,b+g|0,e+12|0,d)){Ba(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ba(d,1,4695,0);a=0;break a}Ba(d,1,4695,0);a=0}na=e+16|0;return a|0}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(ra[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ba(a,b,c,d){var e=0,f=0;e=na-528|0;na=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=na-160|0;na=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=105;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;tc(a,c,d,103,104);na=a+160|0;F[e+511|0]=0;ra[b|0](e,f)}na=e+528|0}function fc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}c=b&3;a=H[a+12>>2];if(b>>>0>=4){d=b&-4;b=0;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;b=b+4|0;if((d|0)!=(b|0)){continue}break}if(!c){break a}}b=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}}}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ba(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Da(b,a+56|0,4);Da(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Ea(e,4);H[a+68>>2]=c;if(!c){Ba(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Da(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ba(d,1,5955,0);return 0}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;H[e+12>>2]=c;a:{if(!(!Kc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;b=1;d=c;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ba(d,1,4591,0)}na=e+16|0;return f|0}function dc(a,b,c,d){var e=0,f=0,g=0;f=na-128|0;na=f;e=f;b=H[b+12>>2]+(c<<4)|0;c=H[b>>2];if(c){while(1){H[e>>2]=b;e=e+4|0;b=c;c=H[c>>2];if(c){continue}break}}while(1){c=H[b+8>>2];if((g|0)>(c|0)){H[b+8>>2]=g;c=g}a:{if((c|0)>=(d|0)){break a}while(1){if(H[b+4>>2]<=(c|0)){break a}b:{if(Ra(a,1)){H[b+4>>2]=c;break b}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((e|0)!=(f|0)){e=e-4|0;b=H[e>>2];g=c;continue}break}na=f+128|0;return H[b+4>>2]<(d|0)}function Ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!Wa(H[a+8>>2],54,c)){break a}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];b:{if(d){e=1;c:{if((d|0)!=1){j=d&1;d=d&-2;while(1){g=0;d:{if(!e){break d}g=0;if(!(ra[H[f>>2]](a,b,c)|0)){break d}g=(ra[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;i=i+2|0;if((d|0)!=(i|0)){continue}break}if(!j){break c}}if(!e){e=0;break c}e=(ra[H[f>>2]](a,b,c)|0)!=0}Pa(h);if(!e){break a}break b}Pa(h)}k=1}return k|0}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ba(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Da(b,e+12|0,f);a=1;b=b+f|0;Da(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14923,e);a=0;break a}Da(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}na=e+16|0;return a|0}function qe(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26400|0;H[b+26404>>2]=c;H[b+26408>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}zc(48);a=na-16|0;na=a;a:{if(la(a+12|0,a+8|0)|0){break a}b=vb((H[a+12>>2]<<2)+4|0);H[6860]=b;if(!b){break a}b=vb(H[a+8>>2]);if(b){c=H[6860];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(ka(c|0,b|0)|0)){break a}}H[6860]=0}na=a+16|0;H[6875]=8192;H[6873]=94240;H[6867]=42;H[6874]=65536}function ye(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0}else{d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0}else{c=b>>>d|0;a=((1<>>d}a=a|g;qa=c|f;return a} +function eb(a,b,c){var d=0;if(!H[a+12>>2]){ra[b|0](c,H[a+36>>2]);return}d=Fa(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Fa(8);if(!b){Ca(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Ca(b)}}function Mc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ba(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function Ac(a,b,c){var d=0,e=0,f=0;a:{d=H[c+16>>2];if(!d){if(Db(c)){break a}d=H[c+16>>2]}e=H[c+20>>2];if(d-e>>>0>>0){ra[H[c+36>>2]](c,a,b)|0;return}b:{c:{if(!b|H[c+80>>2]<0){break c}d=b;while(1){f=a+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}if(ra[H[c+36>>2]](c,a,d)>>>0>>0){break a}b=b-d|0;e=H[c+20>>2];break b}f=a}ab(e,f,b);H[c+20>>2]=H[c+20>>2]+b}}function Bc(a){var b=0,c=0;b=H[a+76>>2];if(!((b|0)>=0&(!b|H[6867]!=(b&1073741823)))){a:{if(H[a+80>>2]==10){break a}b=H[a+20>>2];if((b|0)==H[a+16>>2]){break a}H[a+20>>2]=b+1;F[b|0]=10;return}Cc(a);return}b=a+76|0;c=H[b>>2];H[b>>2]=c?c:1073741823;b:{c:{if(H[a+80>>2]==10){break c}c=H[a+20>>2];if((c|0)==H[a+16>>2]){break c}H[a+20>>2]=c+1;F[c|0]=10;break b}Cc(a)}H[b>>2]=0}function Ka(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);j=i*1.402;if(P(j)<2147483647){e=~~j}else{e=-2147483648}e=e+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);i=j*.344+i*.714;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=c-a|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;i=j*1.772;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=a+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function yb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Ca(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Ca(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Ca(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(a)}}function dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){ab(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){ab(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Fa(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Ca(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function Yb(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Ra(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=na-16|0;na=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ba(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ba(d,1,14510,0);break a}c=0;while(1){e=1;Da(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}na=f+16|0;return e|0}function Da(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}if(!d){break a}}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;a:{if(!c){Ba(d,1,4106,0);a=0;break a}Da(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Da(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ba(d,1,4106,0);a=0}na=e+16|0;return a|0}function bc(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function Bb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=na-240|0;na=f;H[f>>2]=a;g=1;a:{if((b|0)<2){break a}d=a;while(1){d=d-8|0;h=b-2|0;e=d-H[(h<<2)+c>>2]|0;if((Ic(a,e)|0)>=0){if((Ic(a,d)|0)>=0){break a}}i=e;e=(Ic(e,d)|0)>=0;d=e?i:d;H[(g<<2)+f>>2]=d;g=g+1|0;b=e?b-1|0:h;if((b|0)>1){continue}break}}vc(f,g);na=f+240|0}function vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=na-256|0;na=f;if((b|0)>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;ab(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;ab(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}na=f+256|0}function Wc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Ca(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Xc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Ca(c);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}Ca(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function ad(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Ca(H[a>>2]);Ca(a)}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a:{if(H[a+100>>2]){Ba(d,1,11302,0);a=0;break a}if((c|0)!=4){Ba(d,1,5991,0);a=0;break a}Da(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ba(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}na=e+16|0;return a|0}function Wa(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ha(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Ca(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ba(c,1,6123,0);return 0}function $a(a,b,c){var d=0,e=0,f=0,g=0;if((b|0)==1|b>>>0>1){while(1){d=a;e=b;c=c-1|0;a=ve(a,b,10,0);b=qa;f=c,g=re(a,b,246)+d|48,F[f|0]=g;if(e>>>0>9){continue}break}}if(a|b){while(1){c=c-1|0;b=(a>>>0)/10|0;F[c|0]=N(b,246)+a|48;d=a>>>0>9;a=b;if(d){continue}break}}return c}function Cc(a){var b=0,c=0,d=0;c=na-16|0;na=c;F[c+15|0]=10;b=H[a+16>>2];a:{if(!b){if(Db(a)){break a}b=H[a+16>>2]}d=b;b=H[a+20>>2];if(!((d|0)==(b|0)|H[a+80>>2]==10)){H[a+20>>2]=b+1;F[b|0]=10;break a}if((ra[H[a+36>>2]](a,c+15|0,1)|0)!=1){break a}}na=c+16|0}function rc(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c} +function pc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=pc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=0,g=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);e=L[d+12>>2];if(O(P(e))>2]=f;b=b+4|0;a=a+4|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function Ua(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Ca(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Ca(b)}b=H[a+28>>2];if(b){Ca(b)}Ca(a)}}function Pd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);e=M[d+8>>3];if(P(e)<2147483647){f=~~e}else{f=-2147483648}H[b>>2]=f;b=b+4|0;a=a+8|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){qa=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;qa=c?b:a;return d|0}function ue(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=ve(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;qa=(g^qa)-((a>>>0>>0)+g|0)|0;return b}function Va(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Ca(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Ca(H[a+24>>2]);Ca(a)}}function cc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function bb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=ra[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Na(a,b,c,d,e){var f=0;f=na-256|0;na=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;Dc(f,b,c?d:256);if(!c){while(1){La(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}La(a,f,d)}na=f+256|0}function re(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;qa=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Db(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function hc(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function sd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function Ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);L[b>>2]=L[d+12>>2];b=b+4|0;a=a+4|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);L[b>>2]=M[d+8>>3];b=b+4|0;a=a+8|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function bd(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){$b(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function Ic(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a=yc(ea(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);na=e+16|0;qa=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function mc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);L[b>>2]=K[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function lc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);H[b>>2]=H[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function Kb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Qa(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){qa=0;return 0}d=H[a+56>>2];b=c-d|0;qa=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function kc(a,b){var c=0;c=na-16|0;na=c;if(a){if(b&3){a=28}else{a=gb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}na=c+16|0;return a}function Yc(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Ca(b);H[a+120>>2]=0}Ca(H[a+148>>2]);Ca(a)}} +function sb(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=H[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=H[c>>2];H[a>>2]=d<>2]=c<>>32-b}function ub(a,b){var c=0,d=0;c=H[a+4>>2];a:{if(b>>>0<=31){d=H[a>>2];break a}b=b-32|0;d=c;c=0}H[a+4>>2]=c>>>b;H[a>>2]=c<<32-b|d>>>b}function ae(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ba(d,1,4464,0);a=0}else{a=1}return a|0}function jc(){var a=0,b=0;a=Ea(1,44);a:{if(a){H[a+16>>2]=0;b=Ea(1,8);H[a+36>>2]=b;if(b){break a}Ca(a)}a=0}return a}function Pb(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function qb(){var a=0,b=0;a=Ea(1,12);if(a){H[a+4>>2]=10;b=Ea(10,4);H[a+8>>2]=b;if(b){return a}Ca(a)}return 0}function Id(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;D()}function fb(a){var b=0;if(a){b=H[a+4>>2];if(b){ra[b|0](H[a>>2])}Ca(H[a+32>>2]);H[a+32>>2]=0;Ca(a)}}function Ob(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function pd(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ba(d,1,4375,0);a=0}return a|0}function oc(a,b){if(!((b&-128)==57216|b>>>0<=127)){H[6597]=25;return-1}F[a|0]=b;return 1}function kb(a){H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}function Uc(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Sa(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Nc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function hb(a){if(a){ra[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Ca(a)}}function Nd(a,b){a=a|0;b=b|0;Pb(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Ea(a,b){if(!a|!b){a=0}else{b=N(a,b);a=gb(8,b);if(a){Dc(a,0,b)}}return a}function Ga(a,b,c){var d=0;d=na-16|0;na=d;H[d+12>>2]=c;tc(a,b,c,0,0);na=d+16|0}function xe(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function _a(a){var b=0;if(a){b=H[a+12>>2];if(b){Ca(b);H[a+12>>2]=0}Ca(a)}}function Rc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;D()}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Lb(H[a>>2],b,c,d)|0}function Hd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;D()}function wc(a,b){a=uc(a-1|0);if(!a){a=uc(b);a=a?a|32:0}return a}function Qb(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;return Mc(H[a>>2],b,c)|0}function uc(a){var b=0,c=0,d=0;return b=te(a),c=0,d=a,d?b:c}function pb(a){var b=0;if(a){b=H[a+8>>2];if(b){Ca(b)}Ca(a)}}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qa=0;return 0}function Za(a,b,c,d,e,f,g,h){return ac(a,b,c,d,e,f,g,h,0)}function Oc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;D()}function nc(a,b,c,d){return ra[H[a+44>>2]](a,b,c,d)|0}function Xa(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;Ib(H[a>>2],b,c)}function te(a){if(a){return 31-Q(a-1^a)|0}return 32}function rb(a,b,c){return ra[H[a+40>>2]](a,b,0,c)|0}function _d(a,b,c){a=a|0;b=b|0;c=c|0;qa=-1;return-1}function Oa(a,b,c,d,e,f,g,h){ac(a,b,c,d,e,f,g,h,1)}function yc(a){if(!a){return 0}H[6597]=a;return-1}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,2)}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,4)}function Sd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,2)}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,4)}function we(a,b,c){se(a,0,b,c);qa=pa;return oa}function La(a,b,c){if(!(I[a|0]&32)){Ac(b,c,a)}}function ie(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function ve(a,b,c,d){a=se(a,b,c,d);return a}function Fa(a){if(!a){return 0}return vb(a)}function Md(a,b){a=a|0;b=b|0;Ob(H[a>>2],b)}function Dc(a,b,c){if(c){y(a,b<<24>>24,c)}}function ic(a){return H[a+8>>2]-H[a>>2]|0}function hd(a){a=a|0;ia();ha(a+128|0);D()}function vb(a){a=a|0;return gb(8,a)|0}function md(a,b){a=a|0;b=b|0;_(a|0)}function ld(a,b){a=a|0;b=b|0;Y(a|0)}function Ab(a){return H[a+28>>2]!=2}function ab(a,b,c){if(c){B(a,b,c)}}function Vc(a,b){a=a|0;b=b|0;D()}function ob(a){return kc(a,32)}function Ia(a){return kc(a,16)}function id(a){a=a|0;ja();D()}function Eb(){return Ea(1,36)}function Sb(a,b){a=a|0;b=b|0}function db(a){if(a){Ca(a)}}function Qc(a){a=a|0;D()}function Pa(a){H[a>>2]=0} +// EMSCRIPTEN_END_FUNCS +a=I;m(n);var ra=[null,Sb,ie,_d,Jc,Jc,bb,Ed,ud,od,bd,ad,$c,_c,Zc,Yc,Xc,Wc,Nb,Uc,Tc,Sc,Pc,Ic,pe,oe,ne,me,le,ke,je,he,ge,fe,ee,de,ce,be,ae,Fb,$d,Zd,Fb,Fb,Yd,Xd,Wd,Vd,Ud,Td,Sd,Rd,Qd,Pd,Kd,Cd,Bd,Ad,zd,yd,xd,wd,vd,td,sd,rd,qd,pd,Qc,Qc,Ib,Nb,Gb,Ob,Pb,wb,Mb,Vc,Lb,Mc,Oc,Rc,ib,cb,Qc,Qc,Fd,Ld,Od,Vc,Gd,Dd,Oc,Rc,Md,Nd,Fc,Hd,Id,Jd,Sb,md,ld,fd,ed,dd,hd,id,Qc,jd,kd,Qc,gd];function sa(){return E.byteLength>>16}function xa(ya){ya=ya|0;var ta=sa()|0;var ua=ta+ya|0;if(ta{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout,dynCall_iji,dynCall_jji,dynCall_iiji,dynCall_jiji,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["t"];_free=Module["_free"]=wasmExports["u"];_jp2_decode=Module["_jp2_decode"]=wasmExports["v"];__emscripten_timeout=wasmExports["w"];dynCall_iji=wasmExports["dynCall_iji"];dynCall_jji=wasmExports["dynCall_jji"];dynCall_iiji=wasmExports["dynCall_iiji"];dynCall_jiji=wasmExports["dynCall_jiji"];memory=wasmMemory=wasmExports["r"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={n:__abort_js,m:__emscripten_runtime_keepalive_clear,j:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,k:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,i:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,l:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default OpenJPEG; diff --git a/web/public/vendor/pdfjs/wasm/qcms_bg.wasm b/web/public/vendor/pdfjs/wasm/qcms_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..fccd641fef6ae956dc1d13c0c173a3f0be5303fa GIT binary patch literal 88837 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 N6>D>WM~%S4OaPKBm>mEB literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/wasm/quickjs-eval.js b/web/public/vendor/pdfjs/wasm/quickjs-eval.js new file mode 100644 index 00000000..ab9ae8b5 --- /dev/null +++ b/web/public/vendor/pdfjs/wasm/quickjs-eval.js @@ -0,0 +1,16 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function QuickJS(moduleArg={}){var moduleRtn;var e=moduleArg,aa=import.meta.url,h="",m;try{h=(new URL(".",aa)).href}catch{}m=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);};var q=console.error.bind(console),r,t=!1,u,v,w,x=!1;function y(){var a=z.buffer;A=new Int8Array(a);new Int16Array(a);B=new Uint8Array(a);new Uint16Array(a);C=new Int32Array(a);D=new Uint32Array(a);new Float32Array(a);new Float64Array(a);new BigInt64Array(a);new BigUint64Array(a)} +function E(a){e.onAbort?.(a);a=`Aborted(${a})`;q(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");w?.(a);throw a;}var F;async function ba(a){if(!r)try{var b=await m(a);return new Uint8Array(b)}catch{}if(a==F&&r)a=new Uint8Array(r);else throw"both async and sync fetching of the wasm failed";return a}async function ca(a,b){try{var c=await ba(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),E(d)}} +async function da(a){var b=F;if(!r)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return ca(b,a)}class G{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var C,A,D,B,H=a=>{for(;0{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||"unwind"==a))throw a;},O=a=>{u=a;K||0{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||0{var d=B;if(0=f){if(b>= +c)break;d[b++]=f}else if(2047>=f){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(65535>=f){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>= +d?(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(null!==k&&void 0!==k&&0!==k){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l{a=Q(a);b=null!==b?JSON.parse(Q(b)):[];try{const d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for("function"==typeof e.preInit&&(e.preInit=[e.preInit]);0{var g=!c||c.every(f=>"number"===f||"boolean"===f);return"string"!==b&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)}; +e.stringToNewUTF8=T; +var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=-9007199254740992>a||9007199254740992>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); +var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=60*Math.max(f,g);C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${0<=p?"-":"+"}${String(Math.floor(l/ +60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);gDate.now(),j:a=>{var b=B.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,d)/65536))-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g= +1;break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;0!==d?window.alert(c):window.console.error(c)},k:O},Z; +Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return a((await da(b)).instance)}()); +(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for("function"==typeof e.preRun&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b}); +;return moduleRtn}export default QuickJS; diff --git a/web/public/vendor/pdfjs/wasm/quickjs-eval.wasm b/web/public/vendor/pdfjs/wasm/quickjs-eval.wasm new file mode 100644 index 0000000000000000000000000000000000000000..b5fe551aa0d84af604026c015c370daa6cd148cb GIT binary patch literal 432499 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

    |aN7ms#X>WtJIvgm^ZY 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�lm;tS3Lpe^q#Amg?C!MAGRvlDc1`DO4WoFrQd8sA~oVA{i^ z#0Co)kWHZNTHxS;Tt303z+%k^y1j-ObTkU+%vsP)87$zF@&qJ7If@115y&zqM+WdZ zLhzAdHh!QrSD@3gI6+qrfUN>4hQv464#=GwETF>}7?iji|1lPVY++I01RauIlBL86 zD%F?@6}TM#FcuamaY1Cc9Dgwug6_;=aAZLi{RR`|fQf?iEAoKi7~}~S1ujRvLIobj z4~&IH5Th7C=f$%?JOT;^MK;Lr4>PE7JA+w)!&Q+9bom(QmYgEc!SRkvRty;m%%HL+ z1zPIaD6lJVI5N1KFTNS= zFsV2)`Loo6isCHC`eH}MLRLpcZg5$z!DIo-tV|&Npt11F3<9p8w7&qfqKd(T7j*nG zNRGpCRlOT8$o%)9#K#SC5@=PvzThAN5E2!hZqDTKqUZ+BUZKCj*Q#_?-&(0 zSU~3?Fl#W)VYXsO0rfAL1>UhhFN_COs0>gge4x2}&;!JxpWz^K5jz$>tyLy-^Exa0uM8G%OhVX6gqVbw86AG;&u;s`$O z9s*ncx;AWR3~kKm(l+0cxOe zfooq)W(6fKCxs3ro&Z+`p5>05S&o99plg;OeK>nwW>C`})UDxkWD?lN1Uj(7LV*)> zh0Sl!iQ2VJb)e1zsE-5Ma$=Dsu$D!U3vzlHbZa_NO9iyOl0|__Al8)^)R+U!)Y+knFSo#!NXzfe$t?eZ$O7tLpI!jJg>kC8UP0syr7$h zKy`A75_=Zp+!z)G7Hwt=C62vLjBVhq#sB~R^CLiet`(WMp~r*$s0Z~F-FaE1Kofcb z)4}Hguz(I~;+Sg*UXjGg%K$QmL5TyZg@GZ>RRP9{bO0Uo2?{Hy$cDKN3oMx#KvB;K zJIGRCHOo$(;t#185B4{`|!XnI`IGh|ND-qU^eKuvj+#$K$jCLaO{Q55_0TSVpQPx!=%Kt zeJ|+V7ADYfIpB&AbXYH#0bAV9fqL{LsQC&cejR!otGB%)kJmSlAgMXNMmFZ6#p@Z6$$>)84Qh0OszYXh-Jr`%LETQrg9kzGHUh0%VQ^fn0p1A=2^4|ptcr}F><&t9 zi~@78Oy)E4FoRdrfcvwKS3tUj-~|^WXrLRqJ{EkTF@q+kp$aO19GM;K1)7+-E5W0R z;FJa}79hvGLE{}P0U8?vCu#5`9!NLT?=T&(MYG@yqFC=QXOvQ4Tn-v30hJ8Q0X3)V`ppu!@={u;T1=-8G+>sr02qq*! z@;8I`Uo+K!I_Ka?B@-<(5qj;V=c_T#^O4d0C0r@n(I(tab$N>;sJF%G?^Jt2O}W) zRe@DN8C4vl8PuF(bOhba#|*lC6O;!WnH(7vc%+q>KnHvK?IL|{r0l^(6*MCVzGVco>qLQ5f!7goZwRDFgeD8n89xVoso^oUVdIxfpv`sQAwvyN zW3xn`@xgjVSRR9z1If2s=wpYVCAVCTi~_$vDW3~;Yn~r3sLupi6~F;LIcT{ar~qRW@aIQqk|jX0 zh61RvWDwAYRF?t@+|CT(s+&>Z4s^taS(iZobbl+8BZF5FY`2R7vp$0$=sG^|QZvU# zhzof@Q_}O9K!e~|H`E{wA_LW4AeUJ{i&jVl3-<}ABzBz7D4+%^BtiQ;%wcCg6f{E% zNl?CooLm7avp@%gh@dw#z^3TK3}F;7=Z33*7E9o=0Mw6x7pI^Lx}YQ56Y4?1!?Ik1 z33j|RxZ4LQMIe%(r6VYk42}o8LH*~M?Ti8|7(sOxsCU6A@Dpjyo`V4#Z3f(t;5Y<# z!a<9TK>Ie&FoV_`fP}!qj0}#9*`W0@U=E8TM>eQ^$SAN1+-zk4MKXg16N>^<7U+ap z&}z?Pto+=L4BToA;JXmP+Hjh|&8-UEQo0{Bec7JCuV_E=O zF$2;u12kXEXvQ=Ll)ITBI#?i%0VO{x&~9EPM-|Yh2$Q3#8Iy_vlcO4F8WHRS9|a~y zbnCh&2O z?2x-fzvCD3Kd4sVjV_Z2GF385J;zlBU1^8 zmH`!7jwV@aYZQeP#6U~##kds&oS1491r!u(6crUj6eMdDB^3k}L~9fU6<8h5FoK-T z>Ue@NOOcb=L4gxw3Ik-XuAtKeMvy9I4JHnjIt4+{iZ32VmXfs~L6D)W3Ia}yHQb5< zAQ=%B2QXJrz!5a9$gII6p~MAVs>P_l;sNTefmJCmI*R0EffjUdfEILUFtI3sPln*o zWCoq`_kbl!pqUYB5J-arD4#Kcsvl6k;8qY+;Bpkn0XcyiB(1>W0CAX#BNNPFj5Ue^ zU`ZXAqyfU!P)SW@8%Pu?F@o%4)?{{3fUrQz@*q~RBA9HB7Z|b>Ih`03g`F4_MVuHE zMHSc_uP|gOae+_sM+!Dj{s6VqAeTit@)z zWG+!)$pVELvj&q4Xv9&2$pkJ4a+f{>rxGLRo_AjG+Cm;sQeseG&}8mlRbVz@5~wj} z?qKC+s&@nx;SC&xuDlFVp#HK3lLshwu{erkfv)5Q72Yf$t8KCzML{Br+)7}lJ1Bvc zH-HYCW6)%t!0NIF`Dj2cX!@l9~z246Af>>wrbbapK^oM&10^?UXiDV<-Q^6P)P`g_1tHKlCpcGvTn4fNnk%^#ghAO- z7?Mn|k)U2-wmu_+BU3h?A_F%gBO@aNHzPObY!YsEHVzJMWB`hE8IXZ83e1kopzBE; zK~ct|AOaE;0Y#9ED=!Z$ODZU_z|xgJFArE2Z@N-YgkJca6725VR4kmQe*}B6g24qDkj+#7(pwc zKv4*3h$2h@B|m7Sg32&O0R=$?Q08%z0F|ABph;$M3C7~e%MLoi7|CQ^2393@1x9ah zBNtbu1Wg3N!h?OS6LXt_V2u+;jiMmvC>D^(5T__H3Y-SdyvQhkSfEiakfai$D=#bf zekzDEP-Yi&k^pH3jaqq9Eub11gIdHJCU+Eo_KSK!ezz(i!Y0MiV9mkTxc6 z1#l@X0oq+rqX?cgg(z1LRbW|LqbRB%2)@D`TC&26KG4NPpjzk+qY?{f>JWUU8Y{B{ zXx|EGfR{~!=?mzZ2hg3UpgA?rWfV%F`V)7(#OSC2%CeB00uCs|sR^Ly16ij7+K367 z-Sd(LRj1&?__IJoyrKk1S_6Er1fv2w)Cr)bCgl1hC00j9@W`qJC=szJv4XCnUR3@uB5R*K^-EmvQtTO zfr9W(CG`agVmpC@?yLTNHfYOb*JE zEfX1)SU@4jAjr%BK9-wBfgQx>5oBdh;sK3_f-VAWn8*ma%gT(Y0~8`GW=strnn!^p z+l;9Nv=sC~JIH$tVDC9Hf)-HlLCgWK_l9LoP{4xjLUsJq&giJ9z$DPX#tli)jtq`3 z82@lHfSVj#pf&l7pr~Yo*P5WZ2GYi|1eF<}0#OMxjbZ684JtuEY^326Mo@a?0;MI# zwe5_KLSU;vYhoU-fD#u9Q<2qP%G93XrAK@GtLEa1x{Tof2#M~)VnF};9V@dQM(m@z#- zSoHv66>=akXfPdNgSvG0K?XCX8&H>C0cmG6W4eIQegUE#RCR!ssr!H$$Dre&LAxp) zC%gu=-4z(Y37)wSbafDDtVe?>z>y2oV`S1`5&>-`(qIw*bHR=PEgN8T1kH|u=6aX} zc7f|zaDNzNI_T&JW(7uRGbSIHr9_$r8g>@g#R59nipfU`G&Eqw>{v8V3I~H3q?*MVQ*P1i0 z0O{WI0n{r1>AunlN}3CpvjnDq7#wCy9Uzs0=FANsTELw72WX%`O+m1Br-H!F#g@zy zKn9!z8Snwr{rCko-~$uL0B!|lu>BI|%nv}iBz7ujEVg8R0b(<+F=xI3I{D;)u^H0^ zkk0jBofnuOI#mL|iC96&ocRDqz0ytv&Bd0?CqQf!bLJf&t!qrom^Og4ZUmPX8=zW+ zp<0#AnHPYREALcLUu?;|0>lgS6$`Rf%XwMGAf9Gl{j|jn}OCaD~Omgd%z8H$OaYe3<{#4omUJBqE5_h zpv~V53Zgp|L_i74LV>|?u>qvFxdm*u0>piiQ1>ZR_NP?CqGB{o~0F4JQIf4TY zjxu5-5=}D=?ZdS#W~~2N*$%fJ{J> zK9Fv$8;b+DBg+WB%7ICPDM4TrXh>ldBWUWIM}b!W!~zWgWT`N4+e3#Az(X0}nQ73S zkD!@p9Z-7=w9ErEUHqGyM5fD`jLhnK!eqg;X3qvP@tVI(4m_E z$e1%|mw+Gx12_0oEYzc{K-0%Eu$@aX7)MsAgXgfo)0|*-5 z0iTftDj*T=gZdY=;+6?C+YUMf88lf3@-4H#IcCsSI|k7FDQM&n(+L&OEpT8*fcqSv zh27vI$Y7^RfoeNu1y(okIyz8s4eE)3HmpGd2sIQy>y>fs4r2yYd(7ZAF!z4Y<}l>Y zaumn{Etdi*0k5aw0JoW#71%%(EodxAff-WUf=VgKz9UdbXfQE=OFTw_7Em`BJX9?M z8mt6$0R&{YK^ycydo@9WQ-TZ((A(-+Kvj_dsK#XxWMBYsK&F6G3glWp&<&-aHUHq9 zA)w8Dpv^9zbu3VGxVfbfkq1i7klrbD=UWgXGxDKkkQp_|)rbsAETF{B0$Tb7&OS~I z=Ah+>44{LWp~v61U`Yc@k-`gPA2VpL94n~vA^_bh2W~ontWp5G7wjtzMHa}-E^Lm9 zpd*DrtN58zKn)LY)yS;N0P6jM!r=z^E==$!-2-sPm;>w=P`?@6#D`9%fOgY?ECtE3 zfhK}Lo649$27m&Rn_CkUDxj0;l$cDJRKPiMLOs|&Apa>K1i;4xfKnYIDWhdI?hH^U zg3JO92|}|5lP-gxD|nq6sA&LNtOtrb9)D1x01a<~&%4rKViCwwK(x{!84q!!8HA6> zU^&oC0CpWTLqU$`;|CQW;I+qyyaDR7fsfe&t>a?#2Q32ub!H*6QP4aAUC9DH%njxg z(8*ccS=cNCZ;Aw421$dUQ4VHMN1nxz0UEuaxPp6=3DiZ0lrBu5Za-)YAJk9*opg?f zjCxQ2Ldp%$_8M5Rh2}W$UJdN-hV)UP{Zj>INbeLJ#5iLO=2u2;Zth5s{b&&g-m=Ic z0J^+aA`3j~0nTs&ekd^r@fvyzB4VtFkp+~&K!-ajfD!>{*&R4DXn^Y$_<%9!DtXW- zq$@9I(>XNOG?>6^^*~3OK|5h=;39+#oZ`7*J^;lQXgnSw%3TBU45(t!V1io$nfWhh z0hKe5h=XKu6(tt%;28AoFOY>W?=gY80~$;W0>?qk2gWSec2!V5LQbIy%n-v9K!$S* z!9o#KOfd+2V&vwQ0||i^U15znZb?uD06HrTbRw0E0(6|;oLPa}1yY-U!=6P0blyH_ zY=8yaXN4v!94Q46AKY$`(14WDpwI`Ejm#QM8pI?~gg;Xmnd%`2x3Q}*fX>+f?S0|^ zRc4@JA&?h9yE7G-1g3+>kl8huct9%+H2gtVO@mgw3H)V(oiYH~bOGK*-q65NB#^+Z z068U;`!ncLMaDXCk;eo+j9-CqIVk8*Cg~>BgI6+vyCUp`O6&^U%RyaG79~!okUwaW z-H}CsP2dl>G-PvZIKWT{z9bJ)azJLXAm%VH2QB|*QR0GXc4Pz`w5x^PnCRdm*?ohRq;(fR07oHcCzK)!Q$1+)9cZi=v=g1NBnuh> z%nB@!5MWkdbOgpur@ez*GoYatg`riVUCyUkVJa;5-Trc~FlEbYv!IUJHEFG)p$p&NgyRp=PmOX<8yFl1W8nkNyJiwf#2)enASpjm`DEQvO5+$xI1r`M^&=8H&dMgXy^-E@PeB5HsAy6IKlM_WJ8#=0=ELYz(!Ej23iFQ8uRAVWaa>i%5p34 zsDPICf>%x}@ntFSD)3=i0y<)p735{m$==Yw12tC}mqT`=f@@sxZdA~MHgG;-*JWS< z-2~$WT00CnjKC3;0zsj}2?|nZhMV(9k@Cpdf=HBWRfr_ggk5&U!}B z1gJw6Xr~^u#MD&eR^ZTO&`<>3C&&PbS02ztF3@gO9`O908PgO-P}!*f8lVIVDm(6%52kZV;y3%5Z9H$JSu z&Bx2l#K6eF$j$*e5*>6PIw*1RLe@eUC^9KPgMs^VS=V{IkFJOgZ30MfR4<7+r)C!I0n*ge|az)-9mLG2j~$Ig}V2nLt<4vnwzvFbF(nQUtA)1s}%` z3R+Nzvj{SQ0tmLBxemI947MJRAJ2L`MjmEJ6^^m$7{4wiP}5+pB4}eOR6n?j3_fc{ z0Gv_SAXn-!a-U;lVuYOM16yzGIO7$lH66gq;5Y?539kTJ(q$p=kx`KuCc>z|C}83E z@h5}8d1fUR#|2<@0$-U}9AGL~1bAUgX2>dM@JR)rqkNe`NBKgGhS~+mO^!?oOaih9 zOTb+sxGA8G!2-Mr%m~Y*kSqX=t$>yuausQVU_^;UX3!EUer`}SDS)Gmkz0`wbcc-w6KIN>5u^deWC;cJ`Gd2$?=V4Hy^v#1 zA#n@ZXAB-_(PcwvhtpAXI_> z;PDI*&;+Ij(j{SFQ3)kxM;1p@M+SjCpouS7ZN?6oc44jq-NNJs)ndR3+BK)Z3hkkQ zI#(%5Y#^sp6oN<%P-}?I@jqiBxYlMCXn`I|3>wDf$WmexXa?K(iY95hnJ0m%x?D82@l*`O^DpgtvN$tkFI1GjMy z9SH>{$b~VC+|L-9SnC<<9rzG#P}h{5iMfuko`JiQ5q#+!Xq*6+l)%kfCPyZB7Et_x#tM{JvXt0O znOK|@+8~NR>k%0oH-L_0fSp4CSxjcY4O*V3zyfMaL6^5d-M$=c5{n&lo+fCw7Pu1& za*`h-QypYrl|evFk=cqJpBO!LtqkUFEXPehZ`^Sq6p|f z9O&Kz1!i3a4iLeqz^uo}CQu1#Dl34F_XaNo;Q*yl9szj;7VdeVQl1gCHA)~`iBW|C zl!d`7DHIq%tK69tm;~N4fjae|79MERsK7f&ygpz6HR%~a$3cKbULF54fSN=MpmLK# z1C&!ivwqP_#iq^ z)Izg5tWtug;J(ZPFBicF>p7! z1!E5w6hTu;pnX09?VvIVG)M<3Q$VNTf=;j$$O0`75NHF*fe(HMwP!&cJtYQLUQnZi z0d!Q%|NsBl3(c5P6u?IXLGPUgC7KjaaaaH@6cs@6&8)#Rfl-kev>)67GypyWZNrNJ zIJ&_58z3hDfEHMRQn2F!M)0wJOyEx!U#I|6B3=^IUUXf2hyalW51YZ<<+%MlC>g*C zGSIP+kRyl`n7HS%FtQ;HF+p#$1aI7D03~WR4WdDj%2MJ4S2Db8;4Pgj3ZPwaT%bjqED9W1jto`| zpo9fAn3vg+Ns$$lszLK&jE;KX+vi!iK|Cf$eRp2S&R|zwR!}`G(8H<(TJ{67QCf)+ zv^5xf@du+W1EUhFBiNm+yr9;!0;4VilPfPPHz=SKSiG~r_Bt|ymN_sfu!4pdL8UV& zv_N|lHJA=CDzFH0GjJ<0@iKvy->~R1Fo3Ex76nenp1%wN-KpC=1EjxI2r5j3F*8jDw81am;k zOF{LT1{3JyXV7ViD&Qi?6XZwlZ0;y5yPC;AY;1mlIgf%)r;^2lSxCsiX z{2)!uOUO-4DUd4AP!zKOFE`|!XC zj6s3XQ4@MxAvo`VkD3IPyA04;9h#XyMH6`7m2Ej>$^(8sEogBKXzBxg$tZYXxIhSa zzn=oDqfC|(=(wF*jJzxg%%I?BcGSq?Rs^4Q!K1_s>b*07wlac8{6R-hLuyRWUZq)q&qYSHyr$NdOg_pyO2;L4F3E>IHWjs96i%LBYt)#-PBU!oUqWqMD_Sftwwa z5dJW7?_gwNs%NfIU;vGlFgs3o!;%F)n`FZqmMqY&UsmX_0Rux4Xltkf6G)I{sS=|C z%fdhG3ao$F8=M$xb}6tfQeau2#G=5s5Oh!$lLCt+X#J=Hn*fItlY`?I@EROPX-6qX zJ_QCxMmK5D_2q8TN}$#HN=%@WFIXHL|GZ`aVQ}HBz*JHMiapS|&5leZ8cYvvv%qd| z669du=H_0($jA!5Ya#^HivVrp0nOklf!pgMpo}F0yTO^wQ(6f${lW@bk0o#kRI`Jd zZfsegDOk`%4oIg0TQ=xC02WZO!~`l{YcfYV^HZ&YyXi?yl2DkV* z6*v^QKy@e+XkHFf-8nWeDlld%aX21e0CgNe$H6#ct!-0ebz%TFFBHHF>RA;y)+({L zDX=&mU{K)5UfTgW)`>-dy$!UqnLz=1f+s6zj4b%x)tHjdL0?J1UEFFsAiz~t1Fa}Tuo&#hq2Pmu< zKqJx2;D`gAgu=O2ff*Ls|M{C+l$cSYj0qHF;PyQ%Od1+EKvBj7iZZ4eP%R3NOpaF2 z8X1^zh{ywN+Gc?CVIHn-!RyOxju$m|FIO4g}aQ&MZ{VSi=nJt!!X{T;R(C zDmryQC#mjLl5_&y(e22nDByTnK~Y43ah4L}UPVbzM6-Yv(z7^#<<2Q6g6<)8yr|%K zMgg>qtWZfnT2Vwnz*SKk6r_@{g!1D*$~A$YjYtfR3JOdL0*=gCpxcuj|NpNp6bMyd zP!LfN5C~FWa9nnd!SVDDP%BlTP>EUE@zr$($DcnK6quz!O_U^QM`o}xkRfcKn?(;W z6bpoc+9n_j8gK?V7Ig8fq9CX?1NlpV$5AIs;4UlZzR(3qj3^}^cyFo>=wO#@GbSAc zR!4;*B~izR4DP(30YU`djh6|ui&aMveET+NSX?$+i5sK^X5I$JMT(5vj%=VqO&l3K zq!qaocpMF~92bBtXy$fg@RQC`;!|V?A2P-G2YlosXlo)1XcG;i0`rcAV0WdSJ?pp# z*^Rsmpb+JD1fBe;z^%xsz^=%qz^BLo@+O}m2S|w7!BJL$Q-RY_)?XU5Ye|9KktJJ+ zO@RZnor-y_qO=o(q9o`LAkelP1_kLh1<4vEDFrE~hAFS_FgGYkIyJnRvY4l?#*PUz zGz-z|54r{#ssuFe!2vRpLqXDxiGiCLbVv!i5}POJS~QS2y9N{Z=wWUJNO&qRXDe}n z0*6hJ9W-C*1-{Z3I&sP6D4FHRnFkuP7g7*)e8%9WD9r5O$mz(Sz?ls`JAu<*8g!jB z=wLhWK|hWx;1+?jB0CQwwKCEASU8h~AOsreQeabHQ((?^WGYn<@{(3$19{a0k5Ss!Y)IdkhY|u<7IH9#9I4((2;0C3=ECpuAh7$~+X*kYYCGg&RMP9Jg%#P(b z3fx&r%#Q3n;I%LyOF?5(j*K8d4tJ3AnZP@R8I-s|6J~izLJI6TO8jmLyr9qn&C!7t zi*YOPXDfn|Cg=n#R~83w>SbVXa8?A}cm$3kcLfdwUjHIqMvzYMh7HC-(B4BAM$ow+ zV5QtpZ4d0Bj1Mrz4|@fWRnk!LANC-(I5L(gF}q1CFe`9-ODjq+IVgzpGAM|EIykzZ zk!OiniV_Npvp{Rscoq0Tk;$kau|R<_k(WUMG&RW&9&rYZg@GOD4-NrdPyxsQaw{k) z^Lm5k)pgLfAZ@)pj|cG+zNaOq(?0*7(xE?lvZQ|WhXY!(QCd+ z?5?mJ#Rkh!Ob!a5*auaMERGz7io&3b&k3552F>#`DsV|Fu_Bfen{B&}b>I0+-`o&>)KAKM<+Fr663S#4qi|%c#Jm!0*W5 zo&|EE7-)fxV|<|!JH!nNoC;!~`S$G8DPO9@Tnst|ML|&D zAEOdmwj(1XC$NF`i?cZzfX=%TRA9??WCG`91vW>fY$YKDR**PIjiaukHpo~HX^@DZ zf)J>zMOe!Onu8Prb#MgWP65qufNCse1%WIjP6ZZ}8qYw133PakV?zT=u|O!a(t>#i zRFgS!7AdlVl9~dC0-v|E5;J(RoWqm}bXem*MsTb$D}eX3vw`ni_vHnx><7733F;q+ zxHm5YxcXvMU<2hABn6;VkDyU?wrqhQ1rAU?=TPAD1;si)Xu#fa`Crhk{vd8p8RVnD zp}-Bw)}U$t<_IOI4d5JwWUvBM98|1;xB7D`a4B#(a{5UN1cB&mMK+jy-2S|vBl$SJ z6xbBGKrRKH?g_Hc1C(OHsz5e-f>sT{f`uDe=yNNugIvN5j#1FC8j=%0g%mp}!2_xU z83lr%D-OU(4^%xcAVPsbflYxM)Uf~^punoY`RFM}hG0&}(^8?@Loa8Q(Bc2JOja~FYj z6@e2vC~~>LB_}AnK*gql#KHx$z+1%>z{RG-LQp{}2yXW%u`94U%9kp!6)Ui1uZ3nE zkVd3{1}g*|E6eJrP^btxP?jlMiBEymkv|KRQ$Q-gd50ZTMS(;>1)3{pp@2`JA_q9- zLTYf(<%NHkl-L{(JOr=lQQ!t2LdU4UwjI(+Vqh?EKyD=^DsU7kfC?=ocCazoj*RZ$ zz6-0Po)rUV1e7TYni1WkH^ju2y40Bwuo%U0sZ%Ju@S^#`|7nH`z3 z6d)!lv1Nm*Lr11;1!fP>@)BlgB~}Fv1p!BW5P>e%zHJ1XUfeOmip#5}^Tn$S4 z3f$n9tAPTm0(Um(qzrIE;8WlL3xi@CtR5EIpgC@KP;7H6@HlQ@$x>lZ;N@mzP+*wL zeT$Kau?953p};UxiE%IVsPGMcpM0;(e<;Q{5aVDUmol7N`{Vd}IOU`rSk7(wblZECpY1&fiDg1V%jmLuG( z1B(RyGb%C8QhIR$_u(b~ znL+(yCeTRwCuZeUxAZQHnKQpMm3tG^?2wFzL zd&zP+txb-jMFx{1e@W4=_Z4hED|kLv9TP z^~wML|Nq?{Bnt1%t*{H>1&us_f(#VCi{Jt9!G6Kwg^NIEC4j_HgcpE>!P6oO1fH^j zX1Ex*Pk{z?!0UI23!MX4LT3jPBp?We4hQJ+Ty16sP>%vyDKR-R7dkR#^D#3rflikL zt$bq?02|264Y~tGU?<3M$OMHWNM;tqE@lM=ft^gVK%M{%kEk#xFmUrS2!IB>8W^(# zxEQ!u89?hg7BYg?<}zq7froxrK+D}h6WgrW;4}AF6xjTwl~@#*K-~`TYI6oh0nlKQ z0t={%3|@K8qrjS_z=Sla!vr1G0jmcO;DEOGF)FYqFl9r=lng)<2MR3S(n<_jph;JR zISfeVfaE|2BeXLjkNSd-8DVl{_6HRi8cZRe!Cg?R5j3(4ni2w;2U+0`8l+?dH;GuX z6krQ^m6)>E1cR1OfQGd=6qvHtgn|qLjWjIJQUZsA34Go|)$S9@20Lp<33Ji-B7~qN)fC69v zQqjNW!>hd{*?Y>_UL3IoWs zdqD@}LE1&2Wr z?r$KUFxF#~MGatwKnj=zpfgvP>J^wA|NplKbs`uP8678o{CfrBa;OgjoEIrEq67ly zh9;1@)1U!uN9Me&wN46c`xO|Mfr?fI#zmmTPm32pIiRBB`r9X07&aWTU*vK#@cF*e zE-&^k04ZX0Idsj_E8*i$`$aAaDjz02(D=81!6KJQ&l35cG5@n)uwc<%@UTn`WOA0H zX1@|>Z3v?RO z3J3Wc>MaI_M0iE>;XgmO0=pAKB=}Mg23U>Fz_1uB4oX;{GV(t|7%!7!V+E*N?xfJ6 z#Nh-AP39m__iH&16SpIntH8dTmr)9C3qQBx>2gI*c*+QHUIcQILdSA$$4C2Avy`|T zML^yD?MkdJ3<>iCgk3J%gTfBtYW`*g(3)!dLQop}&kPRfmi=!Lk zVqORdw1VdSN-Qo63<{#vr*GRYQes*Fx;;mMQGspY0?^lP1&cvvLx6&E5$Fhc zkll<5j4tz!Rb1elb=ZE9%le8w*`tML>=!I@Vfi(E=FFKl?H4Qp<#>=D7ndNr`$8W< zaeI&X^t2SW;~;gBla;2ZcwPcACx?Q-Q~L#r7A#l7C_^*nif zP#5Plf(I-ce*9+$QD8)sg2;fRBEZWU859^7fXXOn%qu~vGUjXr_T@^f;AS6#Km%y) z0+XX$nIlu75*x^S>`wL_%Zm`T8R(1#k{%?@h7M~0IIdYX_VcamkBfy2`UTRd6_|lPKh>i!%-G~Zm4=r2L$r~Xsr)aALuBc zh6aT!1r~ph$DpdArZd$ju)*^b188k*16VES<`u}@h>K?mG_Y_hGJuLY&>|Ob)y%-i z1Ug7_7Q#jc1qK)P7!hN&WefK#SO{9jg5W}}SsXm?-jLhH!1!@z|}z!v>`oK$Ei!3m1b5 zcE~>Sf8d5E$Owllq}C_cV*qj^8bJxJxmepobv(j7`t0avZ_xz{m)Qdu3S zECO|8ked3;h!SM!74-ByA<8%NmYmAh}7IQV=O(6flF$WEVpY{sOj*Sfs zk3oG0DMY}5qk9o39v3Pwz(VY&Jt%8{iY^uhgnoF?*u#7dieZNN;A)xyWCYCEJqs2r z1V<>`aiD~OoG!q+zYLpOL|u5#&5( zFy+VuI{SnHL}8c?(gQXfu7}B*kpXm_5vT#hgk-t~6V!AKCUAq85w!mRv_ydgVmeEf zB8KT8Jz&$}dO+)sL8jL!FgY?KnGU)@2ef93QIi>b+aV)pCJ$sf=pZD}I#4vzWx$K+ zuEVFpP06I)g zKwpU+tRCbD2QbS3G^-6>o(4Mqa6couV<9Khf6(DDIpF9t__@ES!>)WX6l3bYPkxjrMC z5|g7Y=nMp2M_q87=}Ln-#|+>DHC+^#py#%*I_h%^sB!;-EO=ICa5TtPVp4(K>(%0zA^alB=E^a zpghU}8vEt|O__mKC2KIT2-ty+ef0p}7XsN#uD~ha2#O{S$l*o`EUut6<%OwEM<{vlGJ&?=xsDdgBKXmkj) zfQ^Nk09q#njth)z2)c(IwDla4K@1!j1r9>ij6-7_zC0S#Gyt!DWrQE`$t?lP-k?mz zAz%aZIQK2keXPu&m5U0HSOwK6pu1=xODaJ=M9UmOEDoUP0v$KuC~0*k;@CL{rnBT)oErP)*_ZVyJrI#^hMihfA81sTF2@Q)R`f#LxJ zD>UpN3v5B#uR)_i@HMuK+@OU!kR%G~VrnvTfDhvZZ}o*54{DQvnK;d80*xAhtOjkm z0`d=Lcpp%BdUNKN)1*w80L{Oq*QeY6s22GPf6FVr0F~h4(=nfNB?v0F$u&ec; z7t_Ox0A2Bly^siEsRLC#0-#HRK+6I_l{I*1g%P^g+W_Ju(5?|_1&H?y6j-DkTURkU zw$5TyV38I`0N3Nty)puVU=0tT8~Z^MFdotneGeEwdpJOzhpmR^E`lXr14U+NT0tw` zz{`3Bl%R%!`o&--G({)`K^Ls$M-)O6y8+BHusQ>fw?T!gz%NG7%n&!X9=MgIz=+vy z0a?We>Pjdu3LF6S6+s2%L1t!Fv{5QHaJ>$iGQc}Z#fD>)3atC=sZ@8-@8Cf$P6ZA}k+Q7qpwTJN z>P997*1<74rNFYlg<;Wqy+5qaL4#7DaWsgd;R8}hjLe|k3WFm{38)L@*zkxY3$(Vm zpMqUjEhF298{0|RLIqHMpF^}Ic^zVqze z3tD;b|GvFV2xzqJsQpB3@$;dfOYOxkEJ+s>Y_x~yJK+Qy_E0&}^ndUEbM{-m@LcD} zUSoeI!0poNP0jW#R(`V|To1KpaQw%?JxSn$ect{KDSzwPHm1hESK5AiZy$T-#vI{< z!aa!%<#w~)ytluY)-F&LH(^g}eclVv$M5ZhzonZ7UFxwZX%)S^;pTh$UwuE78_sp_ zx%cg^X7+{m_K7E+CHj3&usJciRKoT6d;6J}jia9|o?z4b`PeDDeedmatD9q&&6;k* z-}y5qV(WYRKkxrelG@s5^WD8jd(xWs_7~^q7ufEzvsrZUveBEx@9nwsCUlxGXYG-` z{BM2Q?DzJ3d-b(~!lv#Cj261UIQhMO=qtaT_YDDi&KTw#*xU8qUhK=&oysRC?s=fQ za^0+^_x9^UV_rVK++Y*fxAeq}s`vIDlb5~{m2TKm9aw9#qv*Z8tru20F>*(b7_G+&M%jVpiw&zL=OUr}k_x1_;R(9Xt%(7XvGsCbw zs-0__P_S$OU+ia-813ltqb)M@9np6 z@f0{_&lCpKhS^5B8aR(r&Qku6y&&{*u`gyB8M=_k5rK)a3T_clM&v=Qc}9 z&fN2Kh45kB$M5WOeYBQ)%x|?(G7<7wcJG~iSEfc)g3#nWG7W23TyMRzkM0!r=wBYO zM@#R!BG};dknV7(F?w$Sn6gF$lv}rcs z46<(>Prb9RWL|jd;h8*}3pNM0E;{zk-av@ozVH8Jn|qh9f6zMo&VIxCs@>-%l-a0j znO(iL|DApLgOJyIWhdM4-u*js)1G(seTxejOs4ejS*|m;Y}3wn_MVF;-#K%yeUDSx z`9-(3y|a(E;NN@fUd5g!|G8n>Ti)4!i>ZF&Ce*fve^TtJB^%$__g()h!D>3$=9c{(}b>2IG=ZS(i|^eaMZ-`R79$UJ(OJi$gY#N#ge>UZ|9j!6cz9yhVs?iSgl zw(_05>46mOXGT+OJQUZ8<}ZI|Kfi2dqSuq2J)C#Sc0OGC&VGgOd+VddJ$qV1tv1vx zd1t@wrFLgUaLXQr!)Hv~7QeHPhzP5=dv5X`Ri)4-i$(A3QzYveRtbdL6tDET61wo6 zy@pcU{`Z?F?>TE-pEhs7JNu@cChcp5vi9u1#a$}2;GO-umAO0Krzh{xmrAwSH2~9zq9Xp z7Aj{X*|z6ox>MNe`S0v6U*U{9J!gWAee6B|%mwf4WtaNyykk_or=9V2vB<)A_Spy0 zL;k**VqTmD0xxGNk>FJtx_Wz$Bos+OFbx)7WRxzXX@9bUTKSwry ztF|#K7oE9o<2(CiTe;=(oRjw)`#+I8ddoX|O}U)z9V=t^JUx1LgZcJ%_K`a$)cjP= z*~1@n;x@80~Tz3=S3`_iuGoNC>(i~Ur=#{=)|)z3}T{siTUa~`%8xJ<`|xtU=y*~KzQEGclMj3it}1BTWt3K ztqje+_s)LH+`j2&?>FtK`h0nR_TzW zuO|DuclNv1-3hySICRf%QU4u_KEJbf__oZJZ^?u`R*_G8i+;YdH<`TF;>)#+J??S8 zKb8G|XK&gSk^Si1#64bY3k^1~zPCSnH=gVI{}P)^2fZiA@w~TRGh@=P-+L$S;gq`` zeMsoN{bru^2J7;QZRP~E-kmM^-hRs8`7uV1`)sN%{EuI)@ZNq+BT}>>vOg#x%%(zGbAVF=wzqcWKMX0N5TBP{iUsEnkBj#_WU{=8_I3} z-ah}=fBV?A{d;OU*}Zh#-`jhxEVWq2J7LeKPF{|7|M&LG*=?7#E-tZYU-J8oM8tc0 zekBKmc@vxV%xFF-_Bi3a{hCP!uLeZ**|ZwnW`36W-rhT#aZRLEi%r57#?Oky@9pL7 zwy-N+ZQ2t*yV`hq&3pTkyzbUJwL14`F8nIu*7n~1a)(s{%eE4mZ}#2K^(MTxFD#lH z_~vM{O|#GO-+{B<+kcpNxnJme|DIbDmMmJow5QmOz+e6SpVLhLt&NU zp2K}M>QRaBq<6iyH+sGD@D%M9o9Vl<&9#rdw}01q(Qsu-myLsKUUb=o_x5ieTR+)l z-nU0&-<-97Z@;&ndv>C)b!WNFjS2G_4?cfy-+3m%@gQrk&Bwxi?L(j6LmLVop!5$Y z&A`BR;k@(fzdm*hjKrJ$go5S^D;l3A9jker{A8p~D7kery8 zmtUfgn^~b?Z?90ES(2fkrlyczq)=1CP*9X#QE8=6P?TSgT2xZ008&^`lvdQkJKXT2YdkSDcxYlM2#aQOQu0T9%)kngZno zfJ}y&4|PIuY6(adY!yRZzCv+oNl9vvLRx+iLbxn3r!-X|Be7T^FCQVAoL`!g0(Mg}7UX0mCnC#aBo_OZ=LJB$26IYgUUGh3ab|G|$cqre2q;O*%u9tU z@ytuh%*!mPWN^#OOU%ivN-W9D&kIUT&nzw}s$|G7Em6o%Q^-xt%`d8CD9y{x%P-GU zD9y_R#f3t8YF=tlVvYjHndu+}?ht`^=fsj!us~{AYEdOaVqPUfVnIPpC4;(ZvARNL zu|iR5Vv25lUQQ)LYDGb6a!F=hI>?md3{W(tfn1VP$xvL9nVb!xiZb)kGt(*=GV{t3 zb23vDAVFGMoSLGLSgfF0tdN~r$$$tjaEbs46_+L@78NB{GNk4flvFA}*m?PR3YmE& zsp+Xj3YmE+sTJUKQCR>o46HaWH64=Pu*&9_mgwfE=_ciu=A~fQ4^11%MX8|J%PY-I zEy_&Bt~9gQ5o~1$$a)AfJ+;Iov63M@wInpe8O$omFD-CFcpmHvh;a;QnRzKbiNz(J zAb)^)5Ed+;QY#Abi%JxVEAvVcE8xMGSX`W$o|g+sFHo7>#0rL(QdI+!3Wk^pRRbf0 z+WZ1gOj{`wB-^T%DnNL)1`sv6+6oE^1`!4o47vsp+6EB{1`)aj71{ z3MHvUxtV#1CHY0*q@I|QlV1)B=QL0*Dak0xFJ~yoFK5WhFJ~w&NleaG$S+GRO3TSF zXUHurE>TEIRY*?E$w^ItWb(Y!a)!*}u*}qQ2A9N=L@=W$v7AA*lp#4MvA9?vB{exG zu?U=kixrX+^VCZe5(^4a6G0KJP@I{Uo|CFuT#{Il3if+)eqKpxMF~S%X zB(bQ3p&&5@!ay&^ij#{n3rZM*Ayh_XL4FB5uN0*gq$ZXqB)S?oFl6-}v%yf_hESz#vOEU6P zK!s&u4yd@SRDjlF3{IKpo_Qq-@Nx>2%kxt6N*Ge}Kz4@)c{=Ck7UYA4Qc^L5N-?4{ zIX@Sa^5C8>F3&7U&QO476ML5{B^9#O&bI5(ZGy0Bi|EX>qDTaY<2T zatT9FYFbWeGAM+yKomG?@)R74EAx^e6*#E8&QAhMLLC8%`I3AEs07R*NkxgEG9eEp z4r+ISMAQq4@=NkdDhpE8;jJD}VusoVGo>W82wXjY^EISJrjUqa7$}n!!*e}`j2^hI z2Ww7BMbZeiMZpDB-au`Fh(I}B!Tu2Mfzy~VZhUARIA}9sQ+>Rv-*{PMqu=W@vW)OacIS!h8L9GpNtSRJ|=XrzlDJY~R z7MDO;C&kdh6jCx~<|*Xnr81IlAlq;hr?51c3MzGr8A|f=6><~v zK&>B0{Zh;j0uusNt_rYv2T5sa4!DLaW>8RoGhy+aSDKrYS_G;Dz!|QX0ooW0PAw^B zNXpDhEUJVig<^P0hquNPlao`6iy7kM(^E^FK~*+GacYT2erZuLsKEna6oXqn5H_S0 z1ZN|)eqB-_rFMQ%F#{+K1c5VWY7vqzGINuPGC@t#6otal#JrNsv`mmZ%pQ&1~26I?eYf^tSiQGQ;2X|VzAyM-oXa$)2WmGV(tA!ms8v>$2x*carHka8{NmCgkQZT63b5Ro znOe+{l8V$n0tuw%l@x(!P-X54Wy2j+l$e*E3i5t(PH9SNF+)aTv1eXNW^yXjt2sHD z#i_~pc_~o;BJp9KMiPSg97(7+wImo}0E`LI3*$kw!FZV^i8-0c#SDo_@YI2lwlWfn z8C3POiWw9%RKc!PPz5^gfqF3z30OgktN>E#Ba480Sqh%edWRu6wFJTOO)Nlgf>P66D+&~XOTg7LTm#rd zXl5?g=78T_e zF$9BqZmwWg6(R}hQ$kolpfn0)rlzG9rRF6= z)r1ClLd4T@^7D%rK+V|X{G9wEhQz$&46r~EsBUx1FJeG6V~R_Qit^JzRck?FW)VY4 zURhcZLn3nj2UN#_+AJBViQw)+qC#4Jk*;d7LQZ~u0kmV5kyr+AOCT-3A_jGM zU8Js%nUV@EvO!4#9O}^CV`d&SB|!QR$Ogd5c0?rwHxc9ng>=aHOnwn`qy}D|K?ZK% zT!=b`(!3(@KuBs4Lt17|Noo;8Ze}s49|Qm2ZIFqm2_U^# zXd4z(ETgsn5r)CM0cvO@CWGunYO^B*of1b^QCR;0k|`izl$KwVl$nx} znx~Km?s|hW8{D@=so*jX(xJ&uQ-Jko5mCUPo|9Sv9=HKV1gLh%Ou?oO=5ll+({u8Z z5_6Cum7x;c0n980Ws%h4)FMy@N45|;P?V?u8oWc7%`eGFEyCH^u!2MYe3*wJvlx_9 z(o>5VGK+%~(?FdH(C`mKQfXRRY7s+lMq*KF3bAKdFW1q)W1mbp`e@#9vVqaQAjIF1P?$Y<|sh5BlWnUB9L&0a$GAQy*p6)1GiUT z$ubdUKyrRgX>Oh$xUB{rih(k76LZq?i*i#_;A428gu{@WlbTors+%K0bb4wDm@ZB& zaVyQq0khMQ*pSKxSt>Nd8O}u%6zbLL(DW8l$bgiB(T9dI^Aw6w(^D%7kQG5k8lV!8 z!WdLZz*B8HXk3h;Ain_AL@&wAD@}!W6EgFPGgDH*r42($X>I{SZejtreeauC0PY%r zXsqrmV93c&H!NU)^jZ~CGRrc-ZJ4A=g{st|d{Fi7U!KPR>8OAzxZF%ozbZ8+4U|sv zb4o$|71U8vP+<+#i=Fwi7DWb z07xo;H9?`y0H^lMJcUGfo00)m>cK+H{e<5C+%6a$renZb43BNh+#&0Y$0F z-~`T)Se%*1kd>dA$B>(u$B>*~P#K;H>IyT!HRfc3+DxFqe(>xIVqi5fPaz+iQb98T z8Ht&Bpq>$ENFLN41l9JSRGXBl03NRgb&kOObW|P5nMKLqQ~)0}P)G(F1sMor$Sig% z%CAbzLn$G0axx2wGm8~U^0QO(;7I^cX+tGSGE(zEWgBReG_zO%UKcXtmFDDtg1s~k zlJ`;+5{puiH!8w$BO|{sDVob1?XrWxD5*_UBICP9;E=e5#&}_a~Bat zVCBdIA8@768VrBRnUKm;AtyC2y(9xw8dR<@q~w=4=HxKsCYB^;fEY!o1v!bysUT)@YGw{YYFT0q zJOZJWDKx#oh4a9bnF350)cAqr5tM=j((Q$-L)3U!G9{YYl6+XrnwglxP@I~W!vJZx zFeK$<=4HdmTX0zm8XN^r>%g0@3Q0Nn$=Q&J42Dcliu29SE6D(jY(N;0dK1EiblD(m zSg8T;LV+>~$ef~*Vo)w*NX<)uFkmVnb3l;bh6fNt5YncBMg?3B=2372!9~#w0F6`l zKvei9mSiv#lon?&fCfi0z{Nub11LjeFeDYFCT7EH7Noisl=vV+$B>w2$jdBgid#2Ly)%;P}jW)zY#^HM;5gvB$Oa6wT%xV@2CtWb~&QJIvP&H!y)fC~d~ zw+htvQcqV0kGwGCr!i#ar7>g_rKT~Yq=HD$;BZhXNH`_6!at1xG?xONH}p?q01wmn zr-4#$0Biu)KMj^)1_gzJWFs)EI6pU)!7DhZG_NEx zHx(3jpnM97J1`At6@kWL;7JY?&bSjKSQh4fR6U5C8y^q$YkWLnlng~5dQTYM%U1v^ zLpTcDpMeM>Oh*!gIRr@vp)MyeDK!V88Ky2Rv#7WP)QST2E+HfKu%Q94%`kPa-ac%k z6x9@Hy9BHQ;a13~0$31c43ZGE*$$s*FG?*e%`8dWL4&mnpvG)wPAUU5 zZDc}by%FnhU?~hG{bd$|x+#!_Iv@p*NhVOEBQrO*6r4F=bp$xaK!$eoAwxO}ps6Wv z`2nh|V3`SI40!Pk$P`clPR`Fu%SS>q zk<`^2E2 z0BXG?=cj;509cRJsj>t-{SEg!yk87The*By>w~9cXqOm02*8TKlkT9g=!`^YzJi1` zsL2KnP|%DE)?TebN@`MRI%w4qsI?1T%m#NCdb~qgok+uFAh$y2Xu!^ZGz=hXIlz-o zkcCl*2}7_d(D1Z#Mq&|YmJ)6ksB@W_rw<GwD^-WQvz~hk!DR4dq&4a^Nv49JcLk9^+DYo@HiK=w9hY5NCT^bj!b~p zq=6U3fF@#7;1LR0#|DabP^UdFg(0<~q$n{j6*Qd*?>ZGLB$j{|8l>i>AO}oJVo4$n zDUeE7q-EwM7l9{@^;1%zECujjOdi4=>X~`PC5d^-si5JGBG4iYY)aJOf}o{4u6Ze- zg*zZBDL)5c7NoNS_L-G}YEDiHtjvcOPO!=jl0U)K6VfDx4S3yxodQf1L|(NRUe3d( zB~lpDGAmM37)tWpz%)4bLZcKu{RL}-gNikTAhd%I8dX4*D9H~7ub5&0EkrCTDlI5U zO<_KPX+KnMe)6a}!Dm1>HWDk5h=%B-@)B5+$>K{bV;IGLfOs5CE`Aw8J^G=$Ai zT$;pCRG!EXAD@$-pIur2@=9t^d^|&ZJjClr0uUAM;E6XR6-WZm_A^5?WLQiOytpeC ziJO|7nOckxfECRM5%2;H*bFT~7&hF5CW7D=rzRF9XCU~nL4lCObYwwz-!+yY8hOea z)R&26h=vWv!&@K-z2MaVkTMS;2p#;2Wr$_~MT`}k&{H)qPKja&@DKJ3@eFf~_w;k~ z^z#gfWbku!cSIG@1!)2kAq>v`p?)C@PLUz5!SMmELGi9WuD-5*A!vpxxci1M_&P?! z2Rpifj1F;icMW3j_4Gp(NGuM`%q#I@04-xE@ngs=_Dl2wt+oX%mjJC}&n#8|iIn7n zmVh$21_XQh`1>*VIr^bnr<&}GSdYj6UxvsK;K|_W=f+@QXk=_+YG!U>>FDI_;_Ai_ z>>1?>c3+sIPpB){VGx#|qpvH2kH5PSm^3tSWe5#%X0QRTKD7hUnI({wn|2H~pt2dx zDNZf1W3Wlg%g?LK%`YvsW3U0Ob95`s1F;fwazNb(-pJUu-< zSbV@6@8Gs}DR`xsHUl{CBkDpe2CiC71`SX|YBDHjKz5F3f~QVUSHXc=)bN}O8l+ax z05`@|Q^2)ad1{I#V*C;`qYT@hP@tdzS`43}$$-)=1&?zo6yz6!r_rqxR8v3*t5V2P zchHC#x-xj(4jsjXEr(ao$S<%}P0>+++6*xPzbvTg1Fxk=*9>d2K^F6)%WBwLX@a)0 zz{3XATL(84Kn+Mpze7WlK{sAcu}(`}Lz6)Pp2IYt6B`;x?JV_Lb^dF)c(hdQQ;HW1St0T8k!Baq>C`HVISt+Q4RykoR zgG+#VUGNP9ptVh)=?|pU#-Mf8;C1a_?}H^Vdmakq8L4@ospf2uyFg(C(FR?ziL!!| z!5O~m2efko)KCL$&j6VWayztx2jVgy_6OzUC#Hb<=%vtQps;2Fq^5-r5PYc~+ePX_W&c{?t{I)sfQIBGf-Tqt z#a}WgS|O{yGEzY~3ACUgv8WOhq(!O4;5mDg4Iue>;LZ(dhZY>?T3YHD9)~4!WY?&w zGFa=|TREuNYOCldGwA5r+SnD8t56ODHNm@A+2N9#G)HTDI|OdDub0m1Qmi7!xB^k zo}j~}Dh0gx2()Ak6fqz#C6=WYC8nn;6z3!+XXDZa_dKNYMOYbV>8d6dLttrUa<*46 zbZebLDQJvNL04D7P|rZmK%p$P2$Y6(6jW1mlQK(m6d)0&kOP`UfpmDexELHSbTe`@ z&Sh}C)6K}uJCA{ZA(DZCA&P;4VLpT7mu^OG+XV~^4ABe>3^5E03=5Iii;&ohk=RR+ z%vi$UxTlAan|C>q{9FddD?Ni@NS|s*51_p*q1_p*K z1_p-pNbC(r?2Sn5O-Ss`NbD_0?5#-bZAk3xNbDU*?43yLT}bTRNP)ADfq@~Lfq@~1 zfq`K^68iuW`ydkg5Ca24E&~HY9s>izVI=ku1_p+F1_p)#1_p+sNbF+_3=D+~3=BmK z3=GE^7#NBf7#K`Y149LaDhBj!!^xRSXOa z)eH;_H4F?4wG5686B)U;GGEhUU|?WmV2~1GVEDkm!0=m)fx&=*fgw?wfkA+Qf#HS` z149S{1H)Vf28KEY28MbD28IR(28Kok28JdE28Lz^28I>}28LD!28K2U28MP928Ip> z28K=s28J#M28In$3=9R)3=9e}3=9P^3=A7$7#J?ZFfj0Nv$8NTF)*BDU|{HGU|{HB zU|=}Kz`)SUz`)SQz`$@CiG2ns@tkE~VCZLHV3@$bz;F(Ut4p|0Id zb>YF|@}M|nU|?iqVqyj#D$lTofq`Kv)a`p27#OB8FfdGKa6B-Dk^7qfsF}+EnFlN> zDotg`Ok+p|O(R0aRT#<=ix@zIw6F=$vi!^x22igxKMk~|gCP^NY6j9h%}--U$!93f z08PiFteY@#GH8L}RY0o-U|V1TZ30JUVn^G=}ILg<1>l!cP8 zsgmTx(&AJG@Cxi=kb%kB44@_;@}dFA1S@nN9~^W3X^>?s;Nc8VAVd5L8S@6Q5i?5V z&`Df|RK(N~*bGqP0n~~BP1?gJ77>j)2FMy12G~j@NRF zU@>@!Uur6ZDuQ&D?HFu|z}@7s#3E2<}vh7$6&67{CLr4B);u=0*v~ z7H{w(vgG`{E>mJU|Fr?*p4w0&Oow?DGL%h<6qJ^vro@9=-F6H%kX1tQpovZtaqt);L{)J-XzIj{0XibhpbQT#&^r8L$a*r+ zFf4->H0NnCXfgPLH|#Kg*S5h{SwKc-L0JN{N(4m14>5o=Eg_?K;K54JmX#F9HkFdZ zlG0*^qSVCV{5+`tLozZ!o4LUIQFRR%U>iLdbm1(}AP{(T3t|Y;3IfE;Jap9;bQ?c3 zNWuHW^72b`QwvKIa~MD~^(ngfr6mmc*$mK8CFtHf@SrCHWPbuQw?gxq6LbY0WWbQY z5xR4_m;tEAb#pk|4vZSQdqY201L8a}sk4 zpo_&BK*Ku_SAyjrOz`*&gb5NgG=s3g;~@|xNZ8m2!iEjXz=wiZ7f2i+_|QoXbYXaq zGe8c`fUQ%3($M{S@c4iWgC-c@qNwYSQFu@T7|;Yk+96_a2cVh;7iK{0qrtsF26_Jt zXrUt{HHN~r&49KQfQAqu!mu0+NtSxZi=LoDu%T<{K#3lBgc^kdS`rCW3>_ziNkay! z;XLpTXsAl0ach`-X0bE42o5d)O^kp#cQ6@nu7yOaQw$RV z_t@dt#qq#WM((W~pj!)B85l)a85l*OSe%uCQJj$hJ7i*DWMyVx=8pyv&Rs z%)kp~GcoWoGcfWpGehkGwQd=iKrLK|t3c*3fm&D)%*MbV!OFj9~rZtc*hG$br-`LBfKWiGhiknU#%+QG$t?k(G^!NrH`;S%R5?QGl6|L4cW&QGl6& zQIMIDL6Dh|QIMH|QHYt5L5P`=QHYs=0VD@i2W7+M8Nl+aj0|F6%)lVV%D^bb%D^B7 zj|-5$85tS47#XCvm>8wNG>FZ}AjQtWBniW;3{2vTV71H)jEoS>#LUXd2#Pb1ILxms zEDTI6tgN6k!Uzg~IA&yk=trg@>41rWfgOw)8Q4+OFflTK;sP8$pmalR40boz4iS)h znHdrnwoIq+wwJ5oeTSXJnFOXJU|KXJnLw#495MDC$knHU&3Kp2#Jm>3w@nHU+^nHU+_K`8_UGcqtSqF_cQMn)tINqwLc z2*HdD%#0|Qk(rSZ2{SOVFd}0{1{OvX%*evXh=LiI7#TRhn1O+lnSp_ak&%%P4Wq>K z3$7iZeD&tVNr2OX<2ziWfgc_rhU|^_ZWMD{QVqmz<%)np^Dp|M~7(xXY7;>c;7!GMM zFzCB7Fnr8sU{Kh~z#yo~$Y6Mjk-_Od6GQP$7KW`i*cmi7@i5%&5@BGqRb+T{+?3%t zOE|;HGd&C&E%#={iZa+}?Yf7Cb-rm(IK-6iJ_sL_ z9zg?bF#RBXAQRRZLgYc}L4$9}qEJ2~0|RIP?go?(sxUxVV>lfdMoi2ePji8vY>lpni7#Pl4g7kxmT!{N2?uGCX?uGCX?gh0>7#I-l zWkho?L_Na25cMGUf!)i=zyR_G$UQLk!T2C|GBa?(-4Ao`15km$z`y_rZzfQ|iWJ_U ziV-sC32{G!k8nSP4{|@uyzeOf2UXC>{)g}p`XPK|{db`5K~8U=0aBRxLeTUEk!NH8 zrAK6WR;c`Pen|K;F)}cK23671^9wbQJOcwLy@3W=(_ra=fq?-u*g6xMUP1X4G~f!e z|ClZ)^)N6bBc(UcAS|O8$UI2=fcWVeAU-4yfyU5kkkSK)p9MA_5`G}Q0+6${_O~ z?gjB11VDU$`D70Lclf(DD()2f1GoT)u!>ZjixnT?ij+9%yjf1I&k% zA0U2)CdfY!_ksAeV7>rcy$-m%RD|>G!F&ZczYiS$5ch)gF9!1s;PMUN^2-sq zw*l3Ekmv@_9dv>76DYMXFo5R|!1jZKivcu;uoJ4D9XgLNXYRcD3l=S2vVOxxQ1gHR zl0P8&LGuYEp!Ni);|FRBGB7Ya2i2F%3=9WdA!`0Y^B1T*1I;<;K>48XzsSJAAPeP# zLhOIUz%^04>Io=0|SFKR35~C&cMK62Z~=%_%JXqya3H@LEB@Xw)!hj z_(02dQ24xNU|G{y_ZK;QR||e}MS9@*w}RFu?R1!RlW|28N#u3=H>0K=KgtKzvoC@cYHU zz;GQFUW^P3zd`nc%SVWM5dRRk{S2`m#6Jv{hu9C|Ga|+RA5i*6;{Rn}VDLdofBzU5 z7=*y-6%xPy(c%Zx=7pp`Nc#{Ze-!LrNPvUf~JO&0(8GHfkKS=%rjk;8uL*zm6$HvIOa26V#AhXyR85k~u`H=Jq z;va_QM^OBNM)stk{sZwj85tPfgWV4aPcB9V27YM#gWL<^gW9>wAPyq~gElNZA+?8L zdn~{MbTpi(l9!3U+=iv4M#J{|Z3=HV)FIamC)E?CV^*^Eg zqi>)-JOcy60&sXj$_qY51_l}=wQvo>!;yE!!28L(g$b#_285tNLYi!*;JiWYq zeEs|b0)v7>Lc_u%BBOARrXW`6I%vgf>+0zfk7WBrAdMk zJT&Ei)Wh%o6jVVqD4e}f~rZ^!n2I3>flq_0I$uTl8 zyi$M!2FQMSMh1p2NPN(+%w%ZDf?Bcv|G%%F3+02kWnkD~^BF1+G2h;q1u75aA4YCjC^9lIAp2j5k%8fnF~a@Ij0_CP;FJVODJqN% z3`e0Y8<2ZdL8XTl0|O%qgX4!QjNG5tAmuhBU8*rMFgPHkb9F`r21^*9k%0juk6eyx zFfuUc!sHnk7&Jj+QqXb%sG~>X)0ODT-xt9|n4oVTv!1_S}36cK{ zl?RD~;=)A zl^7g9+-BtdD~wzNSurv&zzS(KXpdY5lrlLO7!>jtK$pofh(pUsP>pQO$iTo2&exEX z2I4;ehYSM)BO3#Q4QQYR9Fh>eEh7U%8#rVjd^<)4hNZ9;5E}!7JtG6dX>iJd$UA^? zCai_e#=zjn$iTo0wI5`@6C(qIA~@wj)H^dWFi6`$QUVh@1A`05KS=sr85tN>fI}Lh z-VKyfK>hGxn{VBkZt&y$gXK?%t|FHq?Lj!B4l-i!RRS(i1!^ps30kaRZ^b!;w&=w9TU4hKp4y|W0!$rEe_Om*)*+E(m zVxe1iZ_H+LFoE)6mvpUxs)tm4_7?ff88??L>l-`l}S)djwEPe4XFk~|_Fu+Fyp?vs=Ae0ZYuNPYW!1#ZlBZA28 z&p~s4E|Py|ia^{e3T@$n%Bwt3_<;G4_yF+*LG2JGVTOFDe;_>$Vekk=0g`zJiV*X* zLdyq`@|%>&o0IC?-J zdE_1th!2h*P&ouLkb!{#xd&Fw$iR>S&QFk<5!7Rb^sqU>H6@4->0xuh`H&tqH=GaY zVe`QGkRCR~JW!7s(!++B2jV05uxmi0O0e>Yk%6HW)b0lN*dX}_#7FL7gZRijY!Dy0 z2V2L;z<}I?tw(E_HGtZ|VE;nmr;(9?0lA0U1gdYqEe%L~HiLR)u=;|LfuRMhp8?{- zd-#kD46UI05Zn@hxF5uav{e892lZ1xeB>Tz8(I&v9ZPy;0;eBFwDiM>mVOu+VCg5p z7F5=Vf#aitk%7S<%om6Aw}AN)aQ;FtUlPub2G<8taJ~naFAeAa1gn>U^B;iuvT*(h zFkcSN&j;(5hw}x%d<8f^0<2yPoc}sO;S1)A!}+Vhdlr1Iz| zv}LFQ9)W_Sw{B4T1j+|x#~vj0{GiH>fq?-uN&xDVYcMb{XfQaod|>2eRRE1tGB_^y zz{q`(8KeLt0J8Gif6zcP1H-rf-$A26AR4rip5fd7|Npa{85qvkF)*Y$GcX*pV_@iI zWMJrHgwXwr3=9((85kxqGB8YHWMG)g$iOg#k%3_I849FO?Gy{ZhR5CC)tYct!Pzfqf3>ZMY0~Q7l?Z^<#5YLdnkjPNY z;Mnkmkz1XS8MNSu5d>ISSwTznSy@3GMkXfEvVEwmAcNzEFO1w9c@1VMFfhzAU?^^k zVlWU-U@&0MVc6W5&%hvFz`(#>!@$s3&){Itz;Kvx2E&BL84M0=GZ`Ev%wgElxP-w$ zZz+QT;~oZwwml35jr$oG7!NQQG#+4ZU^&QOz<8L!q3JM#LDLZiho++p28_oU3>uF! z7%-k-aA-QgV9^3D!xXJl-WXLM*%U^Hk{WHew@Vl-$}VszkA zW@Kd4U}S96U}R*}WMpX6WMp8}Vq{>_W@Kp8VPt63Wn^U3V`N}7U}S7GU}R`CWMpJC zVq|PIVq|1AW@KPAVPt4DVPs@9Wn^qLWn^SDV`OMFXJl-&U}RvlWMpWxVq|QzV`N}- zU}R);WMpV`WMph~W@KP=VPt4@VPs%(Wn^GvA7Y0UojRlzGh@-e9h<}@rJRO@dsmZ z;}1p##-EG~jXxO|F#cjJZv4gQ(Da+ppz#l*1JhqdgXVvX1_BIB1_~TZ3{Gc>N|H)veLZ_v1w-=J|Fzd_@A zeg=*W{01Cb_!*dX@H4RN>WXnf6Y!1RXS zfaxtiBhv@|%ZwlSFE@VV-^KWepRw^1{|3g-{FfU)^BXdK;WuFV%5TW{jei&8PyS7f zKlyhv{^H-n_?!P`<8OWgra$}!On>>482|AvV4N(lfN`q8g2t%=hKw@>7#Wuf7z%6< zU=-LP;LvnXz)&h$h*2s-$k2d6jL|?s%z?>3%z)8Q%%IUw%z)8IjG@s;jDgWu%%RO# z%%IUs%z)8c%%IU+%z)8C%z?>L%%RCj%z(*W%pt`=%%P=J%z>#=j6tnIjG=L|7(?SU zF$X<`U^|MZ*nhE!vHfNfW7FLxLt}?FM&pDwL$MWY zjAA?53>5-;7!?wF3>6f%Gb$KtH&kl)!l*P6G>HbP=@}eWHuN?8X}H`lyRnz4;bFtX z)>(|8Rl6)4j2s3WjG_t*mNO0Kwm3{_xYo3+!7-^}S%Y^`gAdaWriT884Gy|$8d&^e{Q;fX~j^8$v3xwCF{ z?d+1^m_B_~(`q)Jjukt%F)&**wRJZ3H1sv>WR`E3+&Gi5aR)Our%=OOu7c z4U-$EYBcO*WRPcT>}s6bu&1HBVIxz+HU<#^xyG)>ISo4*Sy>t>6s8e6LZ51o(6|$jWZ|qG%RhO(Y3Z|J)>mfgoY`N2Q@hxyV)BSHFPy>Vi4rv zXqeT|%fr#|xTT}%2P1Psg1>%)!=wpLHvIzK{RP zEpK#u*syQHevZZj2QCSNMxVJH%|X#?8>czRH+A&$&24s=+~mG%Tk}SX-iE0PeXjln z6ZjZeTJ|nzaG2lgnBTCc+3{D4!{0`y`)zO9z1Fql@GvyYz5m|E^^DzZJ2@B>rZY5jGIlU3G)!rp->}bO@vN3lt0p(} zYfCZl3HNk2OjydG(739>(TACjfw^%7bK?Rqqpx8HbK{{U{ry*Yo1C&6Cp64#In~tF zHnC??@5J67roPRKm>Uk=Xj{S1aJ#+Dj zrq0EUT`jA)R!C@Yu{iAC??SA&6}p`Tkt zV!{fqGKVMHg54k&Za3(k)?okvZBD99GdfIony<<<++=Q9)o^#h{Pq2g|0DPBPYCNd zw6@War>VcQaq_zUd5!0nbu>O}JjBVsKBb?DxnbIz&Al7) zot+9RrU|r9o+i+=5tMHkrVDl%b!%$2b{H6}YUpkKG$%oOard<54GD_Oj=7C5m$r4Q zFmyKbfYwPgyk6j#HF1CA*5%!w6&%_Y&upF9bwiYwmupdX!_0Fkba4nJ3F_BZXC)5$({<;1m9W=-qfvV*gsXU+T>GZ)WcWM3rEy}q}33PZ!9i48L* zHSRNDkmzgZY+JV!n(!tzbhpgyWZ-C6$}oeWVfB`Y&6AtvuAj`&;IMt&isr@ZCpYX` z)zffn){-`d9jia@pJ&Nv!7;s$q2aFOvVMk!*$th`4W=}7t)0{`@r1*%1@k%@mP}~a zF!#Ly$I>YcGc-8n_cl1XP3mLlX;}EX;hgi#r|%{>9QN{l(C4B*p>>A;tQIG?s2y|N z9y(dH&6{v;!rY1L`evQMW{r^uX9PHW8(J(vwd%Mfk6`cu6&m;^u9F_VS z<_I?Q$~$&@GQVo+Y3gX}3{NGs2A&71e;p>S>1^w7aCDeEakb;)*$$8AayY&-kl^TR za5%E-uz|~FiCK&c91We!3=A3);3-Pba61Dd12-EpGebjX!vrOkh6#br3Cr%!53p=? zxZ4=k*c)rm=alQY&`H+yVX#+A0O$~gZ_EnI*cn!GDs1Fp*u|}2&8u*nPr*}&VYV2< z8cBu&vJDLi3I)0h3`PuhmoxaRQaFBH;m==%xlD@FSQ+PYFnaPRmI)}X6k^;U!ssOF zI6;Q-qrT#VY(?XZifmUI4_{~e|6DQo9b?=(rwz)WzBt4B&Ls`k8l2qUPit`a)#Atj zZXg`*T0c+YiJ>NkWal(+%b>4wK}Sc!bcqfomQ_u=I#y0^SO6} zTUtQSsJW-Rq0ebwQ%8sM{N~x<7Q_De9gLj|1iBph8oqWncXxLF@7mq6qqAX7V^?eE z)ZT{v4K3>?bahVX=xzcRO}*ON|>Rc6PQ-?CF}_KBH%K^Sa)?&aQ^e z&UL-r?3|qoAf-sd3YA8O*A|?e3I56rP7nI~`vs>rIqdIT(y*k#X&SVmcU0+g4MVEs zf`G$_Jwf&Bvom(v0`#ZN!ZRiEp^z5DM6*$y89X*;mI2zU) zwe)m_JYfY@^|L)yJFj*wZQ0c}qti*W)A0(!HscEoU5yDos~Q6WI-OWSHNC8ozGWM@ zrg!bw==dMKvVYv*Fu$#%(=oYWPp{+0UWd;dolaNU-k5X-P3_EKWp#MZ;Mg#OiQDNH z8$$sn!v`*ha2|#aya~to6<&!uuu3!VDKIQprtoZ~g1|op2QJ3L0*rpbjE-WA+)|9I zWErb+6uls*1reB_}ag$1x=*m%%Y3KUW7tFgWHV zmgMJTCg#O^WTqD7r{`1_WEAUog3r$o@{2F0m5AO?d|Vs2@!4v1uMN-Qo;j1No9&;hX+oDxeCvvr&jOR^c9 zQuERib24>6G=oz{VrF)6X?CWLQ$}_%gHwJ%er|qRz7B}N;8c{Dk(;RlqCjlWv6UcB zCWBLHdS+fK$kx(y5HBM$MaQW$BZa{^F)uL%wvQSXE9^BE)0q8A%Mz8Hw4si8{`S*|{Kgu8wm?B8Zh*l%JiNs^grITEyU- zkzbTpoC^vJ=ZvCa2Iu_T-26P9sLIMp2Iu^OlFVcs5Tz5Cn3&AqT$-1f3AzAFC!)Bt zg2B16peQrHM8~$t+7Pj(5y1Eh^P<$xO^G?UCATNWM4DO)IY?F0B6oY$FVqQr`q7H~=a4$+t&DL=* zO3h|)FU?8>-I%W9UYb?J;9i=Sm6($l@1CERlBwekx|hSfv?#YUJ0nxay|k#50Yv1b z$9rd_<|gX6mu6=$cqHcOcqHa!f*9$gIUsgAh@F|186T7nx=gn+Q70%r11wmYm!A(( zk&-=!85l2d@ppoV^JbFI2?;|GZ{Sd zGE$2&OHxyGqB8R`KrssvgWLz3nV*-K6CaS6k&{@KsS}WqgDF*1k^u^`fTEI22Cu}j zL~yzVF&MlPL3bYMc!NUOJ25XWF(pyQJ1-@X!5frWK(6vm%meYtGj+TZ%QG3g6Dt!l z;(b88oJ2wMfT1Be#gbJ0m|U8zh{c#o(QhS(2C+9}GIu zDIRiKrH*%INil&Kh+^=`%uOoQ0g((onR%&+Me&Y0KACxmFrE{Lm&D+cSqxHD zT*}~6nG6aC5XInA3Cg58Ad0~^F*~t1u}B9*Gx#QEBxWV%W$O4QW@It=CgvnoCW6W> z-<--^2H(WI6i^}s(I8G{az~Gs{wSd{aTj!$grY6-X(AZ)Re?PC!mk3h2a)Oda3+luQQS{5()T0XY-OY>4d+21cQ zJ(s~RF)t+(S{{Jd41THQ@ga$s@jj)gIw6TUr67Ss9lzA_Ly~+{Coz#(&CI# z9lzp?QU<@u%*5=}y!7~h(!}J9($sj5-2A+B9gp0+0tWx|jKo|W|MbLM2LGIR=Zwtk zOdbE65<^hywHd@{39`K)ERi z6!m_IMM+@cfYhSg%w!!91>=K?W1WbCREW{R`RU*U5}cn76DUP8C>Ul?NNG`aX0ncd zQFaE{pwP zc?QDw=?nphIk}ZZsd=e7AQnSFVrjf{W?sBUVyR9*Vreo%Kt^JEaeP3c4v4`JkddF7 zmkCbR0U3D}3<1T7pldsk%Yy=jpwz6yymXzQth{uFAke8KIzgp*MGV1-xrv~2dGd6E z6LUe_(xSxTjFO^6o#4b$$R&}W@*p^)Ct7U=|+=9Mx8SLWoGWXAg?rWa-EfH(}nl|`9}$vVN6Mac{yiRp4QE7U!oF zF@)roVOyw;fbJYY<0quGx8b26G7Ku#5-q}Wa@y}43Vi-nJJk%Ac`R}QztSrGm{}IF)uMG zu`01BKDe+nu_#q1DlspK!EwSGChpIo2P9{DwMx$PS|{1y)hF5D)gn2~t3h&}SA*ok z1g~Y1EnY2>jl7d3AMjf>>o!O>=`w<-23_U`-3CbzZqj9F&}Epc%dk(kSE^t4fr@OS z)dLS%hNY~G8(A5fSQ)mNv(GYTZZ+p>VQG+TWoeM?WoeLXVrh_^&(a{-$X@rh_S(dp#?17WWdy5z}9TQ&|tte!GN<#kD)`4p-GQnsvbj| z9z&xZLyI0`Cs?FOkFi0IuUU_=TaT?xkD;l8p}m5!v4U}G1w&f}Lt_O)O9f*GSfr_f zt*L?;A~LapvvE2@>vX23=?u-&nHr}vG)!k`1TmPJrZaUj=_%$VlM*aBv>c`|f*GB$h4AD_dp zcnA$7+2>P$1$S+9ySwu&=8k{6nj!*r^tNwTYnZR$jhhKW;58zng= z3v%~NVrZJg&^U?vt_x$Q3u~tfYhyyAWJ5xOGNG?3otec?3=A>i^|@WLEUPpbn>5>d*_*5yBzvqHB-^Z-B^#_-B^#`oBpa<7 zBw3bvwdgj;Zt!Z+ZT4!>?eS`mJ?hnMjB^#}-NiuXvHh3|Dh(1Y%9xtW^l6(uS_?AjG=r&0rbDA-lLN~tUWU8I4E>Vxd6!CZG)VS4%rj=#FFDWng5)}f2FdFV z58Nd`aK;<$m;B&3-{^_XN~UcqIoA6>IK4#pzU*}l_JxuUSiPDg4|y>*dNDM3F|>P$ z^m?u7XX=z>-CoCjw1vI9g>}BdTBiod2B*c1Tn&wLjG4~bGBikb+A=rV&P!(4CdSb# z#@H#w*eo_b`OsAHmZ{UCI9t^j!3gTxRbCB}9bOH(&0dX?%;&||Mlp6qv3`(tHs+pY z%)G(4Kw$AhUL(c_oJOi`UfeCLEHlj+TFe<5%o!TNsMGv`5DWi9E|x~g^DK;8S=bs_ zWNu+$c%a6@*dWO;A6f!;Np?CkNUm{cl$>YG)N0HK zK~2U?ZITRalAJA)jNN_=GyNDQ`7t#5G4%N{_WCJ4kn&?`l4M>Z$sz#4>j=L&M_5#mv3Mn&;)$x6Q3$?5tv4 zT*{uB ztul-aG7PI_7#d}m8bIu+mJA)1^K0g%uy>^BPcma@G-GKon_bV;P(L$}r6JIMe(dxZ z=E*UPYh#+785*5g+MOAioEhdgGd4LhcRI6mIJ3TGJ)k(9P^Giwh3|e4Ko_D8jTvWNegVY?fr`mSkuEWl)9#pnT2P4rb2= zu^C!GQlRYn;Iky-gTs=H8zmoUcks1zF!XgKzn|yD+Uk{1(x$~QL5s0Xi=k1Ap+$>j zudG6YYy$t9Y^L69#?EZ!#_WXq^A-y1T*lI{EHQs&YC`F%Jm!YH#QHW+t;o=*&d{gM z@E|3cu|HblG$V5-BXc8T(uTv5-g_hy5}R2VW`SBv3=J%d4J-_uEDX&o3=JT}+Q7mL zW`MX&NNV7M4KTrG7KS#kMu^@{7KRBdEKMv7Eg*(*BTK^C)soB)m?gRUBpLf88Tup{ zmPm3w@Rc;5DcNArD9N*0lDR{Ytx=MC>w{V&#t&?YM!X+*E*SAW;x)>2e7M&rwebVfD(g4D8&p3SR!R7jiN% zF!6dZFff5h1|~0m4h9A$FVI0kOuSyI3=ACNQnI>UMSYVQIK*Xjy(;@AFJNF1m-U*< zz^didH(@pdw}`luthTOK<%GEl7}%s#wX_|)7+64h7&xVr&Ao~yOrE=dfs0jESz8y( zV_@={%fPJcH34i+B?Gg#*JK7JuRaDQbuZ8^1Ft>?W?3)L(LXG@UPTMILGA&qq+}IW zb^vPvX=U=7z{bG9?A14cfyoPW6ce+!*8~PO5piv=zS;Z?42-&rAVLtNxsru}fmy_B z0W$*+qZcy+Ba@VFLk|N3lWY+KldKjaldKnrZfIa&U}n|S0-eA%-fs=uYiDd#O11B@ftQD*b3`{H&l0c+M<8KBA zUTy^)Jp+5Mkc!snGv_hzz`4_B&J$o@5am`-(vJYC2o6cht8nk^p9WGU4iz>uu=hch z;ABxyvI{O{;AG|&?Js5EWHLwsk$SETr3}1GI@22p8915k(-t+IXW(QOO`hBU+D)OU z<<*+Uz{J?(#=yuTXgX`YD1#ZoV`So1U|>>c zWq{Fa3icrt(`Pa;DljrBv@$ZnW!b>YG>}5DD7OMLqXGjr$kdRuiq4ty7BMg>=rFJ- z=-4j;o65+|2ohjSYj9y;WYh(%QI`eBB;$m}&7i1FsFMRtm9cO#Ft7=0YUKxj*7LIn z>*mKc2r@7*E9iLjEM;I|lJXK~U|?b^V_;_!*37pHYzA#P15IBsGqQjV<7Sf8YSd=n zXEFjE;Ka^rY-Hh(u#$lT!l+xxzzSx8QVZw|6R7x{m5iKVasPxlD_PmV%$1-6!N4qb zr~orWFDC;t6EA2>B81DrWZ?i;3OYd0$ijh<(I|p}naRR|iGhL1!Xc7@0cr$@*C52e z&uApipvq_j%6vvM^cmC{jm#Mg7>)QCxEYN=?lKBzkYF_8WME-5if52xG&*4T9+ZN$ z8u%I5nT)&|mNPI3C@AR}xZ2wVhs39~x=)+8h>0I20u^B71`F5)$GcCP$G`*QfD|(z zOMyxaW^M)0=~_$*(=8bon4P?m8{`=nm;`JO2)$)sWMau|Fa)LVS)lTRWtJNQBgF3w zGZ|Q*J_E^EIOs4iGFdn@+-G29mXq;gV3P4;X3$}l@%3Y3;9!#RYm{e@W@3?QFJ)k0 z3M+5#Wnf^^nGPxhbf%jzFf!>(?-2r15TOGx-VDr)%G0bF1R0Iy#WFB58l5|<%i!2> zhKYL;t8<=CXddJa#MBf9pHdz0J-MKhuj75dw^%XwHRXI<9%iIr+tK6@Do? zE~&|xxrsUPkaKZ$QZmysOBnoebRaH-3N!e@Y=bCc2+q|3osb(3IX09bI9bQJw5TXG zFS!yfl#OsQOcl%!C_ex+p^}%Enp~1!6dwS(E3-7QBr`vcAs|J^C9yaIRjgRYzaTXa zRV-DFvDr!x3B>wxY|PJu

    b50e04xEspFiVo0OS{h&CNqH0Z#BQU}QgIt8Gx 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 } /> + + + + } + /> {/* Admin area — own layout, no profile required */} { }); }); +describe("apiBlob", () => { + beforeEach(() => { + Object.defineProperty(globalThis, "sessionStorage", { + value: { + getItem: () => null, + setItem: () => {}, + removeItem: () => {}, + clear: () => {}, + }, + configurable: true, + }); + }); + + it("rejects responses whose Content-Length exceeds the in-memory cap", async () => { + const fetchMock = vi.fn(async () => { + const res = new Response("x", { status: 200 }); + // 3 GiB; Response normally derives Content-Length from the body, so + // override the header lookup instead of materializing a huge body. + vi.spyOn(res.headers, "get").mockImplementation((name) => + name.toLowerCase() === "content-length" ? String(3 * 1024 * 1024 * 1024) : null, + ); + return res; + }); + vi.stubGlobal("fetch", fetchMock); + + await expect(apiBlob("/ebooks/abc/files/1/read")).rejects.toMatchObject({ + name: "ApiClientError", + code: "response_too_large", + message: expect.stringContaining("too large to open in the browser"), + }); + }); + + it("returns the blob when Content-Length is within the cap or missing", async () => { + const fetchMock = vi.fn(async () => { + const res = new Response("epub-bytes", { status: 200 }); + vi.spyOn(res.headers, "get").mockReturnValue(null); + return res; + }); + vi.stubGlobal("fetch", fetchMock); + + const blob = await apiBlob("/ebooks/abc/files/1/read"); + await expect(blob.text()).resolves.toBe("epub-bytes"); + }); +}); + describe("api", () => { it("forwards AbortSignal from options to fetch", async () => { Object.defineProperty(globalThis, "sessionStorage", { diff --git a/web/src/api/client.ts b/web/src/api/client.ts index c227efb0..a19ff289 100644 --- a/web/src/api/client.ts +++ b/web/src/api/client.ts @@ -401,6 +401,20 @@ function buildApiHeaders(options: RequestInit = {}): Record { return headers; } +/** + * Fire-and-forget API request that survives page unload (pagehide / tab close). + * Sends the same auth, profile, and device headers as `api`, plus `keepalive` + * so the browser finishes the request after the document is gone. The response + * is intentionally ignored: no token refresh or error handling is possible + * while the page is unloading. + */ +export function apiKeepalive(path: string, options: RequestInit = {}): void { + const headers = buildApiHeaders(options); + void fetch(`/api/v1${path}`, { ...options, headers, keepalive: true }).catch(() => { + // Best-effort write during unload; nothing left to recover into. + }); +} + /** Downloads a binary API response and triggers a browser file save. */ export async function apiDownload( path: string, @@ -437,6 +451,51 @@ export async function apiDownload( URL.revokeObjectURL(url); } +/** + * apiBlob buffers the entire response body in memory, so cap what it will + * accept; beyond this a download is the right tool, not an in-tab blob. + */ +export const API_BLOB_MAX_BYTES = 512 * 1024 * 1024; + +export async function apiBlob(path: string, options: RequestInit = {}): Promise { + let headers = buildApiHeaders(options); + let res = await fetch(`/api/v1${path}`, { ...options, headers }); + + if (res.status === 401 && getRefreshToken()) { + if (!refreshPromise) { + refreshPromise = attemptRefresh().finally(() => { + refreshPromise = null; + }); + } + const refreshed = await refreshPromise; + if (refreshed) { + headers = buildApiHeaders(options); + headers["Authorization"] = `Bearer ${accessToken}`; + res = await fetch(`/api/v1${path}`, { ...options, headers }); + } + } + + if (!res.ok) { + throw apiClientErrorFrom(res.status, await parseApiError(res)); + } + + // Reject oversized bodies up front instead of crashing the tab while + // buffering them. When the header is absent, proceed; streaming byte counts + // are not worth the complexity here. + const contentLength = Number(res.headers.get("Content-Length")); + if (Number.isFinite(contentLength) && contentLength > API_BLOB_MAX_BYTES) { + const sizeMiB = Math.round(contentLength / (1024 * 1024)); + const limitMiB = Math.round(API_BLOB_MAX_BYTES / (1024 * 1024)); + throw new ApiClientError( + res.status, + "response_too_large", + `This file is too large to open in the browser (${sizeMiB} MiB, limit ${limitMiB} MiB). Download it instead.`, + ); + } + + return res.blob(); +} + // People API export async function searchPeople(query: string, limit = 20): Promise { const params = new URLSearchParams({ q: query, limit: String(limit) }); diff --git a/web/src/api/types.ts b/web/src/api/types.ts index efc4a80e..ae62dc73 100644 --- a/web/src/api/types.ts +++ b/web/src/api/types.ts @@ -569,6 +569,16 @@ export interface AudiobookDetailExtension { }; } +export interface EbookDetailExtension { + authors: AudiobookPerson[]; + publisher?: string; + series?: AudiobookSeriesGroup; + related: { + also_by_author: AudiobookRelatedItem[]; + similar: AudiobookRelatedItem[]; + }; +} + // Seasons / Watched State export interface LeafItemUserData { played: boolean; @@ -652,7 +662,7 @@ export interface BrowseItemSortMetrics { export interface BrowseItem { content_id: string; - type: "movie" | "series" | "season" | "episode" | "audiobook"; + type: "movie" | "series" | "season" | "episode" | "audiobook" | "ebook"; title: string; series_title?: string; season_number?: number | null; @@ -938,7 +948,7 @@ export type SetMarkersRequest = Partial { expect(markup).toContain('src="/movie-poster.jpg"'); }); + it("links ebook continue rows to the reader and shows percent read", () => { + const queryClient = new QueryClient(); + const markup = renderToStaticMarkup( + + + + + , + ); + + expect(markup).toContain('href="/reader/ebook/ebook%20001?libraryId=12"'); + expect(markup).toContain('href="/item/ebook%20001?libraryId=12"'); + expect(markup).toContain("42% read"); + expect(markup).not.toContain('href="/watch/ebook'); + expect(markup).not.toContain("0 min left"); + }); + it("renders separate watch and item links alongside episodic metadata", () => { const queryClient = new QueryClient(); const markup = renderToStaticMarkup( diff --git a/web/src/components/ContinueWatchingCard.tsx b/web/src/components/ContinueWatchingCard.tsx index 977b3eb2..97a90599 100644 --- a/web/src/components/ContinueWatchingCard.tsx +++ b/web/src/components/ContinueWatchingCard.tsx @@ -1,5 +1,5 @@ import ViewTransitionLink from "@/components/ViewTransitionLink"; -import { Play } from "lucide-react"; +import { BookOpen, Play } from "lucide-react"; import { useCallback } from "react"; import { useLocation } from "react-router"; import type { ItemDetail, SectionItem } from "@/api/types"; @@ -132,11 +132,13 @@ export default function ContinueWatchingCard(props: ContinueWatchingCardProps) { ? premiereBadge ? null : "Next Episode" - : card.durationSeconds > 0 - ? card.type === "audiobook" - ? formatListeningTimeLeft(card.positionSeconds, card.durationSeconds) - : `${Math.round((card.durationSeconds - card.positionSeconds) / 60)} min left` - : "\u00A0"; + : card.type === "ebook" + ? `${Math.round(Math.min(Math.max(progressPercent, 0), 100))}% read` + : card.durationSeconds > 0 + ? card.type === "audiobook" + ? formatListeningTimeLeft(card.positionSeconds, card.durationSeconds) + : `${Math.round((card.durationSeconds - card.positionSeconds) / 60)} min left` + : "\u00A0"; const handleWatchClick = useCallback( (event: React.MouseEvent) => { if ( @@ -251,10 +253,14 @@ export default function ContinueWatchingCard(props: ContinueWatchingCardProps) { - + {card.type === "ebook" ? ( + + ) : ( + + )} ({ + buildDirectDownloadUrl: (fileId: number) => `/api/downloads/files/${fileId}`, +})); + +function version(overrides: Partial): FileVersion { + return { + file_id: overrides.file_id ?? 1, + file_name: overrides.file_name, + file_path: overrides.file_path, + resolution: overrides.resolution ?? "", + codec_video: overrides.codec_video ?? "", + codec_audio: overrides.codec_audio ?? "", + hdr: overrides.hdr ?? false, + container: overrides.container ?? "", + file_size: overrides.file_size ?? 0, + duration: overrides.duration ?? 0, + bitrate: overrides.bitrate ?? 0, + }; +} + +describe("DownloadVersionPicker", () => { + it("uses file-size copy instead of quality copy for multi-file downloads", () => { + render( + undefined} + title="A Psalm for the Wild-Built" + versions={[ + version({ file_id: 1, container: "epub", file_size: 512 * 1024 }), + version({ file_id: 2, container: "pdf", file_size: 2 * 1024 * 1024 }), + ]} + />, + ); + + expect(screen.getByText("Larger files require more storage space.")).toBeTruthy(); + expect(screen.queryByText("Higher quality files require more storage space.")).toBeNull(); + }); + + it("describes download choices as files instead of versions", () => { + render( + undefined} + title="A Psalm for the Wild-Built" + versions={[version({ file_id: 1, container: "epub", file_size: 512 * 1024 })]} + />, + ); + + expect( + screen.getByText("Choose a file to download. Make sure you have enough disk space."), + ).toBeTruthy(); + expect( + screen.queryByText("Choose a version to download. Make sure you have enough disk space."), + ).toBeNull(); + }); + + it("allows ebook download rows to show page counts", () => { + render( + undefined} + title="A Psalm for the Wild-Built" + versions={[ + version({ + file_id: 1, + container: "cbz", + file_size: 25 * 1024 ** 2, + duration: 48, + }), + ]} + summaryBuilder={(file) => `${file.container.toUpperCase()} · 48 pages`} + />, + ); + + expect(screen.getByText("CBZ · 48 pages")).toBeTruthy(); + }); +}); diff --git a/web/src/components/DownloadVersionPicker.tsx b/web/src/components/DownloadVersionPicker.tsx index 4b2502d7..36cbe2aa 100644 --- a/web/src/components/DownloadVersionPicker.tsx +++ b/web/src/components/DownloadVersionPicker.tsx @@ -18,6 +18,7 @@ interface DownloadVersionPickerProps { onOpenChange: (open: boolean) => void; versions: FileVersion[]; title?: string; + summaryBuilder?: (version: FileVersion) => string; } export default function DownloadVersionPicker({ @@ -25,6 +26,7 @@ export default function DownloadVersionPicker({ onOpenChange, versions, title, + summaryBuilder, }: DownloadVersionPickerProps) { const sorted = sortByResolution(versions); const [downloading, setDownloading] = useState(null); @@ -60,14 +62,14 @@ export default function DownloadVersionPicker({ Download{title ? `: ${title}` : ""} - Choose a version to download. Make sure you have enough disk space. + Choose a file to download. Make sure you have enough disk space.
    {sorted.map((version) => { - const quality = buildQualitySummary(version); - const size = formatFileSize(version.file_size); + const quality = summaryBuilder?.(version) || buildQualitySummary(version); + const size = summaryBuilder ? "" : formatFileSize(version.file_size); return (
    - {isAudiobookLibrary ? null : ( + {isBookLibrary ? null : (
    @@ -604,7 +626,7 @@ export default function CollectionGuidedRulesEditor({ />
    - {isAudiobookLibrary ? null : ( + {isBookLibrary ? null : ( <>
    @@ -671,7 +693,7 @@ export default function CollectionGuidedRulesEditor({ )} - {isAudiobookLibrary ? ( + {isBookLibrary ? ( <>
    @@ -696,28 +718,30 @@ export default function CollectionGuidedRulesEditor({ /> )}
    -
    - - {catalogState ? ( - update({ narrator })} - placeholder="Search narrators..." - disabled={readOnly} - /> - ) : ( - update({ narrator })} - placeholder="Select narrator..." - disabled={readOnly} - isLoading={filtersLoading} - /> - )} -
    + {isAudiobookLibrary ? ( +
    + + {catalogState ? ( + update({ narrator })} + placeholder="Search narrators..." + disabled={readOnly} + /> + ) : ( + update({ narrator })} + placeholder="Select narrator..." + disabled={readOnly} + isLoading={filtersLoading} + /> + )} +
    + ) : null}
    @@ -782,7 +806,7 @@ export default function CollectionGuidedRulesEditor({ {allowPersonalizedFilters ? (
    - + @@ -810,7 +830,7 @@ export default function CollectionGuidedRulesEditor({ ) : null}
    - {isAudiobookLibrary ? null : ( + {isBookLibrary ? null : (
    diff --git a/web/src/components/collections/CollectionRulesEditor.test.tsx b/web/src/components/collections/CollectionRulesEditor.test.tsx new file mode 100644 index 00000000..1c43ff49 --- /dev/null +++ b/web/src/components/collections/CollectionRulesEditor.test.tsx @@ -0,0 +1,29 @@ +import { renderToStaticMarkup } from "react-dom/server"; +import { describe, expect, it, vi } from "vitest"; + +import { createEmptyQueryDefinition } from "@/api/types"; + +import CollectionRulesEditor from "./CollectionRulesEditor"; + +vi.mock("@/components/FilterRuleEditor", () => ({ + default: ({ mediaScope }: { mediaScope?: string }) => ( +
    filter rule editor mediaScope:{mediaScope}
    + ), +})); + +describe("CollectionRulesEditor", () => { + it("forwards ebook media scope to advanced rule labels", () => { + const markup = renderToStaticMarkup( + {}} + allowPersonalizedFilters + />, + ); + + expect(markup).toContain("mediaScope:ebook"); + }); +}); diff --git a/web/src/components/collections/CollectionRulesEditor.tsx b/web/src/components/collections/CollectionRulesEditor.tsx index 97ec09f9..e4961021 100644 --- a/web/src/components/collections/CollectionRulesEditor.tsx +++ b/web/src/components/collections/CollectionRulesEditor.tsx @@ -70,7 +70,7 @@ export default function CollectionRulesEditor({ media_scope: next === "all" ? undefined - : (next as "movie" | "series" | "episode" | "audiobook"), + : (next as "movie" | "series" | "episode" | "audiobook" | "ebook"), sort: nextSort, }); }} @@ -85,6 +85,7 @@ export default function CollectionRulesEditor({ Series Episodes Audiobooks + Ebooks
    @@ -110,6 +111,7 @@ export default function CollectionRulesEditor({ allowPersonalizedFilters={allowPersonalizedFilters} allowPersonalizedSorts={allowPersonalizedSorts} sortRelevanceScope={sortRelevanceScope} + mediaScope={value.media_scope ?? "all"} onChange={(next) => onChange({ ...value, diff --git a/web/src/components/sections/EditableSectionRows.tsx b/web/src/components/sections/EditableSectionRows.tsx index 26c9777a..fcd17a19 100644 --- a/web/src/components/sections/EditableSectionRows.tsx +++ b/web/src/components/sections/EditableSectionRows.tsx @@ -79,6 +79,7 @@ export function SectionSummaryBadges({ {queryDefinition.media_scope === "audiobook" ? ( Audiobooks ) : null} + {queryDefinition.media_scope === "ebook" ? Ebooks : null} {libraries ? queryDefinition.library_ids.map((libraryId) => { const library = libraries.find((entry) => entry.id === libraryId); diff --git a/web/src/components/sections/SectionEditorDrawer.tsx b/web/src/components/sections/SectionEditorDrawer.tsx index 272c6ada..50a39eab 100644 --- a/web/src/components/sections/SectionEditorDrawer.tsx +++ b/web/src/components/sections/SectionEditorDrawer.tsx @@ -479,7 +479,7 @@ export default function SectionEditorDrawer(props: SectionEditorDrawerProps) { media_scope: value === "all" ? undefined - : (value as "movie" | "series" | "episode" | "audiobook"), + : (value as "movie" | "series" | "episode" | "audiobook" | "ebook"), }) } > @@ -492,6 +492,7 @@ export default function SectionEditorDrawer(props: SectionEditorDrawerProps) { Series Episodes Audiobooks + Ebooks
    diff --git a/web/src/hooks/queries/catalogRead.test.ts b/web/src/hooks/queries/catalogRead.test.ts index 8aa47bee..139eebfa 100644 --- a/web/src/hooks/queries/catalogRead.test.ts +++ b/web/src/hooks/queries/catalogRead.test.ts @@ -11,6 +11,7 @@ vi.mock("@/api/client", () => ({ import { fetchCatalogItemDetail, fetchCatalogItemEpisodes, + fetchCatalogItemVersions, fetchCatalogSeasonDetail, fetchCatalogSeasonEpisodes, fetchCatalogSeriesSeasons, @@ -28,6 +29,28 @@ describe("catalog read helpers", () => { expect(mocks.api).toHaveBeenCalledWith("/catalog/items/movie-123", undefined); }); + it("encodes item IDs in catalog item endpoints", async () => { + await fetchCatalogItemDetail("ebook 1/isbn:978", 12); + await fetchCatalogItemVersions("ebook 1/isbn:978"); + await fetchCatalogItemEpisodes("season 1/id:abc"); + + expect(mocks.api).toHaveBeenNthCalledWith( + 1, + "/catalog/items/ebook%201%2Fisbn%3A978?library_id=12", + undefined, + ); + expect(mocks.api).toHaveBeenNthCalledWith( + 2, + "/catalog/items/ebook%201%2Fisbn%3A978/versions", + undefined, + ); + expect(mocks.api).toHaveBeenNthCalledWith( + 3, + "/catalog/items/season%201%2Fid%3Aabc/episodes", + undefined, + ); + }); + it("fetches item episodes from the canonical catalog item episodes endpoint", async () => { await fetchCatalogItemEpisodes("season-4"); diff --git a/web/src/hooks/queries/catalogRead.ts b/web/src/hooks/queries/catalogRead.ts index 832071bc..4500d481 100644 --- a/web/src/hooks/queries/catalogRead.ts +++ b/web/src/hooks/queries/catalogRead.ts @@ -10,20 +10,24 @@ import type { } from "@/api/types"; import { catalogKeys } from "./keys"; +function catalogPathID(id: string): string { + return encodeURIComponent(id); +} + export async function fetchCatalogItemDetail( id: string, libraryId?: number, options?: RequestInit, ): Promise { const query = libraryId ? `?library_id=${libraryId}` : ""; - return api(`/catalog/items/${id}${query}`, options); + return api(`/catalog/items/${catalogPathID(id)}${query}`, options); } export async function fetchCatalogItemVersions( id: string, options?: RequestInit, ): Promise { - return api(`/catalog/items/${id}/versions`, options); + return api(`/catalog/items/${catalogPathID(id)}/versions`, options); } export async function fetchCatalogItemEpisodes( @@ -32,7 +36,7 @@ export async function fetchCatalogItemEpisodes( options?: RequestInit, ): Promise { const query = libraryId ? `?library_id=${libraryId}` : ""; - return api(`/catalog/items/${id}/episodes${query}`, options); + return api(`/catalog/items/${catalogPathID(id)}/episodes${query}`, options); } export async function fetchCatalogSeriesSeasons( @@ -41,7 +45,10 @@ export async function fetchCatalogSeriesSeasons( options?: RequestInit, ): Promise { const query = libraryId ? `?library_id=${libraryId}` : ""; - return api(`/catalog/series/${seriesId}/seasons${query}`, options); + return api( + `/catalog/series/${catalogPathID(seriesId)}/seasons${query}`, + options, + ); } export async function fetchCatalogSeasonDetail( @@ -52,7 +59,7 @@ export async function fetchCatalogSeasonDetail( ): Promise { const query = libraryId ? `?library_id=${libraryId}` : ""; return api( - `/catalog/series/${seriesId}/seasons/${seasonNum}${query}`, + `/catalog/series/${catalogPathID(seriesId)}/seasons/${seasonNum}${query}`, options, ); } @@ -65,7 +72,7 @@ export async function fetchCatalogSeasonEpisodes( ): Promise { const query = libraryId ? `?library_id=${libraryId}` : ""; return api( - `/catalog/series/${seriesId}/seasons/${seasonNum}/episodes${query}`, + `/catalog/series/${catalogPathID(seriesId)}/seasons/${seasonNum}/episodes${query}`, options, ); } diff --git a/web/src/hooks/queries/ebookReaderProgress.ts b/web/src/hooks/queries/ebookReaderProgress.ts new file mode 100644 index 00000000..95a892a1 --- /dev/null +++ b/web/src/hooks/queries/ebookReaderProgress.ts @@ -0,0 +1,11 @@ +import { useQuery } from "@tanstack/react-query"; + +import { ebookReaderProgressQueryKey, fetchEbookReaderProgress } from "@/reader/FoliateBookReader"; + +export function useEbookReaderProgress(contentID: string | undefined) { + return useQuery({ + queryKey: ebookReaderProgressQueryKey(contentID), + queryFn: () => fetchEbookReaderProgress(contentID!), + enabled: !!contentID, + }); +} diff --git a/web/src/hooks/queries/homeDismissals.test.ts b/web/src/hooks/queries/homeDismissals.test.ts index a16a1d05..bb61e663 100644 --- a/web/src/hooks/queries/homeDismissals.test.ts +++ b/web/src/hooks/queries/homeDismissals.test.ts @@ -91,6 +91,27 @@ describe("home dismissal query hooks", () => { }); }); + it("encodes item IDs in the dismissal path", async () => { + useDismissHomeItem(); + const mutation = latestMutationOptions(); + + await mutation.mutationFn({ + itemId: "ebook 1/isbn:978", + surface: "continue_watching", + progressUpdatedAt: "2026-03-22T18:10:00Z", + }); + + expect(mocks.api).toHaveBeenCalledWith( + "/home/dismissals/continue_watching/ebook%201%2Fisbn%3A978", + { + method: "PUT", + body: JSON.stringify({ + progress_updated_at: "2026-03-22T18:10:00Z", + }), + }, + ); + }); + it("calls the next up dismissal endpoint with series_id", async () => { useDismissHomeItem(); const mutation = latestMutationOptions(); @@ -162,4 +183,27 @@ describe("home dismissal query hooks", () => { }), ); }); + + it("uses continue reading toast copy for ebook dismissals", async () => { + useDismissHomeItem(); + const mutation = latestMutationOptions(); + + const variables: DismissHomeItemVariables = { + itemId: "ebook-1", + surface: "continue_watching", + mediaType: "ebook", + progressUpdatedAt: "2026-03-22T18:10:00Z", + }; + + await mutation.onSuccess?.(undefined, variables); + + expect(mocks.toastSuccess).toHaveBeenCalledWith( + "Removed from Continue Reading", + expect.objectContaining({ + action: expect.objectContaining({ + label: "Undo", + }), + }), + ); + }); }); diff --git a/web/src/hooks/queries/homeDismissals.ts b/web/src/hooks/queries/homeDismissals.ts index cdfa1bc7..a1422a6f 100644 --- a/web/src/hooks/queries/homeDismissals.ts +++ b/web/src/hooks/queries/homeDismissals.ts @@ -18,7 +18,7 @@ export interface DismissHomeItemVariables { } function dismissalPath({ itemId, surface }: DismissHomeItemVariables) { - return `/home/dismissals/${surface}/${itemId}`; + return `/home/dismissals/${surface}/${encodeURIComponent(itemId)}`; } function dismissalBody({ progressUpdatedAt, seriesId, surface }: DismissHomeItemVariables) { @@ -29,9 +29,9 @@ function dismissalBody({ progressUpdatedAt, seriesId, surface }: DismissHomeItem function dismissalSuccessLabel({ mediaType, surface }: DismissHomeItemVariables) { if (surface === "next_up") return "Removed from Next Up"; - return mediaType === "audiobook" - ? "Removed from Continue Listening" - : "Removed from Continue Watching"; + if (mediaType === "audiobook") return "Removed from Continue Listening"; + if (mediaType === "ebook") return "Removed from Continue Reading"; + return "Removed from Continue Watching"; } export function useDismissHomeItem() { diff --git a/web/src/hooks/queries/items.test.ts b/web/src/hooks/queries/items.test.ts new file mode 100644 index 00000000..eb3dead8 --- /dev/null +++ b/web/src/hooks/queries/items.test.ts @@ -0,0 +1,130 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + api: vi.fn(), + invalidateMediaSurfaceQueries: vi.fn(), + toastSuccess: vi.fn(), + useMutation: vi.fn(), + useQueryClient: vi.fn(), +})); + +vi.mock("@tanstack/react-query", async () => { + const actual = + await vi.importActual("@tanstack/react-query"); + + return { + ...actual, + useMutation: (...args: unknown[]) => mocks.useMutation(...args), + useQueryClient: () => mocks.useQueryClient(), + }; +}); + +vi.mock("@/api/client", () => ({ + api: mocks.api, +})); + +vi.mock("@/components/realtimeEventsContext", () => ({ + useRealtimeEvents: () => ({ awaitAdminJob: vi.fn() }), +})); + +vi.mock("@/pages/ItemDetail/watchedState", async () => { + const actual = await vi.importActual( + "@/pages/ItemDetail/watchedState", + ); + + return { + ...actual, + getCachedWatchedInvalidationKeys: vi.fn(() => []), + }; +}); + +vi.mock("./mediaSurfaceRefresh", () => ({ + invalidateMediaSurfaceQueries: (...args: unknown[]) => + mocks.invalidateMediaSurfaceQueries(...args), +})); + +vi.mock("@/pages/homeSurfaceRefresh", () => ({ + bumpHomeRefreshSignal: vi.fn(), +})); + +vi.mock("sonner", () => ({ + toast: { + error: vi.fn(), + success: (...args: unknown[]) => mocks.toastSuccess(...args), + }, +})); + +import { fetchWatchDetail, redetectEpisodeIntro, useWatchedStateMutation } from "./items"; + +type WatchedMutationOptions = { + mutationFn: (nextPlayed: boolean) => Promise; + onSuccess?: (data: unknown, nextPlayed: boolean) => void; + onSettled?: () => Promise; +}; + +describe("item query helpers", () => { + beforeEach(() => { + mocks.api.mockReset(); + mocks.api.mockResolvedValue({}); + mocks.invalidateMediaSurfaceQueries.mockReset(); + mocks.toastSuccess.mockReset(); + mocks.useMutation.mockReset(); + mocks.useMutation.mockImplementation((options: unknown) => ({ + ...(options as object), + mutate: vi.fn(), + })); + mocks.useQueryClient.mockReset(); + mocks.useQueryClient.mockReturnValue({}); + }); + + it("encodes item IDs in watch detail endpoints", async () => { + await fetchWatchDetail("ebook 1/isbn:978", 42, 12); + + expect(mocks.api).toHaveBeenCalledWith( + "/watch/ebook%201%2Fisbn%3A978?fileId=42&library_id=12", + undefined, + ); + }); + + it("encodes item IDs in admin item endpoints", async () => { + await redetectEpisodeIntro("episode 1/id:abc"); + + expect(mocks.api).toHaveBeenCalledWith("/admin/items/episode%201%2Fid%3Aabc/redetect-intro", { + method: "POST", + }); + }); + + it("toggles ebook read state through the watched endpoint", async () => { + useWatchedStateMutation({ content_id: "ebook 1/isbn:978", type: "ebook" }); + const options = mocks.useMutation.mock.calls[ + mocks.useMutation.mock.calls.length - 1 + ]?.[0] as WatchedMutationOptions; + + await options.mutationFn(true); + expect(mocks.api).toHaveBeenCalledWith("/watched/ebook%201%2Fisbn%3A978", { method: "POST" }); + + await options.mutationFn(false); + expect(mocks.api).toHaveBeenCalledWith("/watched/ebook%201%2Fisbn%3A978", { + method: "DELETE", + }); + }); + + it("uses read toast copy and refreshes surfaces for ebook watched toggles", async () => { + useWatchedStateMutation({ content_id: "ebook-1", type: "ebook" }); + const options = mocks.useMutation.mock.calls[ + mocks.useMutation.mock.calls.length - 1 + ]?.[0] as WatchedMutationOptions; + + options.onSuccess?.(undefined, true); + expect(mocks.toastSuccess).toHaveBeenCalledWith("Marked as read"); + + options.onSuccess?.(undefined, false); + expect(mocks.toastSuccess).toHaveBeenCalledWith("Marked as unread"); + + await options.onSettled?.(); + expect(mocks.invalidateMediaSurfaceQueries).toHaveBeenCalledWith(expect.anything(), { + itemId: "ebook-1", + watchedKeys: [], + }); + }); +}); diff --git a/web/src/hooks/queries/items.ts b/web/src/hooks/queries/items.ts index de879a3f..af851781 100644 --- a/web/src/hooks/queries/items.ts +++ b/web/src/hooks/queries/items.ts @@ -13,10 +13,17 @@ import type { } from "@/api/types"; import { adminKeys, catalogKeys, episodeKeys, itemKeys, sectionKeys } from "./keys"; import { toast } from "sonner"; -import { getCachedWatchedInvalidationKeys } from "@/pages/ItemDetail/watchedState"; +import { + getCachedWatchedInvalidationKeys, + getWatchedToastMessage, +} from "@/pages/ItemDetail/watchedState"; import { invalidateMediaSurfaceQueries } from "./mediaSurfaceRefresh"; import { bumpHomeRefreshSignal } from "@/pages/homeSurfaceRefresh"; +function itemPathID(id: string): string { + return encodeURIComponent(id); +} + export async function fetchWatchDetail( id: string, fileId?: number, @@ -27,7 +34,7 @@ export async function fetchWatchDetail( if (fileId != null) searchParams.set("fileId", String(fileId)); if (libraryId != null) searchParams.set("library_id", String(libraryId)); const query = searchParams.toString(); - return api(`/watch/${id}${query ? `?${query}` : ""}`, options); + return api(`/watch/${itemPathID(id)}${query ? `?${query}` : ""}`, options); } export function useWatchDetail(id: string | undefined, fileId?: number, libraryId?: number) { @@ -64,10 +71,13 @@ export function useRefreshItemMetadata() { const { awaitAdminJob } = useRealtimeEvents(); return useMutation({ mutationFn: async ({ item, mode }: RefreshItemMetadataVariables) => { - const job = await api(`/admin/items/${item.content_id}/refresh-metadata`, { - method: "POST", - body: JSON.stringify({ mode }), - }); + const job = await api( + `/admin/items/${itemPathID(item.content_id)}/refresh-metadata`, + { + method: "POST", + body: JSON.stringify({ mode }), + }, + ); const completed = await awaitAdminJob(job.id); return { job: completed }; }, @@ -169,7 +179,7 @@ export interface RedetectEpisodeIntroResponse { export async function redetectEpisodeIntro( episodeId: string, ): Promise { - return api(`/admin/items/${episodeId}/redetect-intro`, { + return api(`/admin/items/${itemPathID(episodeId)}/redetect-intro`, { method: "POST", }); } @@ -226,7 +236,7 @@ export function useUpdateItemMetadata(contentId: string) { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: UpdateItemMetadataRequest) => - api(`/admin/items/${contentId}/metadata`, { + api(`/admin/items/${itemPathID(contentId)}/metadata`, { method: "PATCH", body: JSON.stringify(data), }), @@ -252,14 +262,14 @@ export function useWatchedStateMutation(item: WatchedMutationItem) { return useMutation({ mutationFn: (nextPlayed: boolean) => - api(`/watched/${item.content_id}`, { + api(`/watched/${itemPathID(item.content_id)}`, { method: nextPlayed ? "POST" : "DELETE", }), onError: (err) => { toast.error(err instanceof Error ? err.message : "Failed to update watched state"); }, onSuccess: (_data, nextPlayed) => { - toast.success(nextPlayed ? "Marked as watched" : "Marked as unwatched"); + toast.success(getWatchedToastMessage(item, nextPlayed)); }, onSettled: async () => { await invalidateMediaSurfaceQueries(queryClient, { @@ -276,7 +286,7 @@ export function useSearchItemMatchCandidates(contentId: string) { return useMutation({ mutationFn: (params: ItemMatchSearchRequest) => - api(`/admin/items/${contentId}/match/search`, { + api(`/admin/items/${itemPathID(contentId)}/match/search`, { method: "POST", body: JSON.stringify(params), }), @@ -300,7 +310,7 @@ export function useApplyItemMatch() { item: ApplyMatchItem; providerIds: Record; }) => { - return api(`/admin/items/${item.content_id}/match/apply`, { + return api(`/admin/items/${itemPathID(item.content_id)}/match/apply`, { method: "POST", body: JSON.stringify({ provider_ids: providerIds }), }); @@ -365,7 +375,7 @@ export function useApplyItemMatch() { export function useItemImages(contentId: string | undefined, enabled = true) { return useQuery({ queryKey: adminKeys.itemImages(contentId!), - queryFn: () => api(`/admin/items/${contentId}/images`), + queryFn: () => api(`/admin/items/${itemPathID(contentId!)}/images`), enabled: !!contentId && enabled, staleTime: 5 * 60_000, }); @@ -384,7 +394,7 @@ export function useApplyItemImage() { item: ApplyImageItem; request: ApplyItemImageRequest; }) => - api(`/admin/items/${item.content_id}/images/apply`, { + api(`/admin/items/${itemPathID(item.content_id)}/images/apply`, { method: "POST", body: JSON.stringify(request), }), diff --git a/web/src/hooks/queries/keys.ts b/web/src/hooks/queries/keys.ts index 5669ea1f..7aa8a5bd 100644 --- a/web/src/hooks/queries/keys.ts +++ b/web/src/hooks/queries/keys.ts @@ -187,6 +187,10 @@ export const episodeKeys = { byItem: (itemId: string) => ["episodes", "item", itemId] as const, }; +export const ebookKeys = { + readerProgress: (contentId: string | undefined) => ["ebook-reader-progress", contentId] as const, +}; + export const libraryKeys = { all: ["libraries"] as const, user: (profileId?: string | null) => ["libraries", "user", profileId ?? "none"] as const, diff --git a/web/src/hooks/useScreenWakeLock.ts b/web/src/hooks/useScreenWakeLock.ts new file mode 100644 index 00000000..3a9e9639 --- /dev/null +++ b/web/src/hooks/useScreenWakeLock.ts @@ -0,0 +1,51 @@ +import { useEffect, useRef } from "react"; + +export function useScreenWakeLock(active: boolean) { + const sentinelRef = useRef(null); + + useEffect(() => { + if (!active) { + sentinelRef.current?.release().catch(() => {}); + sentinelRef.current = null; + return; + } + if (!("wakeLock" in navigator)) return; + + let cancelled = false; + const acquire = async () => { + try { + const sentinel = await ( + navigator as Navigator & { + wakeLock: { request: (type: "screen") => Promise }; + } + ).wakeLock.request("screen"); + if (cancelled) { + await sentinel.release().catch(() => {}); + return; + } + sentinelRef.current = sentinel; + } catch { + // Unsupported or denied; reading still works without it. + } + }; + void acquire(); + + const onVisible = () => { + if (document.visibilityState === "visible" && !sentinelRef.current) { + void acquire(); + } + }; + document.addEventListener("visibilitychange", onVisible); + + return () => { + cancelled = true; + document.removeEventListener("visibilitychange", onVisible); + sentinelRef.current?.release().catch(() => {}); + sentinelRef.current = null; + }; + }, [active]); +} + +interface WakeLockSentinel { + release(): Promise; +} diff --git a/web/src/hooks/useTTS.test.ts b/web/src/hooks/useTTS.test.ts new file mode 100644 index 00000000..55d0e3a0 --- /dev/null +++ b/web/src/hooks/useTTS.test.ts @@ -0,0 +1,243 @@ +// @vitest-environment jsdom + +import { act, cleanup, renderHook } from "@testing-library/react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import { useTTS } from "./useTTS"; + +class FakeUtterance { + text: string; + rate = 1; + pitch = 1; + volume = 1; + lang = ""; + voice: SpeechSynthesisVoice | null = null; + onend: (() => void) | null = null; + onerror: (() => void) | null = null; + + constructor(text: string) { + this.text = text; + } +} + +type FakeSynth = { + speak: ReturnType; + cancel: ReturnType; + pause: ReturnType; + resume: ReturnType; + getVoices: ReturnType; + addEventListener: ReturnType; + removeEventListener: ReturnType; + spoken: FakeUtterance[]; +}; + +// Browsers dispatch a synthetic event on the in-flight utterance when cancel() +// is called: Chromium fires end, Firefox fires error. +function installFakeSpeechSynthesis(cancelEvent: "end" | "error"): FakeSynth { + const spoken: FakeUtterance[] = []; + let inFlight: FakeUtterance | null = null; + const synth: FakeSynth = { + spoken, + speak: vi.fn((utterance: FakeUtterance) => { + inFlight = utterance; + spoken.push(utterance); + }), + cancel: vi.fn(() => { + const utterance = inFlight; + inFlight = null; + if (!utterance) return; + if (cancelEvent === "end") utterance.onend?.(); + else utterance.onerror?.(); + }), + pause: vi.fn(), + resume: vi.fn(), + getVoices: vi.fn(() => []), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + }; + vi.stubGlobal("speechSynthesis", synth); + vi.stubGlobal("SpeechSynthesisUtterance", FakeUtterance); + return synth; +} + +type FakeMediaSession = { + metadata: unknown; + playbackState: string; + setActionHandler: ReturnType; +}; + +function installFakeMediaSession(): FakeMediaSession { + const mediaSession: FakeMediaSession = { + metadata: null, + playbackState: "none", + setActionHandler: vi.fn(), + }; + Object.defineProperty(navigator, "mediaSession", { + value: mediaSession, + configurable: true, + }); + vi.stubGlobal( + "MediaMetadata", + class { + title: string; + constructor(init: { title?: string } = {}) { + this.title = init.title ?? ""; + } + }, + ); + return mediaSession; +} + +// Long enough to split into multiple queue chunks. +const MULTI_CHUNK_TEXT = "First sentence here. Second sentence here. Third sentence here."; + +describe("useTTS", () => { + beforeEach(() => { + installFakeMediaSession(); + }); + + afterEach(() => { + // Unmount while the fake speechSynthesis is still installed; the hook's + // effect cleanup dereferences window.speechSynthesis. + cleanup(); + vi.unstubAllGlobals(); + }); + + it("speaks chunks sequentially and returns to idle when the queue drains", () => { + const synth = installFakeSpeechSynthesis("end"); + const { result } = renderHook(() => useTTS()); + + act(() => { + result.current.speak("One. Two."); + }); + expect(result.current.state).toBe("speaking"); + expect(synth.spoken).toHaveLength(1); + expect(synth.spoken[0]!.text).toBe("One."); + + act(() => { + synth.spoken[0]!.onend?.(); + }); + expect(synth.spoken).toHaveLength(2); + expect(synth.spoken[1]!.text).toBe("Two."); + + act(() => { + synth.spoken[1]!.onend?.(); + }); + expect(result.current.state).toBe("idle"); + expect(synth.spoken).toHaveLength(2); + }); + + it("stop stays stopped when cancel dispatches end on the in-flight utterance (Chromium)", () => { + const synth = installFakeSpeechSynthesis("end"); + const { result } = renderHook(() => useTTS()); + + act(() => { + result.current.speak(MULTI_CHUNK_TEXT); + }); + expect(synth.spoken).toHaveLength(1); + // Capture the handler as the browser's event loop would have: an end event + // already dispatched for the in-flight utterance may race the cancel. + const racingHandler = synth.spoken[0]!.onend; + + act(() => { + result.current.stop(); + racingHandler?.(); + }); + + expect(synth.cancel).toHaveBeenCalled(); + expect(synth.spoken).toHaveLength(1); + expect(result.current.state).toBe("idle"); + }); + + it("stop stays stopped when cancel dispatches error on the in-flight utterance (Firefox)", () => { + const synth = installFakeSpeechSynthesis("error"); + const { result } = renderHook(() => useTTS()); + + act(() => { + result.current.speak(MULTI_CHUNK_TEXT); + }); + const racingHandler = synth.spoken[0]!.onerror; + + act(() => { + result.current.stop(); + racingHandler?.(); + }); + + expect(synth.spoken).toHaveLength(1); + expect(result.current.state).toBe("idle"); + }); + + it("does not interleave the previous queue when a new speak starts", () => { + const synth = installFakeSpeechSynthesis("end"); + const { result } = renderHook(() => useTTS()); + + act(() => { + result.current.speak(MULTI_CHUNK_TEXT); + }); + const staleHandler = synth.spoken[0]!.onend; + + act(() => { + result.current.speak("New text. More new text."); + // A late end event from the superseded utterance must not advance the + // old queue alongside the new one. + staleHandler?.(); + }); + + expect(synth.spoken.map((utterance) => utterance.text)).toEqual([ + "First sentence here.", + "New text.", + ]); + + act(() => { + synth.spoken[1]!.onend?.(); + }); + expect(synth.spoken.map((utterance) => utterance.text)).toEqual([ + "First sentence here.", + "New text.", + "More new text.", + ]); + }); + + it("installs media session handlers on speak and clears them on stop", () => { + installFakeSpeechSynthesis("end"); + const mediaSession = navigator.mediaSession as unknown as FakeMediaSession; + const { result } = renderHook(() => useTTS()); + + act(() => { + result.current.speak("Hello there."); + }); + expect(mediaSession.metadata).not.toBeNull(); + expect(mediaSession.playbackState).toBe("playing"); + + act(() => { + result.current.stop(); + }); + expect(mediaSession.metadata).toBeNull(); + expect(mediaSession.playbackState).toBe("none"); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("play", null); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("pause", null); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("stop", null); + }); + + it("cancels speech and uninstalls the media session when unmounting mid-speech", () => { + const synth = installFakeSpeechSynthesis("end"); + const mediaSession = navigator.mediaSession as unknown as FakeMediaSession; + const { result, unmount } = renderHook(() => useTTS()); + + act(() => { + result.current.speak(MULTI_CHUNK_TEXT); + }); + expect(mediaSession.playbackState).toBe("playing"); + + unmount(); + + expect(synth.cancel).toHaveBeenCalled(); + // No chunk may start after unmount, even though cancel fired an end event. + expect(synth.spoken).toHaveLength(1); + expect(mediaSession.metadata).toBeNull(); + expect(mediaSession.playbackState).toBe("none"); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("play", null); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("pause", null); + expect(mediaSession.setActionHandler).toHaveBeenCalledWith("stop", null); + }); +}); diff --git a/web/src/hooks/useTTS.ts b/web/src/hooks/useTTS.ts new file mode 100644 index 00000000..1e1d40b2 --- /dev/null +++ b/web/src/hooks/useTTS.ts @@ -0,0 +1,149 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + +export type TTSState = "idle" | "speaking" | "paused"; + +export interface TTSOptions { + rate?: number; + pitch?: number; + volume?: number; + voiceURI?: string; + lang?: string; +} + +export function useTTS() { + const [state, setState] = useState("idle"); + const [voices, setVoices] = useState([]); + const currentUtter = useRef(null); + // speechSynthesis.cancel() dispatches end (Chromium) or error (Firefox) on the + // in-flight utterance, which would re-trigger the queued speakNext and resume + // playback. Every speak()/stop() bumps this generation; continuations from an + // older generation return without doing anything. + const generationRef = useRef(0); + + useEffect(() => { + if (typeof window === "undefined" || !("speechSynthesis" in window)) return; + const update = () => setVoices(window.speechSynthesis.getVoices()); + update(); + window.speechSynthesis.addEventListener("voiceschanged", update); + return () => window.speechSynthesis.removeEventListener("voiceschanged", update); + }, []); + + // Invalidates any in-flight queue and cancels the current utterance without + // letting its synthetic end/error event restart playback. + const cancelSpeech = useCallback(() => { + generationRef.current += 1; + const utterance = currentUtter.current; + if (utterance) { + utterance.onend = null; + utterance.onerror = null; + currentUtter.current = null; + } + window.speechSynthesis.cancel(); + }, []); + + const stop = useCallback(() => { + if (!("speechSynthesis" in window)) return; + cancelSpeech(); + uninstallMediaSession(); + setState("idle"); + }, [cancelSpeech]); + + const pause = useCallback(() => { + if (!("speechSynthesis" in window)) return; + window.speechSynthesis.pause(); + setState("paused"); + }, []); + + const resume = useCallback(() => { + if (!("speechSynthesis" in window)) return; + window.speechSynthesis.resume(); + setState("speaking"); + }, []); + + const speak = useCallback( + (text: string, opts: TTSOptions = {}) => { + if (!("speechSynthesis" in window)) return; + cancelSpeech(); + const generation = generationRef.current; + const cleaned = text.replace(/\s+/g, " ").trim(); + if (!cleaned) return; + + const sentences = cleaned.match(/[^.!?]+[.!?]+|\S[^.!?]*$/g) ?? [cleaned]; + const queue: string[] = []; + for (const sentence of sentences) { + let chunk = sentence.trim(); + while (chunk.length > 200) { + const cut = chunk.lastIndexOf(" ", 200); + queue.push(chunk.slice(0, cut > 0 ? cut : 200)); + chunk = chunk.slice(cut > 0 ? cut + 1 : 200); + } + if (chunk) queue.push(chunk); + } + + const speakNext = () => { + if (generation !== generationRef.current) return; + const next = queue.shift(); + if (!next) { + setState("idle"); + currentUtter.current = null; + uninstallMediaSession(); + return; + } + const utterance = new SpeechSynthesisUtterance(next); + utterance.rate = opts.rate ?? 1; + utterance.pitch = opts.pitch ?? 1; + utterance.volume = opts.volume ?? 1; + if (opts.lang) utterance.lang = opts.lang; + if (opts.voiceURI) { + const voice = window.speechSynthesis + .getVoices() + .find((candidate) => candidate.voiceURI === opts.voiceURI); + if (voice) utterance.voice = voice; + } + utterance.onend = speakNext; + utterance.onerror = speakNext; + currentUtter.current = utterance; + window.speechSynthesis.speak(utterance); + }; + + setState("speaking"); + installMediaSession({ title: "Read aloud" }, { pause, resume, stop }); + speakNext(); + }, + [cancelSpeech, pause, resume, stop], + ); + + useEffect(() => { + return () => { + if ("speechSynthesis" in window) cancelSpeech(); + // Unmounting mid-speech must not leave stale media session metadata or + // action handlers pointing at the dead component. + uninstallMediaSession(); + }; + }, [cancelSpeech]); + + return { state, voices, speak, pause, resume, stop }; +} + +function installMediaSession( + meta: { title?: string }, + handlers: { pause: () => void; resume: () => void; stop: () => void }, +) { + if (typeof navigator === "undefined" || !("mediaSession" in navigator)) return; + navigator.mediaSession.metadata = new window.MediaMetadata({ + title: meta.title ?? "Read aloud", + }); + navigator.mediaSession.playbackState = "playing"; + navigator.mediaSession.setActionHandler("play", handlers.resume); + navigator.mediaSession.setActionHandler("pause", handlers.pause); + navigator.mediaSession.setActionHandler("stop", handlers.stop); +} + +function uninstallMediaSession() { + if (typeof navigator === "undefined" || !("mediaSession" in navigator)) return; + navigator.mediaSession.metadata = null; + navigator.mediaSession.playbackState = "none"; + navigator.mediaSession.setActionHandler("play", null); + navigator.mediaSession.setActionHandler("pause", null); + navigator.mediaSession.setActionHandler("stop", null); +} diff --git a/web/src/lib/mediaNavigation.ts b/web/src/lib/mediaNavigation.ts index cce72115..cf9653d7 100644 --- a/web/src/lib/mediaNavigation.ts +++ b/web/src/lib/mediaNavigation.ts @@ -1,4 +1,11 @@ -type PlayableMediaType = "movie" | "series" | "season" | "episode" | "audiobook" | "podcast"; +type PlayableMediaType = + | "movie" + | "series" + | "season" + | "episode" + | "audiobook" + | "ebook" + | "podcast"; interface MediaHrefInput { contentId: string; @@ -23,15 +30,22 @@ export function buildItemHref({ contentId, libraryId, }: Pick) { - return appendQuery(`/item/${contentId}`, { libraryId }); + return appendQuery(`/item/${encodeURIComponent(contentId)}`, { libraryId }); } export function buildMediaPlayHref({ contentId, type, libraryId, restart }: MediaHrefInput) { if (type === "movie" || type === "episode") { - return appendQuery(`/watch/${contentId}`, { libraryId, restart }); + return appendQuery(`/watch/${encodeURIComponent(contentId)}`, { libraryId, restart }); } if (type === "audiobook") { - return appendQuery(`/item/${contentId}`, { libraryId, play: true, restart }); + return appendQuery(`/item/${encodeURIComponent(contentId)}`, { + libraryId, + play: true, + restart, + }); + } + if (type === "ebook") { + return appendQuery(`/reader/ebook/${encodeURIComponent(contentId)}`, { libraryId }); } return buildItemHref({ contentId, libraryId }); } diff --git a/web/src/lib/querySortOptions.test.ts b/web/src/lib/querySortOptions.test.ts new file mode 100644 index 00000000..3869d0a8 --- /dev/null +++ b/web/src/lib/querySortOptions.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from "vitest"; + +import { getQuerySortOptions } from "./querySortOptions"; + +describe("getQuerySortOptions", () => { + it("allows ebook book-native sorts without enabling narrator", () => { + const fields = getQuerySortOptions({ relevanceScope: "ebook" }).map((option) => option.value); + + expect(fields).toContain("author"); + expect(fields).toContain("series"); + expect(fields).not.toContain("narrator"); + }); + + it("uses reading labels for ebook personalized sorts", () => { + const labelsByField = new Map( + getQuerySortOptions({ includePersonalized: true, relevanceScope: "ebook" }).map((option) => [ + option.value, + option.label, + ]), + ); + + expect(labelsByField.get("date_viewed")).toBe("Date Read"); + expect(labelsByField.get("plays")).toBe("Reads"); + }); + + it("keeps video labels for movie personalized sorts", () => { + const labelsByField = new Map( + getQuerySortOptions({ includePersonalized: true, relevanceScope: "movie" }).map((option) => [ + option.value, + option.label, + ]), + ); + + expect(labelsByField.get("date_viewed")).toBe("Date Viewed"); + expect(labelsByField.get("plays")).toBe("Plays"); + }); +}); diff --git a/web/src/lib/querySortOptions.ts b/web/src/lib/querySortOptions.ts index 62b19d27..608b0b1f 100644 --- a/web/src/lib/querySortOptions.ts +++ b/web/src/lib/querySortOptions.ts @@ -1,5 +1,11 @@ export type QuerySortOrder = "asc" | "desc"; -export type QuerySortRelevanceScope = "movie" | "series" | "episode" | "audiobook" | "all"; +export type QuerySortRelevanceScope = + | "movie" + | "series" + | "episode" + | "audiobook" + | "ebook" + | "all"; export type QuerySortField = | "title" | "added_at" @@ -53,11 +59,11 @@ interface QuerySortLike { // ALL_VIDEO_SCOPES is the universe of video-side scopes — used as the // baseline for the "all" relevance scope (mixed libraries / episode // browse mode) so that sorts limited to series+episode are still -// filtered out as not universally applicable. Audiobook is explicit -// opt-in: a sort field must list "audiobook" in its applicableMediaScopes -// to be eligible for an audiobook-only library. +// filtered out as not universally applicable. Book scopes are explicit +// opt-in: a sort field must list "audiobook" or "ebook" in its +// applicableMediaScopes to be eligible for book-only libraries. const ALL_VIDEO_SCOPES: ApplicableMediaScope[] = ["movie", "series", "episode"]; -const ALL_MEDIA_SCOPES: ApplicableMediaScope[] = [...ALL_VIDEO_SCOPES, "audiobook"]; +const ALL_MEDIA_SCOPES: ApplicableMediaScope[] = [...ALL_VIDEO_SCOPES, "audiobook", "ebook"]; export const QUERY_SORT_OPTIONS: QuerySortOption[] = [ { @@ -173,16 +179,15 @@ export const QUERY_SORT_OPTIONS: QuerySortOption[] = [ personalized: true, applicableMediaScopes: ALL_MEDIA_SCOPES, }, - // Audiobook-native sorts. Author / Narrator use alphabetically-first - // person name per item; Series uses audiobook_series.series_name with - // series_index breaking ties so books within a series come back in - // narrative order. + // Book-native sorts. Author is shared by audiobooks and ebooks; narrator + // remains audiobook-only. Series is shared by the audiobook_series and + // ebook_series joins on the backend. { value: "author", label: "Author", defaultOrder: "asc", personalized: false, - applicableMediaScopes: ["audiobook"], + applicableMediaScopes: ["audiobook", "ebook"], }, { value: "narrator", @@ -196,12 +201,17 @@ export const QUERY_SORT_OPTIONS: QuerySortOption[] = [ label: "Series", defaultOrder: "asc", personalized: false, - applicableMediaScopes: ["audiobook"], + applicableMediaScopes: ["audiobook", "ebook"], }, ]; const QUERY_SORT_OPTION_MAP = new Map(QUERY_SORT_OPTIONS.map((option) => [option.value, option])); +const EBOOK_SORT_LABELS: Partial> = { + date_viewed: "Date Read", + plays: "Reads", +}; + function normalizeQuerySortOptionsConfig( input: QuerySortOptionsInput = false, ): QuerySortOptionsConfig { @@ -220,7 +230,7 @@ function optionMatchesRelevanceScope( } // "all" — applies to mixed libraries and the episode browse mode. // Match the historical baseline (universal across all video scopes) - // so series-only sorts still get normalized away. Audiobook scope is + // so series-only sorts still get normalized away. Book scopes are // intentionally not part of this baseline; see ALL_VIDEO_SCOPES. if (relevanceScope === "all") { return ALL_VIDEO_SCOPES.every((scope) => option.applicableMediaScopes.includes(scope)); @@ -235,7 +245,10 @@ export function getQuerySortOptions(input: QuerySortOptionsInput = false): Query (option) => (includePersonalized || !option.personalized) && optionMatchesRelevanceScope(option, relevanceScope), - ); + ).map((option) => { + const ebookLabel = relevanceScope === "ebook" ? EBOOK_SORT_LABELS[option.value] : undefined; + return ebookLabel ? { ...option, label: ebookLabel } : option; + }); } export function normalizeQuerySortForScope( diff --git a/web/src/pages/EbookReader.test.tsx b/web/src/pages/EbookReader.test.tsx new file mode 100644 index 00000000..36999b63 --- /dev/null +++ b/web/src/pages/EbookReader.test.tsx @@ -0,0 +1,1198 @@ +// @vitest-environment jsdom + +import { act, useEffect, useImperativeHandle, forwardRef } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { MemoryRouter, Route, Routes } from "react-router"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import type { FileVersion, ItemDetail } from "@/api/types"; +import EbookReader from "./EbookReader"; + +const mocks = vi.hoisted(() => ({ + useCatalogItemDetail: vi.fn(), + readerPrev: vi.fn(), + readerNext: vi.fn(), + readerGoTo: vi.fn(), + readerGoToFraction: vi.fn(), + readerSearch: vi.fn(), + captureReaderSettings: vi.fn(), + fetchEbookReaderConfig: vi.fn(), + saveEbookReaderConfig: vi.fn(), + saveEbookReaderConfigKeepalive: vi.fn(), + fetchEbookReaderAnnotations: vi.fn(), + createEbookReaderAnnotation: vi.fn(), + deleteEbookReaderAnnotation: vi.fn(), +})); + +vi.mock("@/hooks/queries/catalogRead", () => ({ + useCatalogItemDetail: mocks.useCatalogItemDetail, +})); + +vi.mock("@/components/PageBack", () => ({ + default: () =>
    , +})); + +vi.mock("@/reader/ebookReaderApi", () => ({ + createEbookReaderAnnotation: mocks.createEbookReaderAnnotation, + deleteEbookReaderAnnotation: mocks.deleteEbookReaderAnnotation, + fetchEbookReaderAnnotations: mocks.fetchEbookReaderAnnotations, + fetchEbookReaderConfig: mocks.fetchEbookReaderConfig, + saveEbookReaderConfig: mocks.saveEbookReaderConfig, + saveEbookReaderConfigKeepalive: mocks.saveEbookReaderConfigKeepalive, +})); + +vi.mock("@/reader/FoliateBookReader", async () => { + const actual = await vi.importActual( + "@/reader/FoliateBookReader", + ); + + return { + ...actual, + default: forwardRef< + { + prev: () => void; + next: () => void; + goTo: (href: string) => void; + goToFraction: (fraction: number) => Promise; + search: ( + query: string, + ) => Promise>; + clearSearch: () => void; + clearSelection: () => void; + createSelectionAnnotation: () => { cfi: string; selectedText: string } | null; + getReadableText: () => string; + }, + { + file: FileVersion; + settings?: unknown; + annotations?: unknown[]; + onProgressChange?: (progress: number | null) => void; + onFileLoaded?: (state: { objectUrl: string; filename: string } | null) => void; + onSelectionChange?: (selection: { cfi: string; selectedText: string } | null) => void; + onReady?: (state: { + toc: Array<{ + id: number; + label: string; + href: string; + index: number; + subitems?: Array<{ id: number; label: string; href: string; index: number }>; + }>; + }) => void; + } + >(function MockFoliateBookReader( + { file, settings, onProgressChange, onFileLoaded, onSelectionChange, onReady }, + ref, + ) { + mocks.captureReaderSettings(settings); + useImperativeHandle(ref, () => ({ + prev: mocks.readerPrev, + next: mocks.readerNext, + goTo: mocks.readerGoTo, + goToFraction: mocks.readerGoToFraction, + search: mocks.readerSearch, + clearSearch: vi.fn(), + clearSelection: () => onSelectionChange?.(null), + createSelectionAnnotation: () => ({ + cfi: "epubcfi(/6/4,/1:0,/1:12)", + selectedText: "sample text", + }), + getReadableText: () => "Readable text for speech", + })); + useEffect(() => { + onFileLoaded?.({ objectUrl: "blob:ebook", filename: "Reader.epub" }); + onProgressChange?.(0.421); + onSelectionChange?.({ + cfi: "epubcfi(/6/4,/1:0,/1:12)", + selectedText: "sample text", + }); + onReady?.({ + toc: [ + { + id: 1, + label: "Opening", + href: "chapter-1.xhtml", + index: 0, + subitems: [{ id: 2, label: "Aboard", href: "chapter-1.xhtml#aboard", index: 0 }], + }, + ], + }); + return () => onFileLoaded?.(null); + }, [onFileLoaded, onProgressChange, onReady, onSelectionChange]); + return
    reader surface {file.file_name}
    ; + }), + }; +}); + +function makeVersion(overrides: Partial = {}): FileVersion { + return { + file_id: overrides.file_id ?? 7, + file_name: overrides.file_name ?? "Reader.epub", + file_path: overrides.file_path ?? "/books/reader.epub", + resolution: "", + codec_video: "", + codec_audio: "", + hdr: false, + container: overrides.container ?? "epub", + file_size: 100, + duration: 0, + bitrate: 0, + }; +} + +function makeEbookItem( + overrides: Partial = {}, +): ItemDetail & { type: "ebook" } { + return { + content_id: "ebook-1", + type: "ebook", + title: "Reader Book", + original_title: "", + year: 2026, + overview: "", + tagline: "", + runtime: 0, + content_rating: "", + genres: [], + rating_imdb: null, + rating_tmdb: null, + rating_rt_critic: null, + rating_rt_audience: null, + imdb_id: "", + tmdb_id: "", + tvdb_id: "", + cast: [], + crew: [], + studios: [], + networks: [], + countries: [], + release_date: null, + first_air_date: null, + last_air_date: null, + poster_url: "", + poster_thumbhash: "", + backdrop_url: "", + backdrop_thumbhash: "", + logo_url: "", + season_count: null, + series_id: "", + series_title: "", + season_number: null, + episode_number: null, + episode_count: null, + air_date: null, + is_specials: false, + versions: [makeVersion()], + subtitles: [], + intro: null, + credits: null, + ...overrides, + }; +} + +function installStorage() { + const values = new Map(); + const storage = { + getItem: vi.fn((key: string) => values.get(key) ?? null), + setItem: vi.fn((key: string, value: string) => values.set(key, value)), + removeItem: vi.fn((key: string) => values.delete(key)), + clear: vi.fn(() => values.clear()), + key: vi.fn((index: number) => Array.from(values.keys())[index] ?? null), + get length() { + return values.size; + }, + } as Storage; + Object.defineProperty(window, "localStorage", { + value: storage, + configurable: true, + }); + Object.defineProperty(globalThis, "localStorage", { + value: storage, + configurable: true, + }); + return storage; +} + +function setInputValue(input: HTMLInputElement, value: string) { + const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")?.set; + setter?.call(input, value); + input.dispatchEvent(new Event("input", { bubbles: true })); +} + +describe("EbookReader", () => { + let container: HTMLDivElement; + let root: Root; + + beforeEach(() => { + ( + globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } + ).IS_REACT_ACT_ENVIRONMENT = true; + + container = document.createElement("div"); + document.body.appendChild(container); + root = createRoot(container); + installStorage(); + mocks.useCatalogItemDetail.mockReset(); + mocks.readerPrev.mockReset(); + mocks.readerNext.mockReset(); + mocks.readerGoTo.mockReset(); + mocks.readerGoToFraction.mockReset(); + mocks.readerSearch.mockReset(); + mocks.captureReaderSettings.mockReset(); + mocks.fetchEbookReaderConfig.mockReset(); + mocks.saveEbookReaderConfig.mockReset(); + mocks.saveEbookReaderConfigKeepalive.mockReset(); + mocks.fetchEbookReaderAnnotations.mockReset(); + mocks.createEbookReaderAnnotation.mockReset(); + mocks.deleteEbookReaderAnnotation.mockReset(); + mocks.readerSearch.mockResolvedValue([ + { cfi: "epubcfi(/6/8)", label: "Chapter 2", excerpt: "Shanghai harbor" }, + ]); + mocks.fetchEbookReaderConfig.mockResolvedValue({}); + mocks.saveEbookReaderConfig.mockResolvedValue({}); + mocks.fetchEbookReaderAnnotations.mockResolvedValue([]); + mocks.createEbookReaderAnnotation.mockResolvedValue({ + id: "ann-2", + content_id: "ebook-1", + kind: "highlight", + cfi_range: "epubcfi(/6/4,/1:0,/1:12)", + selected_text: "sample text", + note: "", + style: "highlight", + color: "#facc15", + }); + mocks.deleteEbookReaderAnnotation.mockResolvedValue(undefined); + localStorage.clear(); + mocks.useCatalogItemDetail.mockReturnValue({ + data: makeEbookItem(), + isLoading: false, + error: null, + }); + }); + + afterEach(async () => { + vi.useRealTimers(); + await act(async () => { + root.unmount(); + }); + container.remove(); + }); + + it("shows reader progress and wires page navigation controls", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + expect(container.textContent).toContain("42%"); + + const previous = container.querySelector( + 'button[aria-label="Previous page"]', + ); + const next = container.querySelector('button[aria-label="Next page"]'); + expect(previous).not.toBeNull(); + expect(next).not.toBeNull(); + + await act(async () => { + previous?.click(); + next?.click(); + }); + + expect(mocks.readerPrev).toHaveBeenCalledTimes(1); + expect(mocks.readerNext).toHaveBeenCalledTimes(1); + }); + + it("preserves library context on the back-to-ebook link", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + expect(container.innerHTML).toContain('href="/item/ebook-1?libraryId=12"'); + }); + + it("switches between multiple ebook files from the reader header", async () => { + mocks.useCatalogItemDetail.mockReturnValue({ + data: makeEbookItem({ + versions: [ + makeVersion({ file_id: 8, file_name: "Reader.epub", container: "epub" }), + makeVersion({ file_id: 9, file_name: "Reader.pdf", container: "pdf" }), + ], + }), + isLoading: false, + error: null, + }); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + expect(container.textContent).toContain("reader surface Reader.epub"); + const select = container.querySelector('select[aria-label="Reader file"]'); + expect(select).not.toBeNull(); + + await act(async () => { + if (!select) return; + select.value = "9"; + select.dispatchEvent(new Event("change", { bubbles: true })); + }); + + expect(container.textContent).toContain("reader surface Reader.pdf"); + }); + + it("only lists reader-supported files in the reader file selector", async () => { + mocks.useCatalogItemDetail.mockReturnValue({ + data: makeEbookItem({ + versions: [ + makeVersion({ file_id: 8, file_name: "Reader.epub", container: "epub" }), + makeVersion({ file_id: 9, file_name: "Reader.docx", container: "docx" }), + makeVersion({ file_id: 10, file_name: "Reader.pdf", container: "pdf" }), + ], + }), + isLoading: false, + error: null, + }); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const options = Array.from(container.querySelectorAll("option")).map( + (option) => option.textContent, + ); + + expect(options).toEqual(["EPUB · Reader.epub", "PDF · Reader.pdf"]); + }); + + it("falls back to a supported reader file when the requested file is unsupported", async () => { + mocks.useCatalogItemDetail.mockReturnValue({ + data: makeEbookItem({ + versions: [ + makeVersion({ file_id: 8, file_name: "Reader.epub", container: "epub" }), + makeVersion({ file_id: 9, file_name: "Reader.docx", container: "docx" }), + ], + }), + isLoading: false, + error: null, + }); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + expect(container.textContent).toContain("reader surface Reader.epub"); + expect(container.textContent).not.toContain("Unsupported ebook format."); + }); + + it("shows the table of contents and navigates to a selected section", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + expect(container.textContent).toContain("Opening"); + expect(container.textContent).toContain("Aboard"); + + const aboard = Array.from(container.querySelectorAll("button")).find( + (button) => button.textContent === "Aboard", + ); + + await act(async () => { + aboard?.click(); + }); + + expect(mocks.readerGoTo).toHaveBeenCalledWith("chapter-1.xhtml#aboard"); + }); + + it("searches inside the reader and navigates to a selected result", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const searchTab = container.querySelector( + 'button[aria-label="Search book"]', + ); + await act(async () => { + searchTab?.click(); + }); + + const input = container.querySelector('input[aria-label="Search text"]'); + await act(async () => { + if (!input) return; + setInputValue(input, "Shanghai"); + }); + + const submit = container.querySelector('button[aria-label="Run search"]'); + await act(async () => { + submit?.click(); + }); + + expect(mocks.readerSearch).toHaveBeenCalledWith("Shanghai"); + expect(container.textContent).toContain("Shanghai harbor"); + + const result = Array.from(container.querySelectorAll("button")).find( + (button) => button.textContent?.includes("Shanghai harbor"), + ); + await act(async () => { + result?.click(); + }); + + expect(mocks.readerGoTo).toHaveBeenCalledWith("epubcfi(/6/8)"); + }); + + it("loads server reader settings and passes them to the reader", async () => { + mocks.fetchEbookReaderConfig.mockResolvedValue({ + settings: { theme: "sepia", fontSize: 130 }, + }); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + await act(async () => { + await Promise.resolve(); + }); + + expect(mocks.fetchEbookReaderConfig).toHaveBeenCalledWith("ebook-1"); + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ theme: "sepia", fontSize: 130 }), + ); + }); + + it("persists reader settings to the server and local fallback", async () => { + vi.useFakeTimers(); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const theme = container.querySelector('select[aria-label="Theme"]'); + await act(async () => { + if (!theme) return; + theme.value = "dark"; + theme.dispatchEvent(new Event("change", { bubbles: true })); + }); + + await act(async () => { + vi.advanceTimersByTime(450); + }); + + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ theme: "dark" }), + ); + expect(localStorage.getItem("silo.ebook.reader.settings")).toContain('"theme":"dark"'); + expect(mocks.saveEbookReaderConfig).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + settings: expect.objectContaining({ theme: "dark" }), + }), + ); + + vi.useRealTimers(); + }); + + it("flushes a pending debounced settings save when unmounting inside the debounce window", async () => { + vi.useFakeTimers(); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const theme = container.querySelector('select[aria-label="Theme"]'); + await act(async () => { + if (!theme) return; + theme.value = "dark"; + theme.dispatchEvent(new Event("change", { bubbles: true })); + }); + expect(mocks.saveEbookReaderConfig).not.toHaveBeenCalled(); + + // Unmount before the 400ms debounce elapses (quick SPA navigation). + await act(async () => { + root.unmount(); + }); + + expect(mocks.saveEbookReaderConfig).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + settings: expect.objectContaining({ theme: "dark" }), + }), + ); + + vi.useRealTimers(); + }); + + it("flushes a pending debounced settings save with keepalive on pagehide, exactly once", async () => { + vi.useFakeTimers(); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const theme = container.querySelector('select[aria-label="Theme"]'); + await act(async () => { + if (!theme) return; + theme.value = "sepia"; + theme.dispatchEvent(new Event("change", { bubbles: true })); + }); + + await act(async () => { + window.dispatchEvent(new Event("pagehide")); + }); + + expect(mocks.saveEbookReaderConfigKeepalive).toHaveBeenCalledTimes(1); + expect(mocks.saveEbookReaderConfigKeepalive).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + settings: expect.objectContaining({ theme: "sepia" }), + }), + ); + + // The pending save was consumed: neither the debounce timer firing nor the + // unmount flush may send it again. + await act(async () => { + vi.advanceTimersByTime(450); + }); + await act(async () => { + root.unmount(); + }); + expect(mocks.saveEbookReaderConfig).not.toHaveBeenCalled(); + expect(mocks.saveEbookReaderConfigKeepalive).toHaveBeenCalledTimes(1); + + vi.useRealTimers(); + }); + + it("resets reader settings to stock defaults", async () => { + vi.useFakeTimers(); + mocks.fetchEbookReaderConfig.mockResolvedValue({ + settings: { theme: "dark", fontSize: 140, flow: "scrolled" }, + }); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + await act(async () => { + await Promise.resolve(); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const reset = container.querySelector( + 'button[aria-label="Reset reader settings"]', + ); + await act(async () => { + reset?.click(); + vi.advanceTimersByTime(450); + }); + + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ theme: "light", fontSize: 112, flow: "paginated" }), + ); + expect(mocks.saveEbookReaderConfig).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + settings: expect.objectContaining({ theme: "light", fontSize: 112, flow: "paginated" }), + }), + ); + expect(localStorage.getItem("silo.ebook.reader.settings")).toContain('"theme":"light"'); + + vi.useRealTimers(); + }); + + it("offers reliable font choices and reading profile presets", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const font = container.querySelector('select[aria-label="Font family"]'); + const fontOptions = Array.from(font?.options ?? []).map((option) => option.textContent ?? ""); + expect(fontOptions).toContain("Book default"); + expect(fontOptions).toContain("System serif"); + expect(fontOptions).toContain("System sans"); + expect(fontOptions).not.toContain("Inter"); + expect(fontOptions).not.toContain("Merriweather"); + + const comfortable = Array.from(container.querySelectorAll("button")).find((button) => + button.textContent?.includes("Comfortable"), + ); + await act(async () => { + comfortable?.click(); + }); + + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ + fontFamily: 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif', + fontSize: 112, + lineHeight: 1.75, + }), + ); + expect(comfortable?.getAttribute("aria-pressed")).toBe("true"); + }); + + it("toggles the persisted reading ruler overlay", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const ruler = container.querySelector( + 'button[aria-label="Toggle reading ruler"]', + ); + await act(async () => { + ruler?.click(); + }); + + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ readingRuler: true }), + ); + const handle = container.querySelector('[role="slider"][aria-label="Reading ruler position"]'); + expect(handle).not.toBeNull(); + expect(handle?.getAttribute("aria-valuenow")).toBe("50"); + }); + + it("constrains the reader grid so the side panel stays inside the viewport", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const main = container.querySelector("main"); + const readerPane = main?.querySelector("section"); + const sidePanel = main?.querySelector("aside"); + + expect(main?.className).toContain("overflow-hidden"); + expect(readerPane?.className).toContain("min-w-0"); + expect(sidePanel?.className).toContain("min-w-0"); + }); + + it("scrubs reader progress and supports keyboard page navigation", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const scrubber = container.querySelector( + 'input[aria-label="Reading progress"]', + ); + await act(async () => { + if (!scrubber) return; + setInputValue(scrubber, "65"); + }); + + expect(mocks.readerGoToFraction).toHaveBeenCalledWith(0.65); + + await act(async () => { + window.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowLeft" })); + window.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowRight" })); + }); + + expect(mocks.readerPrev).toHaveBeenCalledTimes(1); + expect(mocks.readerNext).toHaveBeenCalledTimes(1); + }); + + it("loads annotations, creates highlights, and deletes annotations", async () => { + mocks.fetchEbookReaderAnnotations.mockResolvedValue([ + { + id: "ann-1", + content_id: "ebook-1", + kind: "bookmark", + location: "epubcfi(/6/8)", + selected_text: "", + note: "Saved spot", + style: "highlight", + color: "#facc15", + }, + ]); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + await act(async () => { + await Promise.resolve(); + }); + + const notesTab = container.querySelector( + 'button[aria-label="Annotations and bookmarks"]', + ); + await act(async () => { + notesTab?.click(); + }); + + expect(container.textContent).toContain("Saved spot"); + + const deleteButton = container.querySelector( + 'button[aria-label="Delete annotation"]', + ); + await act(async () => { + deleteButton?.click(); + }); + + expect(mocks.deleteEbookReaderAnnotation).toHaveBeenCalledWith("ebook-1", "ann-1"); + + const highlight = container.querySelector( + 'button[aria-label="Highlight selection"]', + ); + await act(async () => { + highlight?.click(); + }); + + expect(mocks.createEbookReaderAnnotation).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + kind: "highlight", + cfi_range: "epubcfi(/6/4,/1:0,/1:12)", + selected_text: "sample text", + }), + ); + }); + + it("navigates fraction bookmarks through goToFraction and CFI annotations through goTo", async () => { + mocks.fetchEbookReaderAnnotations.mockResolvedValue([ + { + id: "ann-frac", + content_id: "ebook-1", + kind: "bookmark", + location: "fraction:0.250000", + selected_text: "", + note: "Fraction bookmark", + style: "", + color: "", + }, + { + id: "ann-cfi", + content_id: "ebook-1", + kind: "highlight", + cfi_range: "epubcfi(/6/12)", + selected_text: "CFI highlight", + note: "", + style: "highlight", + color: "#facc15", + }, + ]); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const notesTab = container.querySelector( + 'button[aria-label="Annotations and bookmarks"]', + ); + await act(async () => { + notesTab?.click(); + }); + + const buttons = Array.from(container.querySelectorAll("button")); + const fractionBookmark = buttons.find((button) => + button.textContent?.includes("Fraction bookmark"), + ); + await act(async () => { + fractionBookmark?.click(); + }); + + expect(mocks.readerGoToFraction).toHaveBeenCalledWith(0.25); + expect(mocks.readerGoTo).not.toHaveBeenCalled(); + + const cfiHighlight = buttons.find((button) => button.textContent?.includes("CFI highlight")); + await act(async () => { + cfiHighlight?.click(); + }); + + expect(mocks.readerGoTo).toHaveBeenCalledWith("epubcfi(/6/12)"); + }); + + it("keeps settings changed before the server config arrives and persists them", async () => { + let resolveConfig!: (config: Record) => void; + mocks.fetchEbookReaderConfig.mockReturnValue( + new Promise>((resolve) => { + resolveConfig = resolve; + }), + ); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const theme = container.querySelector('select[aria-label="Theme"]'); + await act(async () => { + if (!theme) return; + theme.value = "dark"; + theme.dispatchEvent(new Event("change", { bubbles: true })); + }); + + await act(async () => { + resolveConfig({ settings: { theme: "sepia", fontSize: 130 } }); + }); + + // The late server config must not clobber the user's in-flight change... + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ theme: "dark" }), + ); + // ...and the user's settings win on the server too. + expect(mocks.saveEbookReaderConfig).toHaveBeenCalledWith( + "ebook-1", + expect.objectContaining({ + settings: expect.objectContaining({ theme: "dark" }), + }), + ); + }); + + it("renders search results with duplicate CFIs without key collisions", async () => { + mocks.readerSearch.mockResolvedValue([ + { cfi: "epubcfi(/6/8)", excerpt: "first match" }, + { cfi: "epubcfi(/6/8)", excerpt: "second match" }, + ]); + const consoleError = vi.spyOn(console, "error").mockImplementation(() => {}); + + try { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const searchTab = container.querySelector( + 'button[aria-label="Search book"]', + ); + await act(async () => { + searchTab?.click(); + }); + + const input = container.querySelector('input[aria-label="Search text"]'); + await act(async () => { + if (!input) return; + setInputValue(input, "match"); + }); + + const submit = container.querySelector('button[aria-label="Run search"]'); + await act(async () => { + submit?.click(); + }); + + expect(container.textContent).toContain("first match"); + expect(container.textContent).toContain("second match"); + const keyWarnings = consoleError.mock.calls.filter((call) => + String(call[0]).includes("same key"), + ); + expect(keyWarnings).toEqual([]); + } finally { + consoleError.mockRestore(); + } + }); + + it("shows read aloud and reading aid controls", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + expect(container.querySelector('button[aria-label="Speak text"]')).not.toBeNull(); + expect(container.querySelector('input[aria-label="Keep screen awake"]')).not.toBeNull(); + expect(container.querySelector('input[aria-label="E-ink mode"]')).toBeNull(); + }); + + it("shows useful advanced reader controls without diagnostics UI or no-op controls", async () => { + vi.useFakeTimers(); + + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + expect(container.querySelector('[aria-label="Diagnostics"]')).toBeNull(); + expect(container.textContent).not.toContain("Diagnostics"); + + const brightness = container.querySelector('input[aria-label="Brightness"]'); + const hyphenation = container.querySelector( + 'input[aria-label="Hyphenation"]', + ); + const rtl = container.querySelector('input[aria-label="Right to left"]'); + const writingMode = container.querySelector( + 'select[aria-label="Writing mode"]', + ); + + expect(brightness).not.toBeNull(); + expect(container.querySelector('input[aria-label="Zoom"]')).toBeNull(); + expect(hyphenation).not.toBeNull(); + expect(rtl).not.toBeNull(); + expect(writingMode).not.toBeNull(); + + await act(async () => { + if (!brightness || !hyphenation || !rtl || !writingMode) return; + setInputValue(brightness, "112"); + hyphenation.click(); + rtl.click(); + writingMode.value = "vertical-rl"; + writingMode.dispatchEvent(new Event("change", { bubbles: true })); + vi.advanceTimersByTime(450); + }); + + expect(mocks.captureReaderSettings).toHaveBeenLastCalledWith( + expect.objectContaining({ + fontBrightness: 112, + hyphenation: false, + rtl: true, + writingMode: "vertical-rl", + }), + ); + + vi.useRealTimers(); + }); + + it("keeps side panel tab labels visible in the narrow panel", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + const label = settingsTab?.querySelector("[data-reader-panel-tab-label]"); + + expect(settingsTab?.className).toContain("flex-col"); + expect(label?.textContent).toBe("Settings"); + expect(label?.className).toContain("whitespace-normal"); + }); + + it("keeps range labels readable in the settings panel", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + const brightness = container.querySelector('input[aria-label="Brightness"]'); + const label = brightness?.closest("label"); + const header = label?.querySelector("[data-reader-range-header]"); + const name = label?.querySelector("[data-reader-range-name]"); + const value = label?.querySelector("[data-reader-range-value]"); + + expect(header?.className).toContain("grid"); + expect(name?.className).toContain("break-words"); + expect(value?.className).toContain("justify-self-end"); + }); + + it("hides paginated-only controls in scrolled flow", async () => { + await act(async () => { + root.render( + + + } /> + + , + ); + }); + + const settingsTab = container.querySelector( + 'button[aria-label="Reader settings"]', + ); + await act(async () => { + settingsTab?.click(); + }); + + expect(container.querySelector('input[aria-label="Width"]')).not.toBeNull(); + expect(container.querySelector('select[aria-label="Spread"]')).not.toBeNull(); + + const flow = container.querySelector('select[aria-label="Flow"]'); + await act(async () => { + if (!flow) return; + flow.value = "scrolled"; + flow.dispatchEvent(new Event("change", { bubbles: true })); + }); + + expect(container.querySelector('input[aria-label="Width"]')).toBeNull(); + expect(container.querySelector('select[aria-label="Spread"]')).toBeNull(); + }); +}); diff --git a/web/src/pages/EbookReader.tsx b/web/src/pages/EbookReader.tsx new file mode 100644 index 00000000..c390eeae --- /dev/null +++ b/web/src/pages/EbookReader.tsx @@ -0,0 +1,1211 @@ +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, + type KeyboardEvent as ReactKeyboardEvent, + type PointerEvent, +} from "react"; +import { + ArrowLeft, + Bookmark, + BookOpen, + Check, + ChevronLeft, + ChevronRight, + Download, + GripHorizontal, + Highlighter, + Library, + ListTree, + Loader2, + PanelRightClose, + PanelRightOpen, + Pause, + Play, + RotateCcw, + Ruler, + Search, + Settings, + StickyNote, + Square, + Trash2, + Type, + Volume2, +} from "lucide-react"; +import { Link, useNavigate, useParams, useSearchParams } from "react-router"; + +import type { FileVersion } from "@/api/types"; +import PageBack from "@/components/PageBack"; +import { Button } from "@/components/ui/button"; +import { useScreenWakeLock } from "@/hooks/useScreenWakeLock"; +import { useTTS } from "@/hooks/useTTS"; +import { useCatalogItemDetail } from "@/hooks/queries/catalogRead"; +import { cn } from "@/lib/utils"; +import type { TOCItem } from "@/reader/readest/libs/document"; +import FoliateBookReader, { + DEFAULT_READER_SETTINGS, + READER_FONT_STACKS, + formatReaderProgress, + isReaderSupportedFile, + normalizeReaderSettings, + parseReaderLocation, + readerFileFormat, + type FoliateBookReaderHandle, + type ReaderLoadState, + type ReaderSearchResult, + type ReaderSelection, + type ReaderSettings, +} from "@/reader/FoliateBookReader"; +import { + createEbookReaderAnnotation, + deleteEbookReaderAnnotation, + fetchEbookReaderAnnotations, + fetchEbookReaderConfig, + saveEbookReaderConfig, + saveEbookReaderConfigKeepalive, + type EbookReaderAnnotation, +} from "@/reader/ebookReaderApi"; + +export const EBOOK_READER_SETTINGS_STORAGE_KEY = "silo.ebook.reader.settings"; + +type ReaderPanel = "toc" | "search" | "notes" | "settings"; + +type TocEntry = TOCItem & { + depth: number; +}; + +const READER_FONT_OPTIONS = [ + { label: "Book default", value: READER_FONT_STACKS.inherit }, + { label: "System serif", value: READER_FONT_STACKS.serif }, + { label: "System sans", value: READER_FONT_STACKS.sans }, + { label: "Monospace", value: READER_FONT_STACKS.mono }, +] as const; + +const READER_PROFILES = [ + { + id: "comfortable", + label: "Comfortable", + description: "Serif, roomier lines", + settings: { + fontFamily: READER_FONT_STACKS.serif, + fontSize: 112, + lineHeight: 1.75, + margin: 28, + }, + }, + { + id: "accessible", + label: "Accessible", + description: "Larger sans text", + settings: { + fontFamily: READER_FONT_STACKS.sans, + fontSize: 126, + lineHeight: 1.9, + margin: 32, + }, + }, + { + id: "compact", + label: "Compact", + description: "More words per page", + settings: { + fontFamily: READER_FONT_STACKS.inherit, + fontSize: 96, + lineHeight: 1.5, + margin: 16, + }, + }, +] as const; + +function profileIsActive(profile: (typeof READER_PROFILES)[number], settings: ReaderSettings) { + return Object.entries(profile.settings).every( + ([key, value]) => settings[key as keyof ReaderSettings] === value, + ); +} + +// Approximates one rendered text line: the renderer sizes type at fontSize% of the +// 16px browser base, but publisher CSS may override sizes per element, so the band +// is a reading guide rather than an exact line match. +function rulerBandHeight(settings: ReaderSettings): number { + const approxLinePx = 16 * (settings.fontSize / 100) * settings.lineHeight; + return Math.min(96, Math.max(28, Math.round(approxLinePx) + 6)); +} + +function clampRulerTop(value: number): number { + return Math.min(100, Math.max(0, value)); +} + +function chooseReaderFile( + files: FileVersion[], + requestedID: number | null, +): FileVersion | undefined { + const requested = requestedID ? files.find((file) => file.file_id === requestedID) : undefined; + if (requested && isReaderSupportedFile(requested)) return requested; + return ( + files.find((file) => readerFileFormat(file) === "epub") ?? + files.find((file) => isReaderSupportedFile(file)) ?? + files[0] + ); +} + +function readerFileLabel(file: FileVersion): string { + const format = readerFileFormat(file).toUpperCase(); + const name = file.file_name || file.file_path?.split(/[\\/]/).pop() || `File ${file.file_id}`; + return format ? `${format} · ${name}` : name; +} + +function flattenToc(items: TOCItem[] = [], depth = 0): TocEntry[] { + return items.flatMap((item) => [ + { ...item, depth }, + ...flattenToc(item.subitems ?? [], depth + 1), + ]); +} + +function readerStorage(): Storage | null { + try { + return window.localStorage ?? null; + } catch { + return null; + } +} + +export function loadStoredReaderSettings(): ReaderSettings { + try { + const raw = readerStorage()?.getItem(EBOOK_READER_SETTINGS_STORAGE_KEY); + if (!raw) return DEFAULT_READER_SETTINGS; + return normalizeReaderSettings(JSON.parse(raw) as Partial); + } catch { + return DEFAULT_READER_SETTINGS; + } +} + +function saveReaderSettings(settings: ReaderSettings) { + readerStorage()?.setItem(EBOOK_READER_SETTINGS_STORAGE_KEY, JSON.stringify(settings)); +} + +function isEditableTarget(target: EventTarget | null): boolean { + if (!(target instanceof HTMLElement)) return false; + if (target.isContentEditable) return true; + return ["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName); +} + +export default function EbookReader() { + const { contentId = "" } = useParams<{ contentId: string }>(); + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const requestedFileID = Number(searchParams.get("file_id") || ""); + const libraryIdParam = searchParams.get("libraryId"); + const { data: item, isLoading, error } = useCatalogItemDetail(contentId || undefined); + const selectedFile = useMemo( + () => + chooseReaderFile( + item?.versions ?? [], + Number.isFinite(requestedFileID) ? requestedFileID : null, + ), + [item?.versions, requestedFileID], + ); + const readerFiles = useMemo( + () => (item?.versions ?? []).filter((file) => isReaderSupportedFile(file)), + [item?.versions], + ); + const format = readerFileFormat(selectedFile); + const readerRef = useRef(null); + const [loadedFile, setLoadedFile] = useState(null); + const [readerProgress, setReaderProgress] = useState(null); + const [toc, setToc] = useState([]); + const [panelOpen, setPanelOpen] = useState(true); + const [panel, setPanel] = useState("toc"); + const [readerSettings, setReaderSettings] = useState(() => + loadStoredReaderSettings(), + ); + const [annotations, setAnnotations] = useState([]); + const [selection, setSelection] = useState(null); + const [wakeLockEnabled, setWakeLockEnabled] = useState(false); + const [ttsRate, setTtsRate] = useState(1); + const [ttsVoiceURI, setTtsVoiceURI] = useState(""); + const rulerDragRef = useRef<{ offsetY: number; surface: DOMRect; top: number } | null>(null); + const [rulerDragTop, setRulerDragTop] = useState(null); + const readingSurfaceRef = useRef(null); + const tts = useTTS(); + useScreenWakeLock(wakeLockEnabled); + const configLoadedRef = useRef(false); + // Tracks settings the user changed in this session so a slow server config + // fetch cannot clobber them after the fact. + const settingsDirtyRef = useRef(false); + // Mirrors readerSettings synchronously so updates merge correctly even when + // several setting changes land in the same render batch. + const readerSettingsRef = useRef(readerSettings); + const saveConfigTimerRef = useRef(null); + const [searchText, setSearchText] = useState(""); + const [searchResults, setSearchResults] = useState([]); + const [searching, setSearching] = useState(false); + const progressLabel = formatReaderProgress(readerProgress); + const tocEntries = useMemo(() => flattenToc(toc), [toc]); + const handleFileLoaded = useCallback((state: ReaderLoadState | null) => { + setLoadedFile(state); + }, []); + const handleProgressChange = useCallback((progress: number | null) => { + setReaderProgress(progress); + }, []); + const handleReaderReady = useCallback(({ toc: readyToc }: { toc: TOCItem[] }) => { + setToc(readyToc); + }, []); + const reloadAnnotations = useCallback(async () => { + if (!contentId) return; + setAnnotations(await fetchEbookReaderAnnotations(contentId)); + }, [contentId]); + const handleFileChange = useCallback( + (fileID: string) => { + if (!contentId) return; + const nextParams = new URLSearchParams(); + nextParams.set("file_id", fileID); + if (libraryIdParam) { + nextParams.set("libraryId", libraryIdParam); + } + navigate(`/reader/ebook/${encodeURIComponent(contentId)}?${nextParams.toString()}`, { + replace: true, + }); + }, + [contentId, libraryIdParam, navigate], + ); + const updateReaderSettings = useCallback( + (next: Partial) => { + const merged = normalizeReaderSettings({ ...readerSettingsRef.current, ...next }); + readerSettingsRef.current = merged; + settingsDirtyRef.current = true; + setReaderSettings(merged); + saveReaderSettings(merged); + if (contentId && configLoadedRef.current) { + if (saveConfigTimerRef.current !== null) { + window.clearTimeout(saveConfigTimerRef.current); + } + saveConfigTimerRef.current = window.setTimeout(() => { + saveConfigTimerRef.current = null; + void saveEbookReaderConfig(contentId, { settings: merged }); + }, 400); + } + }, + [contentId], + ); + const resetReaderSettings = useCallback(() => { + const defaults = normalizeReaderSettings(DEFAULT_READER_SETTINGS); + if (saveConfigTimerRef.current !== null) { + window.clearTimeout(saveConfigTimerRef.current); + saveConfigTimerRef.current = null; + } + readerSettingsRef.current = defaults; + settingsDirtyRef.current = true; + saveReaderSettings(defaults); + setReaderSettings(defaults); + if (contentId) { + void saveEbookReaderConfig(contentId, { settings: defaults }); + } + }, [contentId]); + const handleSearchSubmit = useCallback(async () => { + const query = searchText.trim(); + if (!query) { + setSearchResults([]); + readerRef.current?.clearSearch(); + return; + } + setSearching(true); + try { + setSearchResults(await (readerRef.current?.search(query) ?? Promise.resolve([]))); + } finally { + setSearching(false); + } + }, [searchText]); + const handleProgressScrub = useCallback((value: string) => { + const next = Math.min(1, Math.max(0, Number(value) / 100)); + if (!Number.isFinite(next)) return; + setReaderProgress(next); + void readerRef.current?.goToFraction(next); + }, []); + const handleCreateHighlight = useCallback(async () => { + if (!contentId || !selection) return; + const created = await createEbookReaderAnnotation(contentId, { + kind: "highlight", + cfi_range: selection.cfi, + selected_text: selection.selectedText, + style: "highlight", + color: "#facc15", + }); + setAnnotations((current) => [created, ...current]); + readerRef.current?.clearSelection(); + setSelection(null); + }, [contentId, selection]); + const handleCreateBookmark = useCallback(async () => { + if (!contentId) return; + const location = selection?.cfi || `fraction:${(readerProgress ?? 0).toFixed(6)}`; + const created = await createEbookReaderAnnotation(contentId, { + kind: "bookmark", + location, + note: item?.title || "Bookmark", + }); + setAnnotations((current) => [created, ...current]); + setPanel("notes"); + }, [contentId, item?.title, readerProgress, selection]); + const handleAnnotationNavigate = useCallback((annotation: EbookReaderAnnotation) => { + // Toolbar bookmarks store synthetic "fraction:" locations that foliate's + // goTo cannot resolve; route those through goToFraction instead. + const target = parseReaderLocation(annotation.cfi_range || annotation.location); + if (!target) return; + if (target.type === "fraction") { + void readerRef.current?.goToFraction(target.fraction); + } else { + readerRef.current?.goTo(target.location); + } + }, []); + const handleDeleteAnnotation = useCallback( + async (annotationID: string) => { + if (!contentId) return; + await deleteEbookReaderAnnotation(contentId, annotationID); + setAnnotations((current) => current.filter((annotation) => annotation.id !== annotationID)); + }, + [contentId], + ); + const handleSpeak = useCallback(() => { + const text = readerRef.current?.getReadableText() ?? ""; + tts.speak(text, { + rate: ttsRate, + voiceURI: ttsVoiceURI || undefined, + }); + }, [tts, ttsRate, ttsVoiceURI]); + // Dragging only moves a local draft so the book renderer and persistence layers + // are untouched until the pointer is released. + const effectiveRulerTop = rulerDragTop ?? readerSettings.readingRulerTop; + const handleRulerPointerDown = useCallback( + (event: PointerEvent) => { + const surface = readingSurfaceRef.current?.getBoundingClientRect(); + if (!surface || surface.height === 0) return; + event.preventDefault(); + const top = readerSettings.readingRulerTop; + const bandCenterY = surface.top + (surface.height * top) / 100; + rulerDragRef.current = { offsetY: event.clientY - bandCenterY, surface, top }; + event.currentTarget.setPointerCapture(event.pointerId); + }, + [readerSettings.readingRulerTop], + ); + const handleRulerPointerMove = useCallback((event: PointerEvent) => { + const drag = rulerDragRef.current; + if (!drag) return; + const next = clampRulerTop( + ((event.clientY - drag.surface.top - drag.offsetY) / drag.surface.height) * 100, + ); + drag.top = next; + setRulerDragTop(next); + }, []); + const handleRulerPointerUp = useCallback( + (event: PointerEvent) => { + const drag = rulerDragRef.current; + if (!drag) return; + rulerDragRef.current = null; + event.currentTarget.releasePointerCapture(event.pointerId); + setRulerDragTop(null); + updateReaderSettings({ readingRulerTop: drag.top }); + }, + [updateReaderSettings], + ); + const handleRulerPointerCancel = useCallback(() => { + rulerDragRef.current = null; + setRulerDragTop(null); + }, []); + const handleRulerKeyDown = useCallback( + (event: ReactKeyboardEvent) => { + if (event.key !== "ArrowUp" && event.key !== "ArrowDown") return; + event.preventDefault(); + const step = (event.shiftKey ? 5 : 1) * (event.key === "ArrowUp" ? -1 : 1); + updateReaderSettings({ + readingRulerTop: clampRulerTop(readerSettings.readingRulerTop + step), + }); + }, + [readerSettings.readingRulerTop, updateReaderSettings], + ); + + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.defaultPrevented || isEditableTarget(event.target)) return; + if (event.key === "ArrowLeft") { + readerRef.current?.prev(); + } else if (event.key === "ArrowRight") { + readerRef.current?.next(); + } + }; + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, []); + + useEffect(() => { + if (!contentId) return; + let cancelled = false; + configLoadedRef.current = false; + settingsDirtyRef.current = false; + void fetchEbookReaderConfig(contentId) + .then((config) => { + if (cancelled) return; + configLoadedRef.current = true; + if (settingsDirtyRef.current) { + // The user already changed settings while the fetch was in flight; + // persist their choices instead of clobbering them with stale config. + void saveEbookReaderConfig(contentId, { settings: readerSettingsRef.current }); + return; + } + const settings = + config.settings && typeof config.settings === "object" && !Array.isArray(config.settings) + ? normalizeReaderSettings(config.settings as Partial) + : loadStoredReaderSettings(); + readerSettingsRef.current = settings; + saveReaderSettings(settings); + setReaderSettings(settings); + }) + .catch(() => { + if (!cancelled) { + configLoadedRef.current = true; + } + }); + // A scheduled timer means updateReaderSettings has unsaved settings; + // consume it exactly once so unmount and pagehide cannot double-send. + const flushPendingConfigSave = (options?: { keepalive?: boolean }) => { + if (saveConfigTimerRef.current === null) return; + window.clearTimeout(saveConfigTimerRef.current); + saveConfigTimerRef.current = null; + if (options?.keepalive) { + saveEbookReaderConfigKeepalive(contentId, { settings: readerSettingsRef.current }); + } else { + void saveEbookReaderConfig(contentId, { settings: readerSettingsRef.current }); + } + }; + // At tab close a normal request can be torn down with the page; keepalive + // lets the debounced save survive unload. + const flushConfigOnPageHide = () => flushPendingConfigSave({ keepalive: true }); + window.addEventListener("pagehide", flushConfigOnPageHide); + return () => { + cancelled = true; + window.removeEventListener("pagehide", flushConfigOnPageHide); + // Flush instead of dropping the debounced save: on quick SPA navigation a + // dropped save would let the stale server config revert the user's last + // change on next open. The page is still alive here, so a normal + // authenticated request is fine. + flushPendingConfigSave(); + }; + }, [contentId]); + + useEffect(() => { + void reloadAnnotations(); + }, [reloadAnnotations]); + if (isLoading) { + return ( +
    + +
    + ); + } + + if (error || !item || item.type !== "ebook") { + return ( +
    + +
    Ebook not found.
    +
    + ); + } + + const backHref = `/item/${encodeURIComponent(item.content_id)}${ + libraryIdParam ? `?libraryId=${encodeURIComponent(libraryIdParam)}` : "" + }`; + + if (!selectedFile) { + return ( +
    + +
    No ebook files found.
    +
    + ); + } + + return ( +
    +
    +
    + +
    +
    {item.title}
    +
    {format.toUpperCase()}
    +
    + {progressLabel && ( +
    + {progressLabel} +
    + )} + {isReaderSupportedFile(selectedFile) && readerFiles.length > 1 && ( + + )} +
    + {selection && ( + + )} + + + + + +
    + {loadedFile && ( + + )} +
    +
    + + handleProgressScrub(event.target.value)} + className="accent-primary h-2 min-w-0 flex-1" + /> +
    + {progressLabel ?? "0%"} +
    +
    +
    + +
    + {isReaderSupportedFile(selectedFile) ? ( +
    + + {readerSettings.readingRuler && ( +
    + +
    + )} +
    + ) : ( +
    +
    + +

    {item.title}

    +

    Unsupported ebook format.

    +
    +
    + )} + {panelOpen && isReaderSupportedFile(selectedFile) && ( + + )} +
    +
    + ); +} + +type ReaderRangeProps = { + label: string; + value: number; + min: number; + max: number; + step: number; + suffix?: string; + onChange: (value: number) => void; +}; + +function ReaderRange({ label, value, min, max, step, suffix = "", onChange }: ReaderRangeProps) { + return ( + + ); +} diff --git a/web/src/pages/ItemDetail/EbookContent.test.tsx b/web/src/pages/ItemDetail/EbookContent.test.tsx new file mode 100644 index 00000000..88619f09 --- /dev/null +++ b/web/src/pages/ItemDetail/EbookContent.test.tsx @@ -0,0 +1,485 @@ +import type { ReactNode } from "react"; +import { renderToStaticMarkup } from "react-dom/server"; +import { describe, expect, it, vi, beforeEach } from "vitest"; +import { MemoryRouter } from "react-router"; +import type { FileVersion, ItemDetail } from "@/api/types"; +import EbookContent from "./EbookContent"; + +const mocks = vi.hoisted(() => ({ + useAuth: vi.fn(), + useEbookReaderProgress: vi.fn(), + useWatchedStateMutation: vi.fn(), +})); + +vi.mock("@/hooks/useAuth", () => ({ + useAuth: mocks.useAuth, +})); + +vi.mock("@/hooks/queries/items", () => ({ + useWatchedStateMutation: mocks.useWatchedStateMutation, +})); + +vi.mock("@/hooks/useAmbientColor", () => ({ + useAmbientColor: vi.fn(), +})); + +vi.mock("@/hooks/queries/ebookReaderProgress", () => ({ + useEbookReaderProgress: mocks.useEbookReaderProgress, +})); + +vi.mock("@/components/PageBack", () => ({ + default: () =>
    , +})); + +vi.mock("@/components/MediaLocations", () => ({ + default: ({ + title, + versions, + emptyMessage, + summaryBuilder, + }: { + title: string; + versions: FileVersion[]; + emptyMessage: string; + summaryBuilder?: (version: FileVersion) => string; + }) => ( +
    + {title} + {versions.length} + {emptyMessage} + {versions.map((version) => ( + {summaryBuilder?.(version)} + ))} +
    + ), +})); + +vi.mock("@/components/DownloadVersionPicker", () => ({ + default: ({ versions, title }: { versions: FileVersion[]; title: string }) => ( +
    + download picker + {title} + {versions.length} +
    + ), +})); + +vi.mock("@/pages/audiobooks/components/RelatedRail", () => ({ + RelatedRail: ({ + heading, + items, + coverAspect, + }: { + heading: string; + coverAspect?: "square" | "poster"; + items: Array<{ content_id: string; title: string; subtitle?: string; highlight?: boolean }>; + }) => ( +
    +

    {heading}

    + {coverAspect && aspect:{coverAspect}} + {items.map((item) => ( +
    + {item.title} + {item.subtitle && {item.subtitle}} + {item.highlight && Current} +
    + ))} +
    + ), +})); + +vi.mock("./DetailHero", () => ({ + default: ({ + title, + context, + crewLine, + actions, + genres, + genreHref, + }: { + title: string; + context?: ReactNode; + crewLine?: ReactNode; + actions?: ReactNode; + genres?: string[]; + genreHref?: (genre: string) => string; + }) => ( +
    + {title} + {context} + {crewLine} + {genres?.map((genre) => ( + + {genre} + + ))} + {actions} +
    + ), +})); + +vi.mock("./components/MetadataBadges", () => ({ + default: () =>
    , +})); + +vi.mock("./components/ScoreRow", () => ({ + default: () =>
    , +})); + +function makeVersion(overrides: Partial = {}): FileVersion { + return { + file_id: overrides.file_id ?? 1, + file_path: overrides.file_path ?? "/books/book.epub", + resolution: overrides.resolution ?? "", + codec_video: overrides.codec_video ?? "", + codec_audio: overrides.codec_audio ?? "", + hdr: overrides.hdr ?? false, + container: overrides.container ?? "epub", + file_size: overrides.file_size ?? 1234, + duration: overrides.duration ?? 0, + bitrate: overrides.bitrate ?? 0, + file_name: overrides.file_name ?? "Book.epub", + audio_tracks: overrides.audio_tracks, + video_tracks: overrides.video_tracks, + subtitle_tracks: overrides.subtitle_tracks, + }; +} + +function makeEbookItem( + overrides: Partial = {}, +): ItemDetail & { type: "ebook" } { + return { + content_id: "ebook-1", + type: "ebook", + title: "A Psalm for the Wild-Built", + original_title: "", + year: 2021, + overview: "An ebook overview", + tagline: "", + runtime: 0, + content_rating: "", + genres: [], + rating_imdb: null, + rating_tmdb: null, + rating_rt_critic: null, + rating_rt_audience: null, + imdb_id: "", + tmdb_id: "", + tvdb_id: "", + cast: [], + crew: [ + { name: "Becky Chambers", job: "Author", person_id: "author-1" }, + { name: "A Narrator Should Not Appear", job: "Narrator", person_id: "narrator-1" }, + ], + studios: ["Tor"], + networks: [], + countries: [], + release_date: null, + first_air_date: null, + last_air_date: null, + poster_url: "", + poster_thumbhash: "", + backdrop_url: "", + backdrop_thumbhash: "", + logo_url: "", + season_count: null, + series_id: "", + series_title: "", + season_number: null, + episode_number: null, + episode_count: null, + air_date: null, + is_specials: false, + versions: [makeVersion()], + subtitles: [], + intro: null, + credits: null, + ...overrides, + }; +} + +describe("EbookContent", () => { + beforeEach(() => { + mocks.useAuth.mockReset(); + mocks.useAuth.mockReturnValue({ user: { download_allowed: true } }); + mocks.useEbookReaderProgress.mockReset(); + mocks.useEbookReaderProgress.mockReturnValue({ data: null }); + mocks.useWatchedStateMutation.mockReset(); + mocks.useWatchedStateMutation.mockReturnValue({ mutate: vi.fn(), isPending: false }); + }); + + it("renders ebook authors without audiobook narrator credits", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Ebook"); + expect(markup).toContain("By"); + expect(markup).toContain("Becky Chambers"); + expect(markup).not.toContain("A Narrator Should Not Appear"); + }); + + it("only shows download action when downloads are allowed and files exist", () => { + let markup = renderToStaticMarkup( + + + , + ); + expect(markup).toContain("Download"); + + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + markup = renderToStaticMarkup( + + + , + ); + expect(markup).not.toContain("Download"); + + mocks.useAuth.mockReturnValue({ user: { download_allowed: true } }); + markup = renderToStaticMarkup( + + + , + ); + expect(markup).not.toContain("Download"); + }); + + it("shows read action for ebook files even when downloads are disabled", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + + let markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Read"); + expect(markup).toContain("/reader/ebook/ebook-1?file_id=1"); + + markup = renderToStaticMarkup( + + + , + ); + expect(markup).not.toContain("/reader/ebook/"); + }); + + it("shows the mark read toggle backed by the watched mutation", () => { + const item = makeEbookItem(); + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Mark Read"); + expect(mocks.useWatchedStateMutation).toHaveBeenCalledWith(item); + }); + + it("shows the mark unread toggle for ebooks already marked read", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Mark Unread"); + }); + + it("preserves library context on reader links", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("/reader/ebook/ebook-1?file_id=1&libraryId=12"); + }); + + it("links ebook genres back to the scoped library", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain('href="/library/12?tab=library&genre=Science+Fiction"'); + }); + + it("links ebook genres to the ebook catalog outside a library", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain( + 'href="/catalog?source=query&type=ebook&genre=Science+Fiction"', + ); + }); + + it("does not show read action when ebook files are not reader-supported", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: true } }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).not.toContain("/reader/ebook/"); + expect(markup).toContain("Download"); + }); + + it("shows continue action and saved progress when ebook progress exists", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + mocks.useEbookReaderProgress.mockReturnValue({ + data: { + file_id: 1, + location: "epubcfi(/6/4)", + progress: 0.42, + }, + }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Continue"); + expect(markup).toContain("42%"); + expect(markup).not.toContain(">Read<"); + }); + + it("continues from the saved reader file when progress points at another format", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + mocks.useEbookReaderProgress.mockReturnValue({ + data: { + file_id: 1, + location: "pdf-location", + progress: 0.2, + }, + }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("Continue"); + expect(markup).toContain("/reader/ebook/ebook-1?file_id=1"); + }); + + it("prefers EPUB for the read action when multiple ebook files exist", () => { + mocks.useAuth.mockReturnValue({ user: { download_allowed: false } }); + + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("/reader/ebook/ebook-1?file_id=2"); + }); + + it("renders ebook series and related rails from ebook detail extension", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("In Monk and Robot"); + expect(markup).toContain("A Prayer for the Crown-Shy"); + expect(markup).toContain("Book 2"); + expect(markup).toContain("Also by Becky Chambers"); + expect(markup).toContain("The Long Way"); + expect(markup).toContain("You might also like"); + expect(markup).toContain("All Systems Red"); + expect(markup).toContain("aspect:poster"); + }); + + it("shows ebook file format, size, and page count without video quality labels", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("CBZ · 25.0 MB · 48 pages"); + expect(markup).not.toContain("1080p"); + }); +}); diff --git a/web/src/pages/ItemDetail/EbookContent.tsx b/web/src/pages/ItemDetail/EbookContent.tsx new file mode 100644 index 00000000..138b0f89 --- /dev/null +++ b/web/src/pages/ItemDetail/EbookContent.tsx @@ -0,0 +1,246 @@ +import { useState } from "react"; +import { BookOpen, Check, Download } from "lucide-react"; +import { Link } from "react-router"; +import type { FileVersion, ItemDetail } from "@/api/types"; +import DownloadVersionPicker from "@/components/DownloadVersionPicker"; +import MediaLocations from "@/components/MediaLocations"; +import PageBack from "@/components/PageBack"; +import { Button } from "@/components/ui/button"; +import { useAuth } from "@/hooks/useAuth"; +import { useAmbientColor } from "@/hooks/useAmbientColor"; +import { useEbookReaderProgress } from "@/hooks/queries/ebookReaderProgress"; +import { useWatchedStateMutation } from "@/hooks/queries/items"; +import { RelatedRail } from "@/pages/audiobooks/components/RelatedRail"; +import { + formatReaderProgress, + isReaderSupportedFile, + readerFileFormat, +} from "@/reader/FoliateBookReader"; +import DetailHero from "./DetailHero"; +import MetadataBadges from "./components/MetadataBadges"; +import ScoreRow from "./components/ScoreRow"; +import { getWatchedActionLabel } from "./watchedState"; +import { formatFileSize, formatPageCount, metadataLine } from "./components/versionFormatUtils"; + +function authorNames(item: ItemDetail): string[] { + const extensionAuthors = (item.ebook?.authors ?? []) + .map((author) => author.name) + .filter((name) => name.trim() !== ""); + if (extensionAuthors.length > 0) { + return extensionAuthors; + } + return (item.crew ?? []) + .filter((credit) => credit.job === "Author") + .map((credit) => credit.name) + .filter((name) => name.trim() !== ""); +} + +function ebookVersionSummary(version: ItemDetail["versions"][number]): string { + return metadataLine([ + version.container ? version.container.toUpperCase() : undefined, + formatFileSize(version.file_size), + formatPageCount(version.duration), + ]); +} + +function preferredReadVersion(versions: FileVersion[]): FileVersion | undefined { + return ( + versions.find((version) => readerFileFormat(version) === "epub") ?? + versions.find((version) => isReaderSupportedFile(version)) + ); +} + +function progressReadVersion( + versions: FileVersion[], + fileID: number | undefined, +): FileVersion | undefined { + if (typeof fileID !== "number") return undefined; + return versions.find((version) => version.file_id === fileID && isReaderSupportedFile(version)); +} + +function genreHref(genre: string, libraryId?: number): string { + const params = new URLSearchParams(); + if (libraryId) { + params.set("tab", "library"); + params.set("genre", genre); + return `/library/${libraryId}?${params.toString()}`; + } + params.set("source", "query"); + params.set("type", "ebook"); + params.set("genre", genre); + return `/catalog?${params.toString()}`; +} + +export default function EbookContent({ + item, + libraryId, +}: { + item: ItemDetail & { type: "ebook" }; + libraryId?: number; +}) { + useAmbientColor(item.poster_thumbhash); + const { user } = useAuth(); + const { data: readerProgress } = useEbookReaderProgress(item.content_id); + const watchedMutation = useWatchedStateMutation(item); + const isRead = item.user_data?.played === true; + const [downloadOpen, setDownloadOpen] = useState(false); + const authors = authorNames(item); + const publisher = item.ebook?.publisher || (item.studios ?? [])[0]; + const year = item.year ? String(item.year) : ""; + const progressLabel = formatReaderProgress(readerProgress?.progress); + const hasSavedProgress = Boolean(readerProgress && progressLabel); + const readVersion = + (hasSavedProgress ? progressReadVersion(item.versions, readerProgress?.file_id) : undefined) ?? + preferredReadVersion(item.versions); + const canRead = Boolean(readVersion); + const canDownload = Boolean(user?.download_allowed && item.versions.length > 0); + const readerParams = new URLSearchParams(); + if (readVersion) { + readerParams.set("file_id", String(readVersion.file_id)); + } + if (libraryId) { + readerParams.set("libraryId", String(libraryId)); + } + const readerQuery = readerParams.toString(); + const readerHref = `/reader/ebook/${encodeURIComponent(item.content_id)}${ + readerQuery ? `?${readerQuery}` : "" + }`; + + return ( +
    + } + context="Ebook" + studioLabel={publisher} + backdropUrl={item.backdrop_url} + backdropThumbhash={item.backdrop_thumbhash} + posterUrl={item.poster_url} + posterThumbhash={item.poster_thumbhash} + metadata={ + + } + scoreRow={ + + } + overview={item.overview} + crewLine={ + authors.length > 0 ? ( +
    + By + {authors.join(", ")} +
    + ) : undefined + } + genres={item.genres} + genreHref={(genre) => genreHref(genre, libraryId)} + actions={ +
    + {canRead && ( + + )} + {canDownload && ( + + )} + +
    + } + /> + +
    + {item.ebook?.series && item.ebook.series.entries.length > 0 && ( + ({ + content_id: entry.content_id, + title: entry.title, + poster_url: entry.poster_url, + subtitle: + typeof entry.series_index === "number" ? `Book ${entry.series_index}` : undefined, + highlight: entry.content_id === item.content_id, + }))} + /> + )} + + {(item.ebook?.related.also_by_author ?? []).length > 0 && ( + ({ + content_id: entry.content_id, + title: entry.title, + poster_url: entry.poster_url, + subtitle: entry.year ? String(entry.year) : undefined, + }))} + /> + )} + + {(item.ebook?.related.similar ?? []).length > 0 && ( + ({ + content_id: entry.content_id, + title: entry.title, + poster_url: entry.poster_url, + subtitle: entry.year ? String(entry.year) : undefined, + }))} + /> + )} + + +
    + + +
    + ); +} diff --git a/web/src/pages/ItemDetail/components/VersionFlyout.test.ts b/web/src/pages/ItemDetail/components/VersionFlyout.test.ts index 77b3cb95..c706b69a 100644 --- a/web/src/pages/ItemDetail/components/VersionFlyout.test.ts +++ b/web/src/pages/ItemDetail/components/VersionFlyout.test.ts @@ -73,6 +73,19 @@ describe("buildQualitySummary", () => { }); expect(buildQualitySummary(version)).toBe("2160p · HEVC · HDR · Atmos"); }); + + it("falls back to container for ebook-style files without video quality", () => { + const version = makeVersion({ + resolution: "", + codec_video: "", + codec_audio: "", + hdr: false, + container: "epub", + file_name: "A Psalm for the Wild-Built.epub", + }); + + expect(buildQualitySummary(version)).toBe("EPUB"); + }); }); describe("buildDetailLine", () => { diff --git a/web/src/pages/ItemDetail/components/VersionFlyout.tsx b/web/src/pages/ItemDetail/components/VersionFlyout.tsx index 28d28536..09b195ca 100644 --- a/web/src/pages/ItemDetail/components/VersionFlyout.tsx +++ b/web/src/pages/ItemDetail/components/VersionFlyout.tsx @@ -19,6 +19,9 @@ export function buildQualitySummary(version: FileVersion): string { if (version.codec_video) parts.push(version.codec_video.toUpperCase()); if (version.hdr) parts.push("HDR"); if (version.codec_audio) parts.push(mapAudioLabel(version.codec_audio)); + if (parts.length === 0 && version.container) { + parts.push(version.container.toUpperCase()); + } return parts.join(" · "); } diff --git a/web/src/pages/ItemDetail/components/versionFormatUtils.test.ts b/web/src/pages/ItemDetail/components/versionFormatUtils.test.ts index 2ad734b8..b5949fa9 100644 --- a/web/src/pages/ItemDetail/components/versionFormatUtils.test.ts +++ b/web/src/pages/ItemDetail/components/versionFormatUtils.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { formatFileSize, + formatPageCount, formatChannels, formatBitrate, formatLanguageName, @@ -27,6 +28,18 @@ describe("formatFileSize", () => { }); }); +describe("formatPageCount", () => { + it("formats singular and plural ebook page counts", () => { + expect(formatPageCount(1)).toBe("1 page"); + expect(formatPageCount(321)).toBe("321 pages"); + }); + + it("returns empty string for missing page counts", () => { + expect(formatPageCount(0)).toBe(""); + expect(formatPageCount(undefined)).toBe(""); + }); +}); + describe("formatChannels", () => { it("maps 8 channels to 7.1", () => { expect(formatChannels(8)).toBe("7.1"); diff --git a/web/src/pages/ItemDetail/components/versionFormatUtils.tsx b/web/src/pages/ItemDetail/components/versionFormatUtils.tsx index f82cb1fe..dfc51802 100644 --- a/web/src/pages/ItemDetail/components/versionFormatUtils.tsx +++ b/web/src/pages/ItemDetail/components/versionFormatUtils.tsx @@ -22,6 +22,11 @@ export function formatFileSize(bytes: number): string { return `${bytes} B`; } +export function formatPageCount(pages?: number): string { + if (!pages || pages <= 0) return ""; + return `${pages.toLocaleString()} ${pages === 1 ? "page" : "pages"}`; +} + export function formatAddedAt(value?: string): string { if (!value) return ""; const date = new Date(value); diff --git a/web/src/pages/ItemDetail/index.test.tsx b/web/src/pages/ItemDetail/index.test.tsx index fcab7dad..638998bd 100644 --- a/web/src/pages/ItemDetail/index.test.tsx +++ b/web/src/pages/ItemDetail/index.test.tsx @@ -37,6 +37,14 @@ vi.mock("@/pages/ItemDetail/EpisodeContent", () => ({ default: () =>
    Episode
    , })); +vi.mock("@/pages/ItemDetail/AudiobookContent", () => ({ + default: () =>
    Audiobook
    , +})); + +vi.mock("@/pages/ItemDetail/EbookContent", () => ({ + default: ({ item }: { item: { title: string } }) =>
    Ebook: {item.title}
    , +})); + import ItemDetail from "./index"; describe("ItemDetail", () => { @@ -56,4 +64,16 @@ describe("ItemDetail", () => { expect(markup).toContain("Catalog Detail"); expect(mocks.useCatalogItemDetail).toHaveBeenCalledWith("movie-123", undefined); }); + + it("routes ebook items to ebook detail content", () => { + mocks.useCatalogItemDetail.mockReturnValue({ + data: { content_id: "ebook-123", title: "A Psalm for the Wild-Built", type: "ebook" }, + isLoading: false, + error: null, + }); + + const markup = renderToStaticMarkup(); + + expect(markup).toContain("Ebook: A Psalm for the Wild-Built"); + }); }); diff --git a/web/src/pages/ItemDetail/index.tsx b/web/src/pages/ItemDetail/index.tsx index bb3131c5..48a1c773 100644 --- a/web/src/pages/ItemDetail/index.tsx +++ b/web/src/pages/ItemDetail/index.tsx @@ -10,6 +10,7 @@ import SeriesContent from "@/pages/ItemDetail/SeriesContent"; import SeasonContent from "@/pages/ItemDetail/SeasonContent"; import EpisodeContent from "@/pages/ItemDetail/EpisodeContent"; import AudiobookContent from "@/pages/ItemDetail/AudiobookContent"; +import EbookContent from "@/pages/ItemDetail/EbookContent"; import { CastSkeleton, CrewSkeleton, @@ -103,6 +104,8 @@ export default function ItemDetail() { return ( ); + case "ebook": + return ; case "podcast": return ; default: diff --git a/web/src/pages/ItemDetail/watchedState.test.ts b/web/src/pages/ItemDetail/watchedState.test.ts index a6674e5f..c216a542 100644 --- a/web/src/pages/ItemDetail/watchedState.test.ts +++ b/web/src/pages/ItemDetail/watchedState.test.ts @@ -1,11 +1,12 @@ import { QueryClient } from "@tanstack/react-query"; import { describe, expect, it } from "vitest"; -import { catalogKeys, episodeKeys, itemKeys, progressKeys } from "@/hooks/queries/keys"; +import { catalogKeys, ebookKeys, episodeKeys, itemKeys, progressKeys } from "@/hooks/queries/keys"; import type { ItemDetail } from "@/api/types"; import { getCachedWatchedInvalidationKeys, getWatchedActionLabel, getWatchedInvalidationKeys, + getWatchedToastMessage, } from "./watchedState"; function makeItem(overrides: Partial = {}): ItemDetail { @@ -89,6 +90,45 @@ describe("getWatchedActionLabel", () => { ), ).toBe("Mark Series Watched"); }); + + it("returns listening labels for audiobooks", () => { + expect( + getWatchedActionLabel(makeItem({ type: "audiobook", user_data: { played: false } })), + ).toBe("Mark Listened"); + expect( + getWatchedActionLabel(makeItem({ type: "audiobook", user_data: { played: true } })), + ).toBe("Mark Unlistened"); + }); + + it("returns reading labels for ebooks", () => { + expect(getWatchedActionLabel(makeItem({ type: "ebook", user_data: { played: false } }))).toBe( + "Mark Read", + ); + expect(getWatchedActionLabel(makeItem({ type: "ebook", user_data: { played: true } }))).toBe( + "Mark Unread", + ); + }); +}); + +describe("getWatchedToastMessage", () => { + it("uses watched copy for video items", () => { + expect(getWatchedToastMessage(makeItem({ type: "movie" }), true)).toBe("Marked as watched"); + expect(getWatchedToastMessage(makeItem({ type: "movie" }), false)).toBe("Marked as unwatched"); + }); + + it("uses listened copy for audiobooks", () => { + expect(getWatchedToastMessage(makeItem({ type: "audiobook" }), true)).toBe( + "Marked as listened", + ); + expect(getWatchedToastMessage(makeItem({ type: "audiobook" }), false)).toBe( + "Marked as unlistened", + ); + }); + + it("uses read copy for ebooks", () => { + expect(getWatchedToastMessage(makeItem({ type: "ebook" }), true)).toBe("Marked as read"); + expect(getWatchedToastMessage(makeItem({ type: "ebook" }), false)).toBe("Marked as unread"); + }); }); describe("getWatchedInvalidationKeys", () => { @@ -146,6 +186,22 @@ describe("getWatchedInvalidationKeys", () => { ]); }); + it("includes the ebook reader progress query for an ebook target", () => { + expect( + getWatchedInvalidationKeys( + makeItem({ + content_id: "ebook-1", + type: "ebook", + }), + ), + ).toEqual([ + catalogKeys.itemDetail("ebook-1"), + itemKeys.detail("ebook-1"), + progressKeys.all, + ebookKeys.readerProgress("ebook-1"), + ]); + }); + it("returns the expected related queries for a series target", () => { expect( getWatchedInvalidationKeys( diff --git a/web/src/pages/ItemDetail/watchedState.ts b/web/src/pages/ItemDetail/watchedState.ts index c47dac06..1ac9c132 100644 --- a/web/src/pages/ItemDetail/watchedState.ts +++ b/web/src/pages/ItemDetail/watchedState.ts @@ -1,6 +1,6 @@ import type { QueryClient } from "@tanstack/react-query"; import type { EpisodesResponse, ItemDetail, SeasonsResponse } from "@/api/types"; -import { catalogKeys, episodeKeys, itemKeys, progressKeys } from "@/hooks/queries/keys"; +import { catalogKeys, ebookKeys, episodeKeys, itemKeys, progressKeys } from "@/hooks/queries/keys"; type WatchedStateItem = Pick< ItemDetail, @@ -20,7 +20,7 @@ function appendUniqueKey(keys: Array, nextKey: readonly unkn keys.push(nextKey); } -export function getWatchedActionLabel(item: WatchedStateItem): string { +export function getWatchedActionLabel(item: Pick): string { const played = item.user_data?.played === true; switch (item.type) { @@ -28,6 +28,10 @@ export function getWatchedActionLabel(item: WatchedStateItem): string { return played ? "Mark Series Unwatched" : "Mark Series Watched"; case "season": return played ? "Mark Season Unwatched" : "Mark Season Watched"; + case "audiobook": + return played ? "Mark Unlistened" : "Mark Listened"; + case "ebook": + return played ? "Mark Unread" : "Mark Read"; case "episode": return played ? "Mark Unwatched" : "Mark Watched"; default: @@ -35,6 +39,17 @@ export function getWatchedActionLabel(item: WatchedStateItem): string { } } +export function getWatchedToastMessage(item: Pick, played: boolean): string { + switch (item.type) { + case "audiobook": + return played ? "Marked as listened" : "Marked as unlistened"; + case "ebook": + return played ? "Marked as read" : "Marked as unread"; + default: + return played ? "Marked as watched" : "Marked as unwatched"; + } +} + export function getWatchedInvalidationKeys(item: WatchedStateItem) { const keys: Array = [ catalogKeys.itemDetail(item.content_id), @@ -74,6 +89,10 @@ export function getWatchedInvalidationKeys(item: WatchedStateItem) { keys.push(episodeKeys.byItem(item.content_id)); } + if (item.type === "ebook") { + keys.push(ebookKeys.readerProgress(item.content_id)); + } + return keys; } diff --git a/web/src/pages/LibraryBrowse.test.tsx b/web/src/pages/LibraryBrowse.test.tsx index 670c68ff..d1ea151d 100644 --- a/web/src/pages/LibraryBrowse.test.tsx +++ b/web/src/pages/LibraryBrowse.test.tsx @@ -206,4 +206,51 @@ describe("LibraryBrowse", () => { expect(state.library_id).toBe(10); expect(state.query_definition.media_scope).toBe("audiobook"); }); + + it("uses ebook media scope for ebook libraries", () => { + renderToStaticMarkup( + {}} + onQueryDefinitionChange={() => {}} + />, + ); + + const [state] = mocks.useCatalogWindow.mock.calls[ + mocks.useCatalogWindow.mock.calls.length - 1 + ] as [CatalogSearchState, Record]; + expect(state.library_id).toBe(11); + expect(state.query_definition.media_scope).toBe("ebook"); + }); + + it("normalizes video-only sorts away through the shared ebook relevance scope", () => { + renderToStaticMarkup( + {}} + onQueryDefinitionChange={() => {}} + />, + ); + + const [state] = mocks.useCatalogWindow.mock.calls[ + mocks.useCatalogWindow.mock.calls.length - 1 + ] as [CatalogSearchState, Record]; + expect(state.query_definition.sort).toEqual({ field: "title", order: "asc" }); + }); }); diff --git a/web/src/pages/LibraryBrowse.tsx b/web/src/pages/LibraryBrowse.tsx index 7f720de8..90499ded 100644 --- a/web/src/pages/LibraryBrowse.tsx +++ b/web/src/pages/LibraryBrowse.tsx @@ -8,7 +8,7 @@ import ScrollToTopButton from "@/components/ScrollToTopButton"; import { useCatalogWindow } from "@/hooks/queries/catalog"; import type { AudiobookGroupBy } from "@/hooks/queries/audiobookGroups"; import { cn } from "@/lib/utils"; -import { normalizeQuerySortForScope, type QuerySortRelevanceScope } from "@/lib/querySortOptions"; +import { normalizeQuerySortForScope } from "@/lib/querySortOptions"; import type { CatalogSearchState } from "@/pages/catalogSearchParams"; import { Select, @@ -20,7 +20,9 @@ import { import { AUDIOBOOK_BROWSE_AXES, audiobookBrowseAxisFromBrowseType, + getLibrarySortRelevanceScope, isAudiobookLibraryType, + isEbookLibraryType, type AudiobookBrowseAxis, type LibraryBrowseType, } from "./libraryPageSearchParams"; @@ -97,29 +99,6 @@ function AudiobookAxisTabs({ ); } -function getLibrarySortRelevanceScope( - libraryType: string, - mediaScope?: QueryDefinition["media_scope"], -): QuerySortRelevanceScope { - if (libraryType === "movie" || libraryType === "series") { - return libraryType; - } - // The DB stores audiobook library type as the plural "audiobooks"; - // the sort scope is the singular "audiobook" (matches QueryDefinition.media_scope). - if (libraryType === "audiobook" || libraryType === "audiobooks") { - return "audiobook"; - } - if ( - mediaScope === "movie" || - mediaScope === "series" || - mediaScope === "episode" || - mediaScope === "audiobook" - ) { - return mediaScope; - } - return "all"; -} - export default function LibraryBrowse({ libraryId, libraryType, @@ -141,9 +120,11 @@ export default function LibraryBrowse({ ? queryDefinition.media_scope : isAudiobookLibraryType(libraryType) ? "audiobook" - : libraryType === "movie" - ? libraryType - : undefined, + : isEbookLibraryType(libraryType) + ? "ebook" + : libraryType === "movie" + ? libraryType + : undefined, sort: normalizeQuerySortForScope(queryDefinition.sort, { includePersonalized: true, relevanceScope: sortRelevanceScope, diff --git a/web/src/pages/audiobooks/components/RelatedRail.test.tsx b/web/src/pages/audiobooks/components/RelatedRail.test.tsx new file mode 100644 index 00000000..b29324e1 --- /dev/null +++ b/web/src/pages/audiobooks/components/RelatedRail.test.tsx @@ -0,0 +1,45 @@ +import { renderToStaticMarkup } from "react-dom/server"; +import { MemoryRouter } from "react-router"; +import { describe, expect, it } from "vitest"; + +import { RelatedRail } from "./RelatedRail"; + +const items = [{ content_id: "book-1", title: "Book One", poster_url: "/cover.jpg" }]; + +describe("RelatedRail", () => { + it("keeps square cover geometry by default", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("aspect-square"); + expect(markup).not.toContain("aspect-[2/3]"); + }); + + it("can render portrait poster geometry for ebook rails", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain("aspect-[2/3]"); + expect(markup).not.toContain("aspect-square"); + }); + + it("encodes related item links", () => { + const markup = renderToStaticMarkup( + + + , + ); + + expect(markup).toContain('href="/item/ebook%201%2Fisbn%3A978"'); + }); +}); diff --git a/web/src/pages/audiobooks/components/RelatedRail.tsx b/web/src/pages/audiobooks/components/RelatedRail.tsx index 101fb3ef..d9682518 100644 --- a/web/src/pages/audiobooks/components/RelatedRail.tsx +++ b/web/src/pages/audiobooks/components/RelatedRail.tsx @@ -12,26 +12,35 @@ interface RelatedRailProps { heading: string; subtitle?: string; items: RelatedRailItem[]; + coverAspect?: "square" | "poster"; } -export function RelatedRail({ heading, subtitle, items }: RelatedRailProps) { +export function RelatedRail({ + heading, + subtitle, + items, + coverAspect = "square", +}: RelatedRailProps) { if (items.length === 0) return null; + const coverAspectClass = coverAspect === "poster" ? "aspect-[2/3]" : "aspect-square"; return (

    {heading}

    {subtitle &&

    {subtitle}

    }
    -
    +
    {items.map((item) => ( -
    +
    {item.poster_url ? ( { expect(state.query_definition.sort).toEqual({ field: "title", order: "asc" }); }); + it("keeps ebook media scope from catalog URLs", () => { + const state = parseCatalogSearchParams(params("source=query&type=ebook&sort=author")); + + expect(state.query_definition.media_scope).toBe("ebook"); + expect(state.query_definition.sort).toEqual({ field: "author", order: "asc" }); + }); + it("parses the video group scope and treats type=all as unscoped", () => { const video = parseCatalogSearchParams(params("source=query&q=heat&type=video")); expect(video.query_definition.media_scope).toBe("video"); diff --git a/web/src/pages/catalogSearchParams.ts b/web/src/pages/catalogSearchParams.ts index bc45f273..2420e9ee 100644 --- a/web/src/pages/catalogSearchParams.ts +++ b/web/src/pages/catalogSearchParams.ts @@ -139,6 +139,7 @@ export function parseCatalogSearchParams(searchParams: URLSearchParams): Catalog type === "series" || type === "episode" || type === "audiobook" || + type === "ebook" || type === "video" ? type : undefined, diff --git a/web/src/pages/libraryPageSearchParams.test.ts b/web/src/pages/libraryPageSearchParams.test.ts index 58e66b03..f137e521 100644 --- a/web/src/pages/libraryPageSearchParams.test.ts +++ b/web/src/pages/libraryPageSearchParams.test.ts @@ -4,6 +4,7 @@ import { describe, expect, it } from "vitest"; import { applySavedLibraryPageSearchParams, + getLibrarySortRelevanceScope, hasLibraryPageSearchParams, parseLibraryPageState, serializeLibraryPageSearchParams, @@ -142,6 +143,14 @@ describe("parseLibraryPageState", () => { expect(state.queryDefinition.sort).toEqual({ field: "author", order: "asc" }); }); + it("preserves ebook scope for mixed library filters", () => { + const state = parseLibraryPageState(params("tab=library&type=ebook&sort=author"), "mixed"); + + expect(state.activeTab).toBe("library"); + expect(state.queryDefinition.media_scope).toBe("ebook"); + expect(state.queryDefinition.sort).toEqual({ field: "author", order: "asc" }); + }); + it("accepts grouped query params and canonical sorts", () => { const state = parseLibraryPageState( params( @@ -203,6 +212,13 @@ describe("parseLibraryPageState", () => { expect(state.queryDefinition.sort).toEqual({ field: "runtime", order: "desc" }); }); + it("uses ebook scope for ebook libraries", () => { + const state = parseLibraryPageState(params("tab=library&sort=author&order=asc"), "ebooks"); + + expect(state.queryDefinition.media_scope).toBe("ebook"); + expect(state.queryDefinition.sort).toEqual({ field: "author", order: "asc" }); + }); + it("normalizes legacy sort aliases to canonical values", () => { expect( parseLibraryPageState(params("tab=library&sort=sort_title"), "mixed").queryDefinition.sort @@ -430,3 +446,21 @@ describe("library page saved state helpers", () => { }); }); }); + +describe("getLibrarySortRelevanceScope", () => { + it("maps library types to sort relevance scopes", () => { + expect(getLibrarySortRelevanceScope("movie")).toBe("movie"); + expect(getLibrarySortRelevanceScope("series")).toBe("series"); + expect(getLibrarySortRelevanceScope("audiobook")).toBe("audiobook"); + expect(getLibrarySortRelevanceScope("audiobooks")).toBe("audiobook"); + expect(getLibrarySortRelevanceScope("ebook")).toBe("ebook"); + expect(getLibrarySortRelevanceScope("ebooks")).toBe("ebook"); + }); + + it("falls back to the media scope and then to all for mixed libraries", () => { + expect(getLibrarySortRelevanceScope("mixed", "episode")).toBe("episode"); + expect(getLibrarySortRelevanceScope("mixed", "ebook")).toBe("ebook"); + expect(getLibrarySortRelevanceScope("mixed")).toBe("all"); + expect(getLibrarySortRelevanceScope("unknown")).toBe("all"); + }); +}); diff --git a/web/src/pages/libraryPageSearchParams.ts b/web/src/pages/libraryPageSearchParams.ts index ebb00764..065d3a03 100644 --- a/web/src/pages/libraryPageSearchParams.ts +++ b/web/src/pages/libraryPageSearchParams.ts @@ -77,23 +77,27 @@ function parseAudiobookLibraryBrowseType(value: string | undefined): LibraryBrow return value === "series" || value === "authors" || value === "narrators" ? value : "books"; } -function getLibrarySortRelevanceScope( +export function getLibrarySortRelevanceScope( libraryType: string, mediaScope?: QueryDefinition["media_scope"], ): QuerySortRelevanceScope { if (libraryType === "movie" || libraryType === "series") { return libraryType; } - // The DB stores audiobook library type as the plural "audiobooks"; - // the sort scope is the singular "audiobook" (matches QueryDefinition.media_scope). + // The DB stores book library types as plurals; sort scopes are singular + // values matching QueryDefinition.media_scope. if (libraryType === "audiobook" || libraryType === "audiobooks") { return "audiobook"; } + if (libraryType === "ebook" || libraryType === "ebooks") { + return "ebook"; + } if ( mediaScope === "movie" || mediaScope === "series" || mediaScope === "episode" || - mediaScope === "audiobook" + mediaScope === "audiobook" || + mediaScope === "ebook" ) { return mediaScope; } @@ -104,6 +108,10 @@ export function isAudiobookLibraryType(libraryType: string): boolean { return libraryType === "audiobook" || libraryType === "audiobooks"; } +export function isEbookLibraryType(libraryType: string): boolean { + return libraryType === "ebook" || libraryType === "ebooks"; +} + function readString(value: string | null): string | undefined { const normalized = value?.trim(); return normalized ? normalized : undefined; @@ -295,11 +303,14 @@ export function parseLibraryPageState( (mediaScopeParam === "movie" || mediaScopeParam === "series" || mediaScopeParam === "episode" || - mediaScopeParam === "audiobook") + mediaScopeParam === "audiobook" || + mediaScopeParam === "ebook") ? mediaScopeParam : isAudiobookLibraryType(libraryType) ? "audiobook" - : undefined; + : isEbookLibraryType(libraryType) + ? "ebook" + : undefined; const sortRelevanceScope = libraryType === "series" && browseType === "episode" ? "all" diff --git a/web/src/reader/FoliateBookReader.component.test.tsx b/web/src/reader/FoliateBookReader.component.test.tsx new file mode 100644 index 00000000..45d26684 --- /dev/null +++ b/web/src/reader/FoliateBookReader.component.test.tsx @@ -0,0 +1,426 @@ +// @vitest-environment jsdom + +import { act } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import type { FileVersion } from "@/api/types"; +import type { BookDoc } from "@/reader/readest/libs/document"; + +const mocks = vi.hoisted(() => ({ + api: vi.fn(), + apiBlob: vi.fn(), + apiKeepalive: vi.fn(), + loaderOpen: vi.fn(), +})); + +vi.mock("@/api/client", () => ({ + api: mocks.api, + apiBlob: mocks.apiBlob, + apiKeepalive: mocks.apiKeepalive, +})); + +vi.mock("@/reader/readest/libs/document", async () => { + const actual = await vi.importActual( + "@/reader/readest/libs/document", + ); + return { + ...actual, + DocumentLoader: class { + private file: File; + + constructor(file: File) { + this.file = file; + } + + open() { + return mocks.loaderOpen(this.file); + } + }, + }; +}); + +vi.mock("foliate-js/view.js", () => ({})); + +import FoliateBookReader, { + ebookReaderProgressQueryKey, + type ReaderReadyState, +} from "@/reader/FoliateBookReader"; + +type DestroyableBook = BookDoc & { destroy: () => void }; + +const createdViews: FakeFoliateView[] = []; +// Each created view shifts one behavior off this queue for its open() call; +// when the queue is empty open() resolves immediately. +const viewOpenBehaviors: Array<() => Promise> = []; + +class FakeFoliateView extends HTMLElement { + book: unknown = null; + close = vi.fn(); + init = vi.fn(async () => {}); + goToFraction = vi.fn(async () => {}); + open = vi.fn((book: unknown) => { + this.book = book; + const behavior = viewOpenBehaviors.shift(); + return behavior ? behavior() : Promise.resolve(); + }); + + constructor() { + super(); + createdViews.push(this); + } +} + +if (!customElements.get("foliate-view")) { + customElements.define("foliate-view", FakeFoliateView); +} + +function deferred() { + let resolve!: (value: T) => void; + let reject!: (reason?: unknown) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} + +function makeBook(label: string): DestroyableBook { + return { + toc: [{ id: 1, label, href: `${label}.xhtml` }], + destroy: vi.fn(), + } as unknown as DestroyableBook; +} + +function makeFile(fileID: number, name: string): FileVersion { + return { + file_id: fileID, + file_name: name, + file_path: `/books/${name}`, + resolution: "", + codec_video: "", + codec_audio: "", + hdr: false, + container: "epub", + file_size: 1, + duration: 0, + bitrate: 0, + }; +} + +function viewAt(index: number): FakeFoliateView { + const view = createdViews[index]; + if (!view) throw new Error(`expected a foliate-view at index ${index}`); + return view; +} + +function relocateEvent(current: number, cfi?: string) { + return new CustomEvent("relocate", { + detail: { cfi, location: { current, total: 10 } }, + }); +} + +describe("FoliateBookReader open flow", () => { + let container: HTMLDivElement; + let root: Root; + let queryClient: QueryClient; + + const fileA = makeFile(7, "a.epub"); + const fileB = makeFile(8, "b.epub"); + + function ui(file: FileVersion, props: { onReady?: (state: ReaderReadyState) => void } = {}) { + return ( + + + + ); + } + + beforeEach(() => { + ( + globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } + ).IS_REACT_ACT_ENVIRONMENT = true; + container = document.createElement("div"); + document.body.appendChild(container); + root = createRoot(container); + queryClient = new QueryClient(); + createdViews.length = 0; + viewOpenBehaviors.length = 0; + mocks.api.mockReset(); + mocks.apiBlob.mockReset(); + mocks.apiKeepalive.mockReset(); + mocks.loaderOpen.mockReset(); + mocks.api.mockImplementation(async (_path: string, options?: RequestInit) => { + if (options?.method === "PUT") { + return JSON.parse(String(options.body)) as Record; + } + return {}; + }); + mocks.apiBlob.mockResolvedValue(new Blob(["epub"], { type: "application/epub+zip" })); + let urlCounter = 0; + URL.createObjectURL = vi.fn(() => `blob:mock-${++urlCounter}`); + URL.revokeObjectURL = vi.fn(); + }); + + afterEach(async () => { + vi.useRealTimers(); + await act(async () => { + root.unmount(); + }); + container.remove(); + }); + + it("tears down a superseded run when the loader resolves after a file switch", async () => { + const bookA = makeBook("A"); + const bookB = makeBook("B"); + const loaderA = deferred<{ book: BookDoc }>(); + mocks.loaderOpen.mockImplementation((file: File) => + file.name === "a.epub" ? loaderA.promise : Promise.resolve({ book: bookB }), + ); + const onReady = vi.fn(); + + await act(async () => { + root.render(ui(fileA, { onReady })); + }); + // Run A is parked on DocumentLoader.open(); switch files before it resolves. + await act(async () => { + root.render(ui(fileB, { onReady })); + }); + await act(async () => { + loaderA.resolve({ book: bookA }); + }); + + expect(bookA.destroy).toHaveBeenCalledTimes(1); + // The stale run must not create a view or report a stale TOC. + expect(createdViews).toHaveLength(1); + expect(container.querySelectorAll("foliate-view")).toHaveLength(1); + expect(onReady).toHaveBeenCalledTimes(1); + expect(onReady).toHaveBeenCalledWith({ toc: bookB.toc }); + expect(URL.revokeObjectURL).toHaveBeenCalledWith("blob:mock-1"); + }); + + it("closes a stale view whose open() resolves after cancellation and keeps the live one", async () => { + const bookA = makeBook("A"); + const bookB = makeBook("B"); + mocks.loaderOpen.mockImplementation((file: File) => + Promise.resolve({ book: file.name === "a.epub" ? bookA : bookB }), + ); + const viewOpenA = deferred(); + viewOpenBehaviors.push(() => viewOpenA.promise); + const onReady = vi.fn(); + + await act(async () => { + root.render(ui(fileA, { onReady })); + }); + expect(createdViews).toHaveLength(1); + const viewA = viewAt(0); + + await act(async () => { + root.render(ui(fileB, { onReady })); + }); + expect(createdViews).toHaveLength(2); + const viewB = viewAt(1); + + await act(async () => { + viewOpenA.resolve(); + }); + + expect(viewA.close).toHaveBeenCalled(); + expect(viewA.isConnected).toBe(false); + expect(bookA.destroy).toHaveBeenCalledTimes(1); + expect(bookB.destroy).not.toHaveBeenCalled(); + expect(onReady).toHaveBeenCalledTimes(1); + expect(onReady).toHaveBeenCalledWith({ toc: bookB.toc }); + expect(Array.from(container.querySelectorAll("foliate-view"))).toEqual([viewB]); + + // Relocates from the superseded view must not save progress for its file. + await act(async () => { + viewA.dispatchEvent(relocateEvent(3, "epubcfi(/6/2)")); + window.dispatchEvent(new Event("pagehide")); + }); + expect(mocks.apiKeepalive).not.toHaveBeenCalled(); + }); + + it("flushes pending progress with a keepalive request when the page hides", async () => { + const book = makeBook("A"); + mocks.loaderOpen.mockResolvedValue({ book }); + + await act(async () => { + root.render(ui(fileA)); + }); + const view = viewAt(0); + + await act(async () => { + view.dispatchEvent(relocateEvent(2, "epubcfi(/6/4)")); + }); + await act(async () => { + window.dispatchEvent(new Event("pagehide")); + }); + + expect(mocks.apiKeepalive).toHaveBeenCalledTimes(1); + expect(mocks.apiKeepalive).toHaveBeenCalledWith("/ebooks/book-1/progress", { + method: "PUT", + body: JSON.stringify({ file_id: 7, location: "epubcfi(/6/4)", progress: 0.3 }), + }); + + // The pending save was consumed; hiding again must not re-send it. + await act(async () => { + window.dispatchEvent(new Event("pagehide")); + }); + expect(mocks.apiKeepalive).toHaveBeenCalledTimes(1); + }); + + it("flushes pending progress through the authenticated api when the tab merely hides", async () => { + const book = makeBook("A"); + mocks.loaderOpen.mockResolvedValue({ book }); + + await act(async () => { + root.render(ui(fileA)); + }); + const view = viewAt(0); + + await act(async () => { + view.dispatchEvent(relocateEvent(2, "epubcfi(/6/4)")); + }); + + const putCalls = () => + mocks.api.mock.calls.filter(([, options]) => (options as RequestInit)?.method === "PUT"); + expect(putCalls()).toHaveLength(0); + + // The page is alive while hidden; the normal api path can refresh an + // expired token, unlike keepalive. + Object.defineProperty(document, "visibilityState", { + configurable: true, + get: () => "hidden", + }); + try { + await act(async () => { + document.dispatchEvent(new Event("visibilitychange")); + }); + + expect(mocks.apiKeepalive).not.toHaveBeenCalled(); + expect(putCalls()).toHaveLength(1); + expect(putCalls()[0]).toEqual([ + "/ebooks/book-1/progress", + { + method: "PUT", + body: JSON.stringify({ file_id: 7, location: "epubcfi(/6/4)", progress: 0.3 }), + }, + ]); + + // The pending save was consumed once; a pagehide with no new progress + // must not double-send it through keepalive. + await act(async () => { + window.dispatchEvent(new Event("pagehide")); + }); + expect(mocks.apiKeepalive).not.toHaveBeenCalled(); + expect(putCalls()).toHaveLength(1); + } finally { + Object.defineProperty(document, "visibilityState", { + configurable: true, + get: () => "visible", + }); + } + }); + + it("opens external http(s) links itself with noopener and blocks unsafe schemes", async () => { + const book = makeBook("A"); + mocks.loaderOpen.mockResolvedValue({ book }); + const open = vi.fn(); + vi.stubGlobal("open", open); + + try { + await act(async () => { + root.render(ui(fileA)); + }); + const view = viewAt(0); + + // Mirrors the vendored foliate contract: it emits a cancelable + // 'external-link' event and only runs its own globalThis.open(href, + // '_blank') when dispatchEvent returns true (no preventDefault). + const externalLink = (href: string) => + new CustomEvent("external-link", { detail: { href }, cancelable: true }); + + const httpsEvent = externalLink("https://example.com/page"); + let defaultAllowed = true; + await act(async () => { + defaultAllowed = view.dispatchEvent(httpsEvent); + }); + // The vendor default open must be cancelled; we open safely ourselves. + expect(defaultAllowed).toBe(false); + expect(open).toHaveBeenCalledTimes(1); + expect(open).toHaveBeenCalledWith( + "https://example.com/page", + "_blank", + "noopener,noreferrer", + ); + + for (const href of ["javascript:alert(1)", "data:text/html,hi", "not a url"]) { + let allowed = true; + await act(async () => { + allowed = view.dispatchEvent(externalLink(href)); + }); + expect(allowed).toBe(false); + } + expect(open).toHaveBeenCalledTimes(1); + } finally { + vi.unstubAllGlobals(); + } + }); + + it("surfaces a user-facing error when the ebook file fails to load", async () => { + mocks.apiBlob.mockRejectedValue( + new Error("This file is too large to open in the browser (3072 MiB, limit 512 MiB)."), + ); + + await act(async () => { + root.render(ui(fileA)); + }); + + expect(container.textContent).toContain("This file is too large to open in the browser"); + expect(container.textContent).not.toContain("Loading reader..."); + }); + + it("ignores progress save responses that resolve out of order", async () => { + const book = makeBook("A"); + mocks.loaderOpen.mockResolvedValue({ book }); + const firstPut = deferred>(); + const secondPut = deferred>(); + const puts = [firstPut, secondPut]; + mocks.api.mockImplementation((_path: string, options?: RequestInit) => { + if (options?.method === "PUT") { + return puts.shift()!.promise; + } + return Promise.resolve({}); + }); + + await act(async () => { + root.render(ui(fileA)); + }); + const view = viewAt(0); + vi.useFakeTimers(); + + await act(async () => { + view.dispatchEvent(relocateEvent(1, "epubcfi(/6/2)")); + vi.advanceTimersByTime(800); + }); + await act(async () => { + view.dispatchEvent(relocateEvent(4, "epubcfi(/6/8)")); + vi.advanceTimersByTime(800); + }); + + // The newer save resolves first; the older response must not overwrite it. + await act(async () => { + secondPut.resolve({ file_id: 7, location: "epubcfi(/6/8)", progress: 0.5 }); + }); + await act(async () => { + firstPut.resolve({ file_id: 7, location: "epubcfi(/6/2)", progress: 0.2 }); + }); + + expect(queryClient.getQueryData(ebookReaderProgressQueryKey("book-1"))).toMatchObject({ + location: "epubcfi(/6/8)", + progress: 0.5, + }); + }); +}); diff --git a/web/src/reader/FoliateBookReader.test.ts b/web/src/reader/FoliateBookReader.test.ts new file mode 100644 index 00000000..d07b67f0 --- /dev/null +++ b/web/src/reader/FoliateBookReader.test.ts @@ -0,0 +1,300 @@ +import { describe, expect, it } from "vitest"; +import { QueryClient } from "@tanstack/react-query"; + +import type { FileVersion } from "@/api/types"; +import { DocumentLoader } from "@/reader/readest/libs/document"; +import { + cacheEbookReaderProgress, + DEFAULT_READER_SETTINGS, + ebookProgressPath, + ebookReaderProgressQueryKey, + ebookReadPath, + formatReaderProgress, + isReaderSupportedFile, + normalizeReaderSettings, + parseReaderLocation, + READER_FONT_STACKS, + readerRendererAttributes, + readerStyles, + restoreProgressTarget, + progressFromRelocate, + readerFileFormat, + readerMimeType, +} from "./FoliateBookReader"; + +function version(overrides: Partial): FileVersion { + return { + file_id: overrides.file_id ?? 7, + file_name: overrides.file_name, + file_path: overrides.file_path, + resolution: "", + codec_video: "", + codec_audio: "", + hdr: false, + container: overrides.container ?? "", + file_size: 1, + duration: 0, + bitrate: 0, + }; +} + +describe("FoliateBookReader helpers", () => { + it("builds the protected ebook read endpoint", () => { + expect(ebookReadPath("ebook 1", 42)).toBe("/ebooks/ebook%201/files/42/read"); + }); + + it("builds the protected ebook progress endpoint", () => { + expect(ebookProgressPath("ebook 1")).toBe("/ebooks/ebook%201/progress"); + }); + + it("caches saved reader progress under the shared detail query key", () => { + const client = new QueryClient(); + const saved = { + file_id: 42, + location: "epubcfi(/6/4)", + progress: 0.42, + content_id: "ebook 1", + }; + + cacheEbookReaderProgress(client, "ebook 1", saved); + + expect(client.getQueryData(ebookReaderProgressQueryKey("ebook 1"))).toEqual(saved); + }); + + it("detects reader file formats from container or filename", () => { + expect(readerFileFormat(version({ container: ".AZW3", file_name: "ignored.epub" }))).toBe( + "azw3", + ); + expect(readerFileFormat(version({ file_name: "book.fb2.zip" }))).toBe("fbz"); + expect(readerFileFormat(version({ container: "zip", file_name: "book.fb2.zip" }))).toBe("fbz"); + expect(readerFileFormat(version({ container: "zip", file_name: "comic.cbz" }))).toBe("cbz"); + expect(readerFileFormat(version({ container: "rar", file_name: "comic.cbr" }))).toBe("cbr"); + expect(readerFileFormat(version({ file_path: "/library/book.cbz" }))).toBe("cbz"); + }); + + it("does not support plain text files in the reader", () => { + expect(isReaderSupportedFile(version({ file_name: "notes.txt" }))).toBe(false); + }); + + it("does not advertise markdown as a supported ebook format", () => { + expect(isReaderSupportedFile(version({ file_name: "notes.md" }))).toBe(false); + expect(readerMimeType("md")).toBe("application/octet-stream"); + }); + + it("rejects plain text when the document loader is called directly", async () => { + const file = new File(["notes"], "notes.txt", { type: "text/plain" }); + + await expect(new DocumentLoader(file).open()).rejects.toThrow("Unsupported book format"); + }); + + it("maps readest formats to MIME types", () => { + expect(readerMimeType("epub")).toBe("application/epub+zip"); + expect(readerMimeType("azw3")).toBe("application/vnd.amazon.mobi8-ebook"); + expect(readerMimeType("fbz")).toBe("application/x-zip-compressed-fb2"); + }); + + it("converts relocate events into saveable progress", () => { + expect( + progressFromRelocate( + { + cfi: "epubcfi(/6/4)", + location: { current: 2, total: 10 }, + }, + 42, + ), + ).toEqual({ + file_id: 42, + location: "epubcfi(/6/4)", + progress: 0.3, + }); + }); + + it("converts non-CFI relocate events into fraction-backed progress", () => { + expect( + progressFromRelocate( + { + location: { current: 4, total: 10 }, + }, + 42, + ), + ).toEqual({ + file_id: 42, + location: "fraction:0.500000", + progress: 0.5, + }); + }); + + it("chooses a fraction restore target for non-CFI reader progress", () => { + expect( + restoreProgressTarget({ + file_id: 42, + location: "fraction:0.500000", + progress: 0.5, + }), + ).toEqual({ type: "fraction", fraction: 0.5 }); + expect( + restoreProgressTarget({ + file_id: 42, + location: "epubcfi(/6/4)", + progress: 0.3, + }), + ).toEqual({ type: "location", location: "epubcfi(/6/4)" }); + }); + + it("parses stored reader locations into navigation targets", () => { + expect(parseReaderLocation("fraction:0.500000")).toEqual({ type: "fraction", fraction: 0.5 }); + expect(parseReaderLocation("fraction:1.5")).toEqual({ type: "fraction", fraction: 1 }); + expect(parseReaderLocation(" epubcfi(/6/4) ")).toEqual({ + type: "location", + location: "epubcfi(/6/4)", + }); + expect(parseReaderLocation("fraction:not-a-number")).toBeNull(); + expect(parseReaderLocation("")).toBeNull(); + expect(parseReaderLocation(undefined)).toBeNull(); + }); + + it("formats reader progress for compact controls", () => { + expect(formatReaderProgress(null)).toBeNull(); + expect(formatReaderProgress(Number.NaN)).toBeNull(); + expect(formatReaderProgress(0)).toBe("0%"); + expect(formatReaderProgress(0.421)).toBe("42%"); + expect(formatReaderProgress(1)).toBe("100%"); + expect(formatReaderProgress(1.5)).toBe("100%"); + }); + + it("ignores relocate events without a usable location", () => { + expect(progressFromRelocate({ cfi: "epubcfi(/6/4)", location: { total: 0 } }, 42)).toBeNull(); + }); + + it("normalizes reader settings into bounded values", () => { + expect( + normalizeReaderSettings({ + fontSize: 400, + lineHeight: 0.2, + margin: -10, + maxWidth: 200, + theme: "sepia", + flow: "scrolled", + spread: "none", + }), + ).toMatchObject({ + fontSize: 180, + lineHeight: 1.1, + margin: 0, + maxWidth: 96, + theme: "sepia", + flow: "scrolled", + spread: "none", + }); + }); + + it("defaults to the ebook publisher font instead of an unloaded named font", () => { + expect(DEFAULT_READER_SETTINGS.fontFamily).toBe("inherit"); + expect(normalizeReaderSettings({ fontFamily: "" }).fontFamily).toBe("inherit"); + }); + + it("migrates font choices persisted before the generic stacks existed", () => { + expect( + normalizeReaderSettings({ fontFamily: "Inter, ui-sans-serif, system-ui, sans-serif" }) + .fontFamily, + ).toBe(READER_FONT_STACKS.sans); + expect(normalizeReaderSettings({ fontFamily: "Georgia, serif" }).fontFamily).toBe( + READER_FONT_STACKS.serif, + ); + expect(normalizeReaderSettings({ fontFamily: "Merriweather, Georgia, serif" }).fontFamily).toBe( + READER_FONT_STACKS.serif, + ); + expect( + normalizeReaderSettings({ fontFamily: "ui-serif, Georgia, Cambria, serif" }).fontFamily, + ).toBe(READER_FONT_STACKS.serif); + }); + + it("normalizes persisted reading ruler settings", () => { + expect( + normalizeReaderSettings({ + readingRuler: true, + readingRulerTop: 250, + }), + ).toMatchObject({ + readingRuler: true, + readingRulerTop: 100, + }); + expect(normalizeReaderSettings({ readingRulerTop: -10 })).toMatchObject({ + readingRuler: false, + readingRulerTop: 0, + }); + }); + + it("builds reader styles from settings", () => { + const styles = readerStyles( + normalizeReaderSettings({ + theme: "dark", + fontFamily: READER_FONT_STACKS.serif, + fontSize: 128, + fontWeight: 500, + lineHeight: 1.8, + maxWidth: 68, + hyphenation: false, + rtl: true, + writingMode: "vertical-rl", + }), + ); + + expect(styles).toContain("color-scheme: dark"); + expect(styles).toContain("background: #111827 !important"); + expect(styles).toContain(`font-family: ${READER_FONT_STACKS.serif} !important`); + expect(styles).toContain("font-size: 128% !important"); + expect(styles).toContain("font-weight: 500 !important"); + expect(styles).toContain("hyphens: none !important"); + expect(styles).toContain("line-height: 1.8 !important"); + expect(styles).toContain("max-width: 68ch !important"); + expect(styles).toContain("direction: rtl !important"); + expect(styles).toContain("writing-mode: vertical-rl !important"); + }); + + it("uses full available width in scrolled flow", () => { + const scrolledStyles = readerStyles( + normalizeReaderSettings({ + flow: "scrolled", + maxWidth: 68, + }), + ); + + expect(scrolledStyles).toContain("max-width: none !important"); + expect(scrolledStyles).not.toContain("max-width: 68ch !important"); + + expect( + readerRendererAttributes( + normalizeReaderSettings({ + flow: "paginated", + maxWidth: 68, + margin: 20, + spread: "auto", + }), + ), + ).toEqual({ + flow: null, + gap: "7%", + margin: "20px", + maxColumnCount: "2", + maxInlineSize: "680px", + }); + + expect( + readerRendererAttributes( + normalizeReaderSettings({ + flow: "scrolled", + maxWidth: 68, + margin: 20, + spread: "auto", + }), + ), + ).toEqual({ + flow: "scrolled", + gap: "7%", + margin: "20px", + maxColumnCount: "1", + maxInlineSize: "9999px", + }); + }); +}); diff --git a/web/src/reader/FoliateBookReader.tsx b/web/src/reader/FoliateBookReader.tsx new file mode 100644 index 00000000..9047f8f6 --- /dev/null +++ b/web/src/reader/FoliateBookReader.tsx @@ -0,0 +1,941 @@ +import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react"; +import { type QueryClient, useQueryClient } from "@tanstack/react-query"; + +import { api, apiBlob, apiKeepalive } from "@/api/client"; +import type { FileVersion } from "@/api/types"; +import { ebookKeys } from "@/hooks/queries/keys"; +import type { EbookReaderAnnotation } from "@/reader/ebookReaderApi"; +import { DocumentLoader, type BookDoc, type TOCItem } from "@/reader/readest/libs/document"; + +type FoliateViewElement = HTMLElement & { + open: (book: BookDoc) => Promise; + close?: () => void; + init: (options: { lastLocation: string }) => Promise; + goToFraction: (fraction: number) => Promise; + goTo?: (href: string) => void; + getCFI?: (index: number, range: Range) => string; + addAnnotation?: ( + annotation: { value: string; color?: string; style?: string; note?: string }, + remove?: boolean, + ) => void; + deselect?: () => void; + next?: () => void; + prev?: () => void; + search?: ( + options: ReaderSearchOptions & { query: string }, + ) => AsyncGenerator; + clearSearch?: () => void; + renderer?: HTMLElement & { + primaryIndex?: number; + getContents?: () => Array<{ doc: Document; index?: number }>; + setStyles?: (css: string) => void; + render?: () => Promise; + }; +}; + +export type ReaderLoadState = { + objectUrl: string; + filename: string; +}; + +export type EbookReaderProgressPayload = { + file_id: number; + location: string; + progress: number; +}; + +export type EbookReaderProgress = EbookReaderProgressPayload & { + content_id?: string; + updated_at?: string; +}; + +export type RestoreProgressTarget = + | { type: "location"; location: string } + | { type: "fraction"; fraction: number }; + +export type FoliateBookReaderHandle = { + next: () => void; + prev: () => void; + goTo: (href: string) => void; + goToFraction: (fraction: number) => Promise; + search: (query: string) => Promise; + clearSearch: () => void; + clearSelection: () => void; + createSelectionAnnotation: () => ReaderSelection | null; + getReadableText: () => string; +}; + +export type ReaderTheme = "light" | "sepia" | "dark"; +export type ReaderFlow = "paginated" | "scrolled"; +export type ReaderSpread = "auto" | "none"; +export type ReaderWritingMode = "auto" | "horizontal-tb" | "vertical-rl"; + +export type ReaderSettings = { + theme: ReaderTheme; + fontFamily: string; + fontSize: number; + fontWeight: number; + hyphenation: boolean; + lineHeight: number; + margin: number; + maxWidth: number; + spread: ReaderSpread; + flow: ReaderFlow; + fontBrightness: number; + rtl: boolean; + writingMode: ReaderWritingMode; + readingRuler: boolean; + readingRulerTop: number; +}; + +export type ReaderReadyState = { + toc: TOCItem[]; +}; + +export type ReaderSearchOptions = { + matchCase?: boolean; + matchDiacritics?: boolean; + matchWholeWords?: boolean; + scope?: "book" | "section"; +}; + +export type ReaderSearchResult = { + cfi: string; + label?: string; + excerpt?: string; +}; + +export type ReaderSelection = { + cfi: string; + rect: { + height: number; + left: number; + top: number; + width: number; + }; + selectedText: string; +}; + +type FoliateSearchResult = { + cfi?: string; + excerpt?: string; + label?: string; + section?: { label?: string; href?: string }; + subitems?: Array<{ + cfi?: string; + excerpt?: string; + label?: string; + }>; +}; + +type RelocateDetail = { + cfi?: string; + location?: { + current?: number; + total?: number; + }; +}; + +// foliate book documents expose destroy() to release cached resource blob URLs, +// but the readest BookDoc interface does not declare it. +type DisposableBookDoc = BookDoc & { destroy?: () => void }; + +const READEST_FORMATS = new Set(["epub", "pdf", "mobi", "azw", "azw3", "cbz", "cbr", "fb2", "fbz"]); + +export const READER_FONT_STACKS = { + inherit: "inherit", + serif: 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif', + sans: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif', + mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace', +} as const; + +// Font values persisted before the reader switched to generic stacks; without this +// mapping the font select renders blank for settings saved by older builds. +const LEGACY_READER_FONT_ALIASES: Record = { + "Inter, ui-sans-serif, system-ui, sans-serif": READER_FONT_STACKS.sans, + "Georgia, serif": READER_FONT_STACKS.serif, + "Merriweather, Georgia, serif": READER_FONT_STACKS.serif, + "ui-serif, Georgia, Cambria, serif": READER_FONT_STACKS.serif, +}; + +export const DEFAULT_READER_SETTINGS: ReaderSettings = { + theme: "light", + fontFamily: READER_FONT_STACKS.inherit, + fontSize: 112, + fontWeight: 400, + hyphenation: true, + lineHeight: 1.65, + margin: 24, + maxWidth: 74, + spread: "auto", + flow: "paginated", + fontBrightness: 100, + rtl: false, + writingMode: "auto", + readingRuler: false, + readingRulerTop: 50, +}; + +export function ebookReadPath(contentID: string, fileID: number): string { + return `/ebooks/${encodeURIComponent(contentID)}/files/${fileID}/read`; +} + +export function ebookProgressPath(contentID: string): string { + return `/ebooks/${encodeURIComponent(contentID)}/progress`; +} + +export function ebookReaderProgressQueryKey(contentID: string | undefined) { + return ebookKeys.readerProgress(contentID); +} + +export function cacheEbookReaderProgress( + queryClient: QueryClient, + contentID: string, + progress: EbookReaderProgress, +) { + queryClient.setQueryData(ebookReaderProgressQueryKey(contentID), progress); +} + +export function readerFileFormat(file: FileVersion | undefined): string { + if (!file) return ""; + const fileName = file.file_name || file.file_path || ""; + if (fileName.toLowerCase().endsWith(".fb2.zip")) return "fbz"; + const extension = /\.([a-z0-9]+)$/i.exec(fileName)?.[1]?.toLowerCase() ?? ""; + const container = file.container?.trim().toLowerCase(); + const normalizedContainer = container ? container.replace(/^\./, "") : ""; + if (normalizedContainer && normalizedContainer !== "zip" && normalizedContainer !== "rar") { + return normalizedContainer; + } + return extension || normalizedContainer; +} + +export function isReaderSupportedFile(file: FileVersion | undefined): boolean { + return READEST_FORMATS.has(readerFileFormat(file)); +} + +export function readerMimeType(format: string): string { + switch (format.toLowerCase()) { + case "epub": + return "application/epub+zip"; + case "pdf": + return "application/pdf"; + case "mobi": + return "application/x-mobipocket-ebook"; + case "azw": + return "application/vnd.amazon.ebook"; + case "azw3": + return "application/vnd.amazon.mobi8-ebook"; + case "cbz": + return "application/vnd.comicbook+zip"; + case "cbr": + return "application/vnd.comicbook-rar"; + case "fb2": + return "application/x-fictionbook+xml"; + case "fbz": + return "application/x-zip-compressed-fb2"; + default: + return "application/octet-stream"; + } +} + +export function progressFromRelocate( + detail: RelocateDetail, + fileID: number, +): EbookReaderProgressPayload | null { + const current = detail.location?.current ?? 0; + const total = detail.location?.total ?? 0; + if (total <= 0 || current < 0) return null; + const progress = Math.min(1, Math.max(0, (current + 1) / total)); + const cfi = typeof detail.cfi === "string" ? detail.cfi.trim() : ""; + return { + file_id: fileID, + location: cfi || `fraction:${progress.toFixed(6)}`, + progress, + }; +} + +function clampFraction(value: number): number { + return Math.min(1, Math.max(0, value)); +} + +/** + * Parses a stored reader location into a navigation target. Locations are either + * raw CFI/href strings or synthetic `fraction:` values (used for bookmarks and + * progress in formats without CFIs), which foliate cannot resolve directly. + */ +export function parseReaderLocation( + location: string | null | undefined, +): RestoreProgressTarget | null { + if (typeof location !== "string") return null; + const trimmed = location.trim(); + if (!trimmed) return null; + if (trimmed.startsWith("fraction:")) { + const value = Number(trimmed.slice("fraction:".length)); + if (!Number.isFinite(value)) return null; + return { type: "fraction", fraction: clampFraction(value) }; + } + return { type: "location", location: trimmed }; +} + +export function restoreProgressTarget( + progress: Pick | null | undefined, +): RestoreProgressTarget | null { + if (!progress || typeof progress.location !== "string") return null; + const location = progress.location.trim(); + const target = parseReaderLocation(location); + if (target) return target; + // A malformed fraction location can still be restored from the stored progress value. + if (location.startsWith("fraction:") && Number.isFinite(progress.progress)) { + return { type: "fraction", fraction: clampFraction(progress.progress) }; + } + return null; +} + +export function formatReaderProgress(progress: number | null | undefined): string | null { + if (typeof progress !== "number" || !Number.isFinite(progress)) return null; + const bounded = Math.min(1, Math.max(0, progress)); + return `${Math.round(bounded * 100)}%`; +} + +function clampNumber(value: unknown, fallback: number, min: number, max: number): number { + const number = typeof value === "number" ? value : Number(value); + if (!Number.isFinite(number)) return fallback; + return Math.min(max, Math.max(min, number)); +} + +function isReaderTheme(value: unknown): value is ReaderTheme { + return value === "light" || value === "sepia" || value === "dark"; +} + +function isReaderFlow(value: unknown): value is ReaderFlow { + return value === "paginated" || value === "scrolled"; +} + +function isReaderSpread(value: unknown): value is ReaderSpread { + return value === "auto" || value === "none"; +} + +function isReaderWritingMode(value: unknown): value is ReaderWritingMode { + return value === "auto" || value === "horizontal-tb" || value === "vertical-rl"; +} + +function normalizeReaderFontFamily(value: unknown): string { + if (typeof value !== "string" || !value.trim()) return DEFAULT_READER_SETTINGS.fontFamily; + const trimmed = value.trim(); + return LEGACY_READER_FONT_ALIASES[trimmed] ?? trimmed; +} + +export function normalizeReaderSettings(settings?: Partial): ReaderSettings { + return { + theme: isReaderTheme(settings?.theme) ? settings.theme : DEFAULT_READER_SETTINGS.theme, + fontFamily: normalizeReaderFontFamily(settings?.fontFamily), + fontSize: clampNumber(settings?.fontSize, DEFAULT_READER_SETTINGS.fontSize, 80, 180), + fontWeight: clampNumber(settings?.fontWeight, DEFAULT_READER_SETTINGS.fontWeight, 300, 800), + hyphenation: + typeof settings?.hyphenation === "boolean" + ? settings.hyphenation + : DEFAULT_READER_SETTINGS.hyphenation, + lineHeight: clampNumber(settings?.lineHeight, DEFAULT_READER_SETTINGS.lineHeight, 1.1, 2.4), + margin: clampNumber(settings?.margin, DEFAULT_READER_SETTINGS.margin, 0, 64), + maxWidth: clampNumber(settings?.maxWidth, DEFAULT_READER_SETTINGS.maxWidth, 42, 96), + spread: isReaderSpread(settings?.spread) ? settings.spread : DEFAULT_READER_SETTINGS.spread, + flow: isReaderFlow(settings?.flow) ? settings.flow : DEFAULT_READER_SETTINGS.flow, + fontBrightness: clampNumber( + settings?.fontBrightness, + DEFAULT_READER_SETTINGS.fontBrightness, + 70, + 125, + ), + rtl: typeof settings?.rtl === "boolean" ? settings.rtl : DEFAULT_READER_SETTINGS.rtl, + writingMode: isReaderWritingMode(settings?.writingMode) + ? settings.writingMode + : DEFAULT_READER_SETTINGS.writingMode, + readingRuler: + typeof settings?.readingRuler === "boolean" + ? settings.readingRuler + : DEFAULT_READER_SETTINGS.readingRuler, + readingRulerTop: clampNumber( + settings?.readingRulerTop, + DEFAULT_READER_SETTINGS.readingRulerTop, + 0, + 100, + ), + }; +} + +export async function fetchEbookReaderProgress( + contentID: string, +): Promise { + const progress = await api>(ebookProgressPath(contentID)); + if (!progress || typeof progress.location !== "string" || progress.location.trim() === "") { + return null; + } + if (typeof progress.file_id !== "number" || typeof progress.progress !== "number") { + return null; + } + return { + file_id: progress.file_id, + location: progress.location, + progress: progress.progress, + content_id: progress.content_id, + updated_at: progress.updated_at, + }; +} + +export async function saveEbookReaderProgress( + contentID: string, + progress: EbookReaderProgressPayload, +): Promise { + return api(ebookProgressPath(contentID), { + method: "PUT", + body: JSON.stringify(progress), + }); +} + +function readerColors(theme: ReaderTheme) { + switch (theme) { + case "dark": + return { + background: "#111827", + foreground: "#f8fafc", + link: "#93c5fd", + scheme: "dark", + }; + case "sepia": + return { + background: "#f4ecd8", + foreground: "#2f261b", + link: "#8b5a2b", + scheme: "light", + }; + default: + return { + background: "#ffffff", + foreground: "#171717", + link: "#2563eb", + scheme: "light", + }; + } +} + +export function readerStyles(settings: ReaderSettings = DEFAULT_READER_SETTINGS) { + const colors = readerColors(settings.theme); + const contentMaxWidth = settings.flow === "scrolled" ? "none" : `${settings.maxWidth}ch`; + return ` + :root { + --theme-bg-color: ${colors.background}; + --theme-fg-color: ${colors.foreground}; + --override-color: true; + color-scheme: ${colors.scheme}; + } + html, body { + background: ${colors.background} !important; + color: ${colors.foreground} !important; + font-family: ${settings.fontFamily} !important; + font-size: ${settings.fontSize}% !important; + font-weight: ${settings.fontWeight} !important; + hyphens: ${settings.hyphenation ? "auto" : "none"} !important; + line-height: ${settings.lineHeight} !important; + max-width: ${contentMaxWidth} !important; + direction: ${settings.rtl ? "rtl" : "inherit"} !important; + writing-mode: ${settings.writingMode === "auto" ? "inherit" : settings.writingMode} !important; + filter: brightness(${settings.fontBrightness}%) !important; + } + body :where(p, span, div, li, blockquote, h1, h2, h3, h4, h5, h6, + em, i, strong, b, code, pre, td, th, caption, figcaption, + dt, dd, small, sub, sup, cite, q, mark) { + color: ${colors.foreground} !important; + } + p, li, blockquote { margin-block: 0.75em !important; } + a { color: ${colors.link} !important; } + `; +} + +export function readerRendererAttributes(settings: ReaderSettings) { + const scrolled = settings.flow === "scrolled"; + const maxInlinePx = Math.round(settings.maxWidth * 10); + return { + flow: scrolled ? "scrolled" : null, + gap: "7%", + margin: `${settings.margin}px`, + maxInlineSize: scrolled ? "9999px" : `${maxInlinePx}px`, + maxColumnCount: scrolled ? "1" : settings.spread === "none" ? "1" : "2", + }; +} + +function searchResultLabel(result: FoliateSearchResult, item?: { label?: string }): string { + return item?.label || result.label || result.section?.label || ""; +} + +function flattenSearchResult(result: FoliateSearchResult): ReaderSearchResult[] { + const direct = result.cfi + ? [ + { + cfi: result.cfi, + label: searchResultLabel(result), + excerpt: result.excerpt, + }, + ] + : []; + const subitems = result.subitems ?? []; + return direct.concat( + subitems + .filter((item) => typeof item.cfi === "string" && item.cfi.trim() !== "") + .map((item) => ({ + cfi: item.cfi || "", + label: searchResultLabel(result, item), + excerpt: item.excerpt, + })), + ); +} + +type FoliateBookReaderProps = { + contentID: string; + file: FileVersion; + title: string; + annotations?: EbookReaderAnnotation[]; + settings?: Partial; + onFileLoaded?: (state: ReaderLoadState | null) => void; + onProgressChange?: (progress: number | null) => void; + onReady?: (state: ReaderReadyState) => void; + onSelectionChange?: (selection: ReaderSelection | null) => void; +}; + +const FoliateBookReader = forwardRef( + function FoliateBookReader( + { + contentID, + file, + title, + annotations = [], + settings, + onFileLoaded, + onProgressChange, + onReady, + onSelectionChange, + }, + ref, + ) { + const queryClient = useQueryClient(); + const containerRef = useRef(null); + const viewRef = useRef(null); + const initializedRef = useRef(false); + const saveTimerRef = useRef(null); + const pendingProgressRef = useRef(null); + const progressSaveSeqRef = useRef(0); + const settingsRef = useRef(normalizeReaderSettings(settings)); + const appliedRendererKeyRef = useRef(""); + const annotationsRef = useRef(annotations); + const drawnCfisRef = useRef>(new Set()); + const selectionCleanupRef = useRef<(() => void)[]>([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); + + const applyReaderSettings = useCallback((nextSettings: Partial | undefined) => { + const normalized = normalizeReaderSettings(nextSettings); + settingsRef.current = normalized; + const renderer = viewRef.current?.renderer; + if (!renderer) return; + const styles = readerStyles(normalized); + const attributes = readerRendererAttributes(normalized); + // Settings such as the reading ruler never reach the renderer; re-styling and + // re-rendering the book for those (or for any no-op update) causes visible jank. + const rendererKey = JSON.stringify([styles, attributes]); + if (rendererKey === appliedRendererKeyRef.current) return; + appliedRendererKeyRef.current = rendererKey; + renderer.setStyles?.(styles); + renderer.setAttribute("gap", attributes.gap); + renderer.setAttribute("margin", attributes.margin); + renderer.setAttribute("max-inline-size", attributes.maxInlineSize); + renderer.setAttribute("max-column-count", attributes.maxColumnCount); + if (attributes.flow) { + renderer.setAttribute("flow", attributes.flow); + } else { + renderer.removeAttribute("flow"); + } + void renderer.render?.(); + }, []); + + const drawAnnotations = useCallback(() => { + const view = viewRef.current; + if (!view?.addAnnotation) return; + const activeCfis = new Set( + annotationsRef.current + .filter((annotation) => annotation.kind !== "bookmark" && annotation.cfi_range) + .map((annotation) => annotation.cfi_range || ""), + ); + for (const cfi of drawnCfisRef.current) { + if (!activeCfis.has(cfi)) { + view.addAnnotation({ value: cfi }, true); + drawnCfisRef.current.delete(cfi); + } + } + for (const annotation of annotationsRef.current) { + if (annotation.kind === "bookmark" || !annotation.cfi_range) continue; + if (drawnCfisRef.current.has(annotation.cfi_range)) continue; + view.addAnnotation({ + value: annotation.cfi_range, + color: annotation.color || "#facc15", + style: annotation.style || "highlight", + note: annotation.note || undefined, + }); + drawnCfisRef.current.add(annotation.cfi_range); + } + }, []); + + const createSelectionAnnotation = useCallback((): ReaderSelection | null => { + const view = viewRef.current; + const contents = view?.renderer?.getContents?.() ?? []; + if (!view?.getCFI) return null; + for (const content of contents) { + const selection = content.doc.getSelection(); + if (!selection || selection.isCollapsed || selection.rangeCount === 0) continue; + const selectedText = selection.toString().trim(); + if (!selectedText) continue; + const range = selection.getRangeAt(0); + const cfi = view.getCFI(content.index ?? 0, range); + const rangeRect = range.getBoundingClientRect(); + const frameRect = content.doc.defaultView?.frameElement?.getBoundingClientRect(); + return { + cfi, + selectedText, + rect: { + height: rangeRect.height, + left: rangeRect.left + (frameRect?.left ?? 0), + top: rangeRect.top + (frameRect?.top ?? 0), + width: rangeRect.width, + }, + }; + } + return null; + }, []); + + const emitSelectionChange = useCallback(() => { + onSelectionChange?.(createSelectionAnnotation()); + }, [createSelectionAnnotation, onSelectionChange]); + + const attachSelectionListeners = useCallback(() => { + for (const cleanup of selectionCleanupRef.current) cleanup(); + selectionCleanupRef.current = []; + const contents = viewRef.current?.renderer?.getContents?.() ?? []; + for (const content of contents) { + const doc = content.doc; + const handler = () => window.setTimeout(emitSelectionChange, 0); + doc.addEventListener("selectionchange", handler); + doc.addEventListener("pointerup", handler); + doc.addEventListener("keyup", handler); + selectionCleanupRef.current.push(() => { + doc.removeEventListener("selectionchange", handler); + doc.removeEventListener("pointerup", handler); + doc.removeEventListener("keyup", handler); + }); + } + }, [emitSelectionChange]); + + const getReadableText = useCallback(() => { + const contents = viewRef.current?.renderer?.getContents?.() ?? []; + for (const content of contents) { + const selectedText = content.doc.getSelection()?.toString().trim(); + if (selectedText) return selectedText; + } + const primaryIndex = viewRef.current?.renderer?.primaryIndex; + const primary = contents.find((content) => content.index === primaryIndex) ?? contents[0]; + return (primary?.doc.body?.innerText ?? "").replace(/\s+/g, " ").trim().slice(0, 5000); + }, []); + + useImperativeHandle( + ref, + () => ({ + next: () => viewRef.current?.next?.(), + prev: () => viewRef.current?.prev?.(), + goTo: (href: string) => viewRef.current?.goTo?.(href), + goToFraction: async (fraction: number) => { + await viewRef.current?.goToFraction(Math.min(1, Math.max(0, fraction))); + }, + search: async (query: string) => { + const trimmed = query.trim(); + const view = viewRef.current; + if (!trimmed || !view?.search) return []; + const results: ReaderSearchResult[] = []; + for await (const result of view.search({ query: trimmed, scope: "book" })) { + results.push(...flattenSearchResult(result)); + } + return results; + }, + clearSearch: () => viewRef.current?.clearSearch?.(), + clearSelection: () => { + viewRef.current?.deselect?.(); + onSelectionChange?.(null); + }, + createSelectionAnnotation, + getReadableText, + }), + [createSelectionAnnotation, getReadableText, onSelectionChange], + ); + + useEffect(() => { + applyReaderSettings(settings); + }, [applyReaderSettings, settings]); + + useEffect(() => { + annotationsRef.current = annotations; + drawAnnotations(); + }, [annotations, drawAnnotations]); + + useEffect(() => { + let cancelled = false; + let objectUrl: string | null = null; + let openedBook: DisposableBookDoc | null = null; + let openedView: FoliateViewElement | null = null; + setLoading(true); + setError(""); + onFileLoaded?.(null); + onProgressChange?.(null); + + // Releases everything this effect run created. It runs from the effect + // cleanup and again from late continuations of a superseded open(); it is + // idempotent and never touches resources owned by a newer run. + const disposeOpenArtifacts = () => { + if (openedView) { + openedView.close?.(); + openedView.remove(); + if (viewRef.current === openedView) { + viewRef.current = null; + } + openedView = null; + } + if (openedBook) { + openedBook.destroy?.(); + openedBook = null; + } + if (objectUrl) { + URL.revokeObjectURL(objectUrl); + objectUrl = null; + } + }; + + // Progress is deliberately per-content (one record per book): opening another + // format overwrites this position, keeping "your place in the book" shared + // across formats. + const flushProgress = (options?: { keepalive?: boolean }) => { + const pending = pendingProgressRef.current; + if (!pending) return; + pendingProgressRef.current = null; + const seq = ++progressSaveSeqRef.current; + if (options?.keepalive) { + // The page may be unloading; fire a keepalive PUT so the write survives + // teardown. The response cannot be observed, so skip cache updates. + apiKeepalive(ebookProgressPath(contentID), { + method: "PUT", + body: JSON.stringify(pending), + }); + return; + } + saveEbookReaderProgress(contentID, pending).then( + (saved) => { + // Saves can resolve out of order; only the newest may cache its response. + if (seq === progressSaveSeqRef.current) { + cacheEbookReaderProgress(queryClient, contentID, saved); + } + }, + () => { + // Progress saves are best-effort; the next relocate retries. + }, + ); + }; + + const scheduleProgressSave = (progress: EbookReaderProgressPayload) => { + pendingProgressRef.current = progress; + if (saveTimerRef.current !== null) { + window.clearTimeout(saveTimerRef.current); + } + saveTimerRef.current = window.setTimeout(() => { + saveTimerRef.current = null; + flushProgress(); + }, 800); + }; + + const flushProgressOnVisibilityChange = () => { + if (document.visibilityState === "hidden") { + // The page is still alive when it merely hides, so use the normal + // authenticated path, which can refresh an expired access token. + // Keepalive (no refresh possible) is reserved for pagehide. + flushProgress(); + } + }; + const flushProgressOnPageHide = () => flushProgress({ keepalive: true }); + + async function open() { + try { + const format = readerFileFormat(file); + const [blob, savedProgress] = await Promise.all([ + apiBlob(ebookReadPath(contentID, file.file_id)), + fetchEbookReaderProgress(contentID), + ]); + if (cancelled) return; + + objectUrl = URL.createObjectURL(blob); + const filename = file.file_name || `${title}.${format || "ebook"}`; + onFileLoaded?.({ objectUrl, filename }); + const documentFile = new File([blob], filename, { + type: blob.type || readerMimeType(format), + }); + const { book } = await new DocumentLoader(documentFile).open(); + openedBook = book as DisposableBookDoc; + if (cancelled) { + disposeOpenArtifacts(); + return; + } + + await import("foliate-js/view.js"); + if (cancelled) { + disposeOpenArtifacts(); + return; + } + const view = document.createElement("foliate-view") as FoliateViewElement; + openedView = view; + viewRef.current = view; + containerRef.current?.replaceChildren(view); + view.addEventListener("draw-annotation", async (event: Event) => { + const { Overlayer } = await import("foliate-js/overlayer.js"); + const detail = ( + event as CustomEvent<{ + annotation: { color?: string; style?: string }; + draw: (fn: unknown, options?: Record) => void; + }> + ).detail; + const style = detail.annotation.style || "highlight"; + const color = detail.annotation.color || "#facc15"; + const draw = + style === "underline" + ? Overlayer.underline + : style === "squiggly" + ? Overlayer.squiggly + : Overlayer.highlight; + detail.draw(draw, { color }); + }); + view.addEventListener("external-link", (event: Event) => { + // The vendored foliate view would open the link itself via + // globalThis.open(href, "_blank") with no noopener and no scheme + // filter (reverse tabnabbing, javascript: URLs). Cancel its default + // and open only safe schemes without an opener reference. + event.preventDefault(); + const href = (event as CustomEvent<{ href?: unknown }>).detail?.href; + if (typeof href !== "string") return; + let scheme = ""; + try { + scheme = new URL(href).protocol; + } catch { + return; + } + if (scheme === "http:" || scheme === "https:") { + window.open(href, "_blank", "noopener,noreferrer"); + } + }); + view.addEventListener("create-overlay", () => { + attachSelectionListeners(); + drawAnnotations(); + }); + view.addEventListener("relocate", (event: Event) => { + // Only the run that owns the live view may save progress for its file; + // a superseded view firing late relocates must not overwrite it. + if (!initializedRef.current || viewRef.current !== view) return; + const progress = progressFromRelocate( + (event as CustomEvent).detail, + file.file_id, + ); + if (progress) { + onProgressChange?.(progress.progress); + scheduleProgressSave(progress); + } + }); + await view.open(book); + if (cancelled) { + disposeOpenArtifacts(); + return; + } + onReady?.({ toc: book.toc ?? [] }); + applyReaderSettings(settingsRef.current); + attachSelectionListeners(); + drawAnnotations(); + const savedFileProgress = savedProgress?.file_id === file.file_id ? savedProgress : null; + const restoreTarget = restoreProgressTarget(savedFileProgress); + if (savedFileProgress && restoreTarget?.type === "location") { + onProgressChange?.(savedFileProgress.progress); + await view.init({ lastLocation: restoreTarget.location }); + } else if (savedFileProgress && restoreTarget?.type === "fraction") { + onProgressChange?.(savedFileProgress.progress); + await view.goToFraction(restoreTarget.fraction); + } else { + await view.goToFraction(0); + } + if (cancelled) { + disposeOpenArtifacts(); + return; + } + initializedRef.current = true; + setLoading(false); + } catch (err) { + if (cancelled) { + disposeOpenArtifacts(); + return; + } + setError(err instanceof Error ? err.message : "Unable to open ebook"); + setLoading(false); + } + } + + void open(); + const drawnCfis = drawnCfisRef.current; + document.addEventListener("visibilitychange", flushProgressOnVisibilityChange); + window.addEventListener("pagehide", flushProgressOnPageHide); + return () => { + cancelled = true; + initializedRef.current = false; + document.removeEventListener("visibilitychange", flushProgressOnVisibilityChange); + window.removeEventListener("pagehide", flushProgressOnPageHide); + if (saveTimerRef.current !== null) { + window.clearTimeout(saveTimerRef.current); + saveTimerRef.current = null; + } + flushProgress(); + disposeOpenArtifacts(); + appliedRendererKeyRef.current = ""; + for (const cleanup of selectionCleanupRef.current) cleanup(); + selectionCleanupRef.current = []; + drawnCfis.clear(); + onFileLoaded?.(null); + onProgressChange?.(null); + }; + }, [ + applyReaderSettings, + attachSelectionListeners, + contentID, + drawAnnotations, + file, + onFileLoaded, + onProgressChange, + onReady, + queryClient, + title, + ]); + + return ( +
    +
    + {loading && !error && ( +
    + Loading reader... +
    + )} + {error && ( +
    + {error} +
    + )} +
    + ); + }, +); + +export default FoliateBookReader; diff --git a/web/src/reader/ebookReaderApi.ts b/web/src/reader/ebookReaderApi.ts new file mode 100644 index 00000000..a3e3932c --- /dev/null +++ b/web/src/reader/ebookReaderApi.ts @@ -0,0 +1,114 @@ +import { api, apiKeepalive } from "@/api/client"; + +export type EbookReaderConfigEnvelope = { + content_id?: string; + config?: Record; + updated_at?: string; +}; + +export type EbookReaderAnnotation = { + id: string; + content_id: string; + kind: "highlight" | "note" | "bookmark"; + cfi_range?: string; + location?: string; + selected_text: string; + note: string; + style: string; + color: string; + metadata?: Record; + created_at?: string; + updated_at?: string; +}; + +export type EbookReaderAnnotationInput = Partial< + Pick< + EbookReaderAnnotation, + "kind" | "cfi_range" | "location" | "selected_text" | "note" | "style" | "color" | "metadata" + > +>; + +export function ebookReaderConfigPath(contentID: string): string { + return `/ebooks/${encodeURIComponent(contentID)}/reader-config`; +} + +export function ebookReaderAnnotationsPath(contentID: string): string { + return `/ebooks/${encodeURIComponent(contentID)}/annotations`; +} + +export function ebookReaderAnnotationPath(contentID: string, annotationID: string): string { + return `${ebookReaderAnnotationsPath(contentID)}/${encodeURIComponent(annotationID)}`; +} + +export async function fetchEbookReaderConfig(contentID: string): Promise> { + const envelope = await api(ebookReaderConfigPath(contentID)); + return envelope.config && typeof envelope.config === "object" && !Array.isArray(envelope.config) + ? envelope.config + : {}; +} + +export async function saveEbookReaderConfig( + contentID: string, + config: Record, +): Promise> { + const envelope = await api(ebookReaderConfigPath(contentID), { + method: "PUT", + body: JSON.stringify({ config }), + }); + return envelope.config && typeof envelope.config === "object" && !Array.isArray(envelope.config) + ? envelope.config + : {}; +} + +/** + * Fire-and-forget config save for page unload (pagehide), when a normal + * authenticated request can no longer complete or refresh tokens. + */ +export function saveEbookReaderConfigKeepalive( + contentID: string, + config: Record, +): void { + apiKeepalive(ebookReaderConfigPath(contentID), { + method: "PUT", + body: JSON.stringify({ config }), + }); +} + +export async function fetchEbookReaderAnnotations( + contentID: string, +): Promise { + const envelope = await api<{ items?: EbookReaderAnnotation[] }>( + ebookReaderAnnotationsPath(contentID), + ); + return Array.isArray(envelope.items) ? envelope.items : []; +} + +export async function createEbookReaderAnnotation( + contentID: string, + annotation: EbookReaderAnnotationInput, +): Promise { + return api(ebookReaderAnnotationsPath(contentID), { + method: "POST", + body: JSON.stringify(annotation), + }); +} + +export async function updateEbookReaderAnnotation( + contentID: string, + annotationID: string, + annotation: EbookReaderAnnotationInput, +): Promise { + return api(ebookReaderAnnotationPath(contentID, annotationID), { + method: "PATCH", + body: JSON.stringify(annotation), + }); +} + +export async function deleteEbookReaderAnnotation( + contentID: string, + annotationID: string, +): Promise { + await api(ebookReaderAnnotationPath(contentID, annotationID), { + method: "DELETE", + }); +} diff --git a/web/src/reader/foliate-overlayer.d.ts b/web/src/reader/foliate-overlayer.d.ts new file mode 100644 index 00000000..3175f784 --- /dev/null +++ b/web/src/reader/foliate-overlayer.d.ts @@ -0,0 +1,7 @@ +declare module "foliate-js/overlayer.js" { + export const Overlayer: { + highlight: unknown; + squiggly: unknown; + underline: unknown; + }; +} diff --git a/web/src/reader/readest/libs/document.ts b/web/src/reader/readest/libs/document.ts new file mode 100644 index 00000000..9bd605f4 --- /dev/null +++ b/web/src/reader/readest/libs/document.ts @@ -0,0 +1,455 @@ +import * as epubcfi from "foliate-js/epubcfi.js"; + +export const CFI = epubcfi; + +export type BookFormat = + | "EPUB" + | "PDF" + | "MOBI" + | "AZW" + | "AZW3" + | "CBZ" + | "CBR" + | "FB2" + | "FBZ" + | "MD"; + +export type LanguageMap = Record; + +export type Identifier = { + scheme: string; + value: string; +}; + +export type Contributor = { + name: LanguageMap; +}; + +export type Collection = { + name: string; + position?: string; +}; + +export type Location = { + current: number; + next: number; + total: number; +}; + +export interface TOCItem { + id: number; + label: string; + href: string; + index: number; + cfi?: string; + location?: Location; + subitems?: TOCItem[]; +} + +export interface SectionFragment { + id: string; + href: string; + cfi: string; + size: number; + linear: string; + location?: Location; + fragments?: Array; +} + +export interface SectionItem { + id: string; + cfi: string; + size: number; + linear: string; + href?: string; + location?: Location; + pageSpread?: "left" | "right" | "center" | ""; + fragments?: Array; + loadText?: () => Promise; + createDocument: () => Promise; +} + +export type BookMetadata = { + title: string | LanguageMap; + author: string | Contributor; + language: string | string[]; + editor?: string; + publisher?: string; + published?: string; + description?: string; + subject?: string | string[] | Contributor; + identifier?: string; + isbn?: string; + altIdentifier?: string | string[] | Identifier; + belongsTo?: { + collection?: Array | Collection; + series?: Array | Collection; + }; + subtitle?: string; + series?: string; + seriesIndex?: number; + seriesTotal?: number; + coverImageFile?: string; + coverImageUrl?: string; + coverImageBlobUrl?: string; +}; + +export interface BookDoc { + metadata: BookMetadata; + rendition: { + layout?: "pre-paginated" | "reflowable"; + spread?: "auto" | "none"; + viewport?: { width: number; height: number }; + }; + dir: string; + toc?: Array; + sections: Array; + transformTarget?: EventTarget; + splitTOCHref(href: string): Array; + getCover(): Promise; +} + +export const EXTS: Record = { + EPUB: "epub", + PDF: "pdf", + MOBI: "mobi", + AZW: "azw", + AZW3: "azw3", + CBZ: "cbz", + CBR: "cbr", + FB2: "fb2", + FBZ: "fbz", + MD: "md", +}; + +export const MIMETYPES: Record = { + EPUB: ["application/epub+zip"], + PDF: ["application/pdf"], + MOBI: ["application/x-mobipocket-ebook"], + AZW: ["application/vnd.amazon.ebook"], + AZW3: ["application/vnd.amazon.mobi8-ebook", "application/x-mobi8-ebook"], + CBZ: ["application/vnd.comicbook+zip", "application/zip", "application/x-cbz"], + CBR: [ + "application/vnd.comicbook-rar", + "application/x-cbr", + "application/vnd.rar", + "application/x-rar-compressed", + ], + FB2: ["application/x-fictionbook+xml", "text/xml", "application/xml"], + FBZ: ["application/x-zip-compressed-fb2", "application/zip"], + MD: ["text/markdown", "text/x-markdown"], +}; + +export class DocumentLoader { + private file: File; + + constructor(file: File) { + this.file = file; + } + + private async isZip(): Promise { + const arr = new Uint8Array(await this.file.slice(0, 4).arrayBuffer()); + return arr[0] === 0x50 && arr[1] === 0x4b && arr[2] === 0x03; + } + + private async isPDF(): Promise { + const arr = new Uint8Array(await this.file.slice(0, 5).arrayBuffer()); + return ( + arr[0] === 0x25 && arr[1] === 0x50 && arr[2] === 0x44 && arr[3] === 0x46 && arr[4] === 0x2d + ); + } + + private async isRar(): Promise { + const arr = new Uint8Array(await this.file.slice(0, 8).arrayBuffer()); + return ( + arr[0] === 0x52 && + arr[1] === 0x61 && + arr[2] === 0x72 && + arr[3] === 0x21 && + arr[4] === 0x1a && + arr[5] === 0x07 && + (arr[6] === 0x00 || (arr[6] === 0x01 && arr[7] === 0x00)) + ); + } + + private async makeZipLoader() { + const { configure, ZipReader, BlobReader, TextWriter, BlobWriter } = + await import("@zip.js/zip.js"); + configure({ useWebWorkers: false, useCompressionStream: false }); + + type Entry = import("@zip.js/zip.js").Entry; + const reader = new ZipReader(new BlobReader(this.file)); + const entries = await reader.getEntries(); + const map = new Map(entries.map((entry) => [entry.filename, entry])); + const lowercaseMap = new Map(); + for (const entry of entries) { + const lowercaseName = entry.filename.toLowerCase(); + const existing = lowercaseMap.get(lowercaseName); + lowercaseMap.set( + lowercaseName, + existing && existing.filename !== entry.filename ? null : entry, + ); + } + const getEntry = (name: string) => + map.get(name) ?? lowercaseMap.get(name.toLowerCase()) ?? null; + const load = + (f: (entry: Entry, type?: string) => Promise | null) => + (name: string, ...args: [string?]) => { + const entry = getEntry(name); + return entry ? f(entry, ...args) : null; + }; + + const loadText = load((entry: Entry) => + !entry.directory ? entry.getData(new TextWriter()) : null, + ); + const loadBlob = load((entry: Entry, type?: string) => + !entry.directory ? entry.getData(new BlobWriter(type ?? "")) : null, + ); + const getSize = (name: string) => getEntry(name)?.uncompressedSize ?? 0; + const getComment = async (): Promise => null; + + return { + entries, + loadText, + loadBlob, + getSize, + getComment, + sha1: undefined, + }; + } + + private async makeRarLoader() { + const [{ createExtractorFromData }, wasmUrl] = await Promise.all([ + import("node-unrar-js/esm/index.esm"), + import("node-unrar-js/esm/js/unrar.wasm?url").then((module) => module.default), + ]); + const [data, wasmBinary] = await Promise.all([ + this.file.arrayBuffer(), + fetch(wasmUrl).then((response) => response.arrayBuffer()), + ]); + const extractor = await createExtractorFromData({ data, wasmBinary }); + const headers = [...extractor.getFileList().fileHeaders]; + const extracted = new Map(); + for (const file of extractor.extract().files) { + if (!file.fileHeader.flags.directory && file.extraction) { + extracted.set(file.fileHeader.name, file.extraction); + } + } + + const entries = headers.map((header) => ({ + directory: header.flags.directory, + filename: header.name, + uncompressedSize: header.unpSize, + })); + const lowercaseMap = new Map(); + for (const entry of entries) { + const lowercaseName = entry.filename.toLowerCase(); + const existing = lowercaseMap.get(lowercaseName); + lowercaseMap.set( + lowercaseName, + existing && existing !== entry.filename ? null : entry.filename, + ); + } + const resolveName = (name: string) => + extracted.has(name) ? name : lowercaseMap.get(name.toLowerCase()) || name; + const loadBlob = (name: string, type?: string) => { + const data = extracted.get(resolveName(name)); + return data ? new Blob([new Uint8Array(data)], { type: type ?? "" }) : null; + }; + const loadText = async (name: string) => { + const blob = loadBlob(name); + return blob ? blob.text() : null; + }; + const getSize = (name: string) => { + const resolved = resolveName(name); + return entries.find((entry) => entry.filename === resolved)?.uncompressedSize ?? 0; + }; + + return { + entries, + loadText, + loadBlob, + getSize, + getComment: async (): Promise => null, + sha1: undefined, + }; + } + + private isCBZ(): boolean { + return ( + this.file.type === "application/vnd.comicbook+zip" || + this.file.name.toLowerCase().endsWith(`.${EXTS.CBZ}`) + ); + } + + private isCBR(): boolean { + const name = this.file.name.toLowerCase(); + return ( + this.file.type === "application/vnd.comicbook-rar" || + this.file.type === "application/x-cbr" || + this.file.type === "application/vnd.rar" || + this.file.type === "application/x-rar-compressed" || + name.endsWith(`.${EXTS.CBR}`) || + name.endsWith(".rar") + ); + } + + private isFB2(): boolean { + return ( + this.file.type === "application/x-fictionbook+xml" || + this.file.name.toLowerCase().endsWith(`.${EXTS.FB2}`) + ); + } + + private isFBZ(): boolean { + const name = this.file.name.toLowerCase(); + return ( + this.file.type === "application/x-zip-compressed-fb2" || + name.endsWith(".fb.zip") || + name.endsWith(".fb2.zip") || + name.endsWith(`.${EXTS.FBZ}`) + ); + } + + private isPlainText(): boolean { + const name = this.file.name.toLowerCase(); + return ( + this.file.type === "text/markdown" || + this.file.type === "text/x-markdown" || + name.endsWith(`.${EXTS.MD}`) + ); + } + + private async makeTextBook(): Promise { + const text = await this.file.text(); + const title = this.file.name.replace(/\.[^.]+$/, "") || "Document"; + const createDocument = async () => { + const doc = document.implementation.createHTMLDocument(title); + const pre = doc.createElement("pre"); + pre.textContent = text; + pre.style.whiteSpace = "pre-wrap"; + pre.style.fontFamily = "inherit"; + pre.style.lineHeight = "inherit"; + doc.body.appendChild(pre); + return doc; + }; + return { + metadata: { + title, + author: "", + language: "", + }, + rendition: { + layout: "reflowable", + spread: "none", + }, + dir: "", + toc: [{ id: 0, label: title, href: "text", index: 0 }], + sections: [ + { + id: "text", + href: "text", + cfi: "", + size: text.length, + linear: "yes", + createDocument, + loadText: async () => text, + }, + ], + splitTOCHref: () => ["text"], + getCover: async () => null, + }; + } + + public async open(): Promise<{ book: BookDoc; format: BookFormat }> { + let book: BookDoc | null = null; + let format: BookFormat = "EPUB"; + if (!this.file.size) { + throw new Error("File is empty"); + } + try { + if (await this.isZip()) { + const loader = await this.makeZipLoader(); + const { entries } = loader; + + if (this.isCBZ()) { + const { makeComicBook } = await import("foliate-js/comic-book.js"); + book = (await makeComicBook(loader, this.file)) as BookDoc; + format = "CBZ"; + } else if (this.isFBZ()) { + const entry = entries.find((item) => + item.filename.toLowerCase().endsWith(`.${EXTS.FB2}`), + ); + const blob = await loader.loadBlob((entry ?? entries[0]!).filename); + const { makeFB2 } = await import("foliate-js/fb2.js"); + book = (await makeFB2(blob)) as BookDoc; + format = "FBZ"; + } else { + const { EPUB } = await import("foliate-js/epub.js"); + book = (await new EPUB(loader).init()) as BookDoc; + format = "EPUB"; + } + } else if ((await this.isRar()) || this.isCBR()) { + const loader = await this.makeRarLoader(); + const { makeComicBook } = await import("foliate-js/comic-book.js"); + book = (await makeComicBook(loader, this.file)) as BookDoc; + format = "CBR"; + } else if (await this.isPDF()) { + const { makePDF } = await import("foliate-js/pdf.js"); + book = (await makePDF(this.file)) as BookDoc; + format = "PDF"; + } else if (await (await import("foliate-js/mobi.js")).isMOBI(this.file)) { + const fflate = await import("foliate-js/vendor/fflate.js"); + const { MOBI } = await import("foliate-js/mobi.js"); + book = (await new MOBI({ unzlib: fflate.unzlibSync }).open(this.file)) as BookDoc; + const ext = this.file.name.split(".").pop()?.toLowerCase(); + switch (ext) { + case "azw": + format = "AZW"; + break; + case "azw3": + format = "AZW3"; + break; + default: + format = "MOBI"; + } + } else if (this.isFB2()) { + const { makeFB2 } = await import("foliate-js/fb2.js"); + book = (await makeFB2(this.file)) as BookDoc; + format = "FB2"; + } else if (this.isPlainText()) { + format = "MD"; + book = await this.makeTextBook(); + } + } catch (e: unknown) { + console.error("Failed to open document:", e); + if (e instanceof Error && e.message?.includes("not a valid zip")) { + throw new Error("Unsupported or corrupted book file"); + } + throw e; + } + if (!book) { + throw new Error("Unsupported book format"); + } + return { book, format }; + } +} + +export const getDirection = (doc: Document) => { + const { defaultView } = doc; + const computedStyle = defaultView!.getComputedStyle(doc.body); + const { direction } = computedStyle; + let { writingMode } = computedStyle; + if (!writingMode || writingMode === "horizontal-tb") { + const firstChild = doc.body.querySelector(":scope > :not([cfi-inert])"); + if (firstChild) { + const childStyle = defaultView!.getComputedStyle(firstChild); + if (childStyle.writingMode === "vertical-rl" || childStyle.writingMode === "vertical-lr") { + writingMode = childStyle.writingMode; + } + } + } + const vertical = writingMode === "vertical-rl" || writingMode === "vertical-lr"; + const rtl = doc.body.dir === "rtl" || direction === "rtl" || doc.documentElement.dir === "rtl"; + return { vertical, rtl }; +}; diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts index 11f02fe2..cbf50ee8 100644 --- a/web/src/vite-env.d.ts +++ b/web/src/vite-env.d.ts @@ -1 +1,10 @@ /// + +declare module "foliate-js/view.js"; +declare module "foliate-js/epubcfi.js"; +declare module "foliate-js/comic-book.js"; +declare module "foliate-js/fb2.js"; +declare module "foliate-js/epub.js"; +declare module "foliate-js/pdf.js"; +declare module "foliate-js/mobi.js"; +declare module "foliate-js/vendor/fflate.js"; diff --git a/web/vendor/foliate-js/LICENSE b/web/vendor/foliate-js/LICENSE new file mode 100644 index 00000000..5930571b --- /dev/null +++ b/web/vendor/foliate-js/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 John Factotum + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/vendor/foliate-js/README.md b/web/vendor/foliate-js/README.md new file mode 100644 index 00000000..a3fe2d51 --- /dev/null +++ b/web/vendor/foliate-js/README.md @@ -0,0 +1,374 @@ +# foliate-js + +Library for rendering e-books in the browser. + +Features: +- Supports EPUB, MOBI, KF8 (AZW3), FB2, CBZ, PDF (experimental; requires PDF.js) +- Add support for other formats yourself by implementing the book interface +- Pure JavaScript +- Small and modular +- No hard dependencies +- Does not require loading whole file into memory +- Does not care about older browsers + +## Demo + +The repo includes a demo viewer that can be used to open local files. To use it, serve the files with a server, and navigate to `reader.html`. Or visit the [online demo](https://johnfactotum.github.io/foliate-js/reader.html) hosted on GitHub. Note that it is very incomplete at the moment, and lacks many basic features such as keyboard shortcuts. + +Also note that deobfuscating fonts with the IDPF algorithm requires a SHA-1 function. By default it uses Web Crypto, which is only available in secure contexts. Without HTTPS, you will need to modify `reader.js` and pass your own SHA-1 implementation. + +## Current Status + +It works reasonably well, and has been used in several stable releases of [Foliate](https://github.com/johnfactotum/foliate). This library itself is, however, *not* stable. Expect it to break and the API to change at any time. Use it at your own risk. + +If you do decide to use it, since there's no release yet, it is recommended that you include the library as a git submodule in your project so that you can easily update it. + +## Documentation + +### Overview + +This project uses native ES modules. There's no build step, and you can import them directly. + +There are mainly three kinds of modules: + +- Modules that parse and load books, implementing the "book" interface + - `comic-book.js`, for comic book archives (CBZ) + - `epub.js` and `epubcfi.js`, for EPUB + - `fb2.js`, for FictionBook 2 + - `mobi.js`, for both Mobipocket files and KF8 (commonly known as AZW3) files +- Modules that handle pagination, implementing the "renderer" interface + - `fixed-layout.js`, for fixed layout books + - `paginator.js`, for reflowable books +- Auxiliary modules used to add additional functionalities + - `overlayer.js`, for rendering annotations + - `progress.js`, for getting reading progress + - `search.js`, for searching + +The modules are designed to be modular. In general, they don't directly depend on each other. Instead they depend on certain interfaces, detailed below. The exception is `view.js`. It is the higher level renderer that strings most of the things together, and you can think of it as the main entry point of the library. See "Basic Usage" below. + +The repo also includes a still higher level reader, though strictly speaking, `reader.html` (along with `reader.js` and its associated files in `ui/`) is not considered part of the library itself. It's akin to [Epub.js Reader](https://github.com/futurepress/epubjs-reader). You are expected to modify it or replace it with your own code. + +### Basic Usage + +To get started, clone the repo and import `view.js`: + +```js +import './foliate-js/view.js' + +const view = document.createElement('foliate-view') +document.body.append(view) + +view.addEventListener('relocate', e => { + console.log('location changed') + console.log(e.detail) +}) + +// can open a File/Blob object or a URL +// or any object that implements the "book" interface +await view.open('example.epub') +await view.goTo(/* path, section index, or CFI */) +``` + +See the [online demo](https://johnfactotum.github.io/foliate-js/reader.html) for a more advanced example. + +### Security + +EPUB books can contain [scripted content](https://www.w3.org/TR/epub/#sec-scripted-content) (i.e. JavaScript in the e-book), which is potentially dangerous, and is not supported by this library because + +- It is currently impossible to do so securely due to the content being served from the same origin (using `blob:` URLs). +- Due to [WebKit Bug 218086](https://bugs.webkit.org/show_bug.cgi?id=218086), the `allow-scripts` attribute is required on iframes, which renders iframe sandbox useless. + +It is therefore imperative that you use [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to block all scripts except `'self'`. An EPUB file for testing can be found at https://github.com/johnfactotum/epub-test. + +> [!CAUTION] +> Do NOT use this library (or any other e-book library, for that matter) without CSP unless you completely trust the content you're rendering or can block scripts by other means. + +### The Main Interface for Books + +Processors for each book format return an object that implements the following interface: +- `.sections`: an array of sections in the book. Each item has the following properties: + - `.load()`: returns a string containing the URL that will be rendered. May be async. + - `.unload()`: returns nothing. If present, can be used to free the section. + - `.createDocument()`: returns a `Document` object of the section. Used for searching. May be async. + - `.size`: a number, the byte size of the section. Used for showing reading progress. + - `.linear`: a string. If it is `"no"`, the section is not part of the linear reading sequence (see the [`linear`](https://www.w3.org/publishing/epub32/epub-packages.html#attrdef-itemref-linear) attribute in EPUB). + - `.cfi`: base CFI string of the section. The part that goes before the `!` in CFIs. + - `.id`: an identifier for the section, used for getting TOC item (see below). Can be anything, as long as they can be used as keys in a `Map`. +- `.dir`: a string representing the page progression direction of the book (`"rtl"` or `"ltr"`). +- `.toc`: an array representing the table of contents of the book. Each item has + - `.label`: a string label for the item + - `.href`: a string representing the destination of the item. Does not have to be a valid URL. + - `.subitems`: a array that contains TOC items +- `.pageList`: same as the TOC, but for the [page list](https://www.w3.org/publishing/epub32/epub-packages.html#sec-nav-pagelist). +- `.metadata`: an object representing the metadata of the book. Currently, it follows more or less the metadata schema of [Readium's webpub manifest](https://github.com/readium/webpub-manifest). Note that titles and names can be a string or an object like `{ ja: "草枕", en: 'Kusamakura' }`, and authors, etc. can be a string, an object, or an array of strings or objects. +- `.rendition`: an object that contains properties that correspond to the [rendition properties](https://www.w3.org/publishing/epub32/epub-packages.html#sec-package-metadata-rendering) in EPUB. If `.layout` is `"pre-paginated"`, the book is rendered with the fixed layout renderer. +- `.resolveHref(href)`: given an href string, returns an object representing the destination referenced by the href, which has the following properties: + - `.index`: the index of the referenced section in the `.section` array + - `.anchor(doc)`: given a `Document` object, returns the document fragment referred to by the href (can either be an `Element` or a `Range`), or `null` +- `.resolveCFI(cfi)`: same as above, but with a CFI string instead of href +- `.isExternal(href)`: returns a boolean. If `true`, the link should be opened externally. + +The following methods are consumed by `progress.js`, for getting the correct TOC and page list item when navigating: +- `.splitTOCHref(href)`: given an href string (from the TOC), returns an array, the first element of which is the `id` of the section (see above), and the second element is the fragment identifier (can be any type; see below). May be async. +- `.getTOCFragment(doc, id)`: given a `Document` object and a fragment identifier (the one provided by `.splitTOCHref()`; see above), returns a `Node` representing the target linked by the TOC item + +In addition, the `.transformTarget`, if present, can be used to transform the contents of the book as it loads. It is an `EventTarget` with a custom event `"data"`, whose `.detail` is `{ data, type, name }`, where `.data` is either a string or `Blob`, or a `Promise` thereof, `.type` the content type string, and `.name` the identifier of the resource. Event handlers should mutate `.data` to transform the data. + +Almost all of the properties and methods are optional. At minimum it needs `.sections` and the `.load()` method for the sections, as otherwise there won't be anything to render. + +### Archived Files + +Reading Zip-based formats requires adapting an external library. Both `epub.js` and `comic-book.js` expect a `loader` object that implements the following interface: + +- `.entries`: (only used by `comic-book.js`) an array, each element of which has a `filename` property, which is a string containing the filename (the full path). +- `.loadText(filename)`: given the path, returns the contents of the file as string. May be async. +- `.loadBlob(filename)`: given the path, returns the file as a `Blob` object. May be async. +- `.getSize(filename)`: returns the file size in bytes. Used to set the `.size` property for `.sections` (see above). + +In `view.js`, this is implemented using [zip.js](https://github.com/gildas-lormeau/zip.js), which is highly recommended because it seems to be the only library that supports random access for `File` objects (as well as HTTP range requests). + +One advantage of having such an interface is that one can easily use it for reading unarchived files as well. For example, `view.js` has a loader that allows you to open unpacked EPUBs as directories. + +### Mobipocket and Kindle Files + +It can read both MOBI and KF8 (.azw3, and combo .mobi files) from a `File` (or `Blob`) object. For MOBI files, it decompresses all text at once and splits the raw markup into sections at every ``, instead of outputting one long page for the whole book, which drastically improves rendering performance. For KF8 files, it tries to decompress as little text as possible when loading a section, but it can still be quite slow due to the slowness of the current HUFF/CDIC decompressor implementation. In all cases, images and other resources are not loaded until they are needed. + +Note that KF8 files can contain fonts that are zlib-compressed. They need to be decompressed with an external library. `view.js` uses [fflate](https://github.com/101arrowz/fflate) to decompress them. + +### PDF and Other Fixed-Layout Formats + +There is a proof-of-concept, highly experimental adapter for [PDF.js](https://mozilla.github.io/pdf.js/), with which you can show PDFs using the same fixed-layout renderer for EPUBs. + +CBZs are similarly handled like fixed-layout EPUBs. + +### The Renderers + +To simplify things, it has two separate renderers, one for reflowable books, and one for fixed layout books (as such there's no support for mixed layout books). These renderers are custom elements (web components). + +A renderer's interface is currently mainly: +- `.open(book)`: open a book object. +- `.goTo({ index, anchor })`: navigate to a destination. The argument has the same type as the one returned by `.resolveHref()` in the book object. +- `.prev()`: go to previous page. +- `.next()`: go to next page. + +It has the following custom events: +- `load`, when a section is loaded. Its `event.detail` has two properties, `doc`, the `Document` object, and `index`, the index of the section. +- `relocate`, when the location changes. Its `event.detail` has the properties `range`, `index`, and `fraction`, where `range` is a `Range` object containing the current visible area, and `fraction` is a number between 0 and 1, representing the reading progress within the section. +- `create-overlayer`, which allows adding an overlay to the page. The `event.detail` has the properties `doc`, `index`, and a function `attach(overlay)`, which should be called with an overlayer object (see the description for `overlayer.js` below). + +Both renderers have the [`part`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/part) named `filter`, which you can apply CSS filters to, to e.g. invert colors or adjust brightness: + +```css +foliate-view::part(filter) { + filter: invert(1) hue-rotate(180deg); +} +``` + +The filter only applies to the book itself, leaving overlaid elements such as highlights unaffected. + +### The Paginator + +The paginator uses the same pagination strategy as [Epub.js](https://github.com/futurepress/epub.js): it uses CSS multi-column. As such it shares much of the same limitations (it's slow, some CSS styles do not work as expected, and other bugs). There are a few differences: +- It is a totally standalone module. You can use it to paginate any content. +- It is much simpler, but currently there's no support for continuous scrolling. +- It has no concept of CFIs and operates on `Range` objects directly. +- It uses bisecting to find the current visible range, which is more accurate than what Epub.js does. +- It has an internal `#anchor` property, which can be a `Range`, `Element`, or a fraction that represents the current location. The view is *anchored* to it no matter how you resize the window. +- It supports more than two columns. +- It supports switching between scrolled and paginated mode without reloading (I can't figure out how to do this in Epub.js). + +The layout can be configured by setting the following attributes: +- `animated`: a [boolean attribute](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML). If present, adds a sliding transition effect. +- `flow`: either `paginated` or `scrolled`. +- `margin`: a CSS ``. The unit must be `px`. The height of the header and footer. +- `gap`: a CSS ``. The size of the space between columns, relative to page size. +- `max-inline-size`: a CSS ``. The unit must be `px`. The maximum inline size of the text (column width in paginated mode). +- `max-block-size`: same as above, but for the size in the block direction. +- `max-column-count`: integer. The maximum number of columns. Has no effect in scrolled mode, or when the orientation of the renderer element is `portrait` (or, for vertical writing, `landscape`). + +(Note: there's no JS property API. You must use `.setAttribute()`.) + +It has built-in header and footer regions accessible via the `.heads` and `.feet` properties of the paginator instance. These can be used to display running heads and reading progress. They are only available in paginated mode, and there will be one element for each column. They are styleable with `::part(head)` and `::part(foot)`. E.g., to add a border under the running heads, + +```css +foliate-view::part(head) { + padding-bottom: 4px; + border-bottom: 1px solid graytext; +} +``` + +### EPUB CFI + +Parsed CFIs are represented as a plain array or object. The basic type is called a "part", which is an object with the following structure: `{ index, id, offset, temporal, spatial, text, side }`, corresponding to a step + offset in the CFI. + +A collapsed, non-range CFI is represented as an array whose elements are arrays of parts, each corresponding to a full path. That is, `/6/4!/4` is turned into + +```json +[ + [ + { "index": 6 }, + { "index": 4 } + ], + [ + { "index": 4 } + ] +] +``` + +A range CFI is an object `{ parent, start, end }`, each property being the same type as a collapsed CFI. For example, `/6/4!/2,/2,/4` is represented as + +```json +{ + "parent": [ + [ + { "index": 6 }, + { "index": 4 } + ], + [ + { "index": 2 } + ] + ], + "start": [ + [ + { "index": 2 } + ] + ], + "end": [ + [ + { "index": 4 } + ] + ] +} +``` + +The parser uses a state machine rather than regex, and should handle assertions that contain escaped characters correctly (see tests for examples of this). + +It has the ability ignore nodes, which is needed if you want to inject your own nodes into the document without affecting CFIs. To do this, you need to pass the optional filter function that works similarly to the filter function of [`TreeWalker`s](https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker): + +```js +const filter = node => node.nodeType !== 1 ? NodeFilter.FILTER_ACCEPT + : node.matches('.reject') ? NodeFilter.FILTER_REJECT + : node.matches('.skip') ? NodeFilter.FILTER_SKIP + : NodeFilter.FILTER_ACCEPT + +CFI.toRange(doc, 'epubcfi(...)', filter) +CFI.fromRange(range, filter) +``` + +It can parse and stringify spatial and temporal offsets, as well as text location assertions and side bias, but there's no support for employing them when rendering yet. + +### Highlighting Text + +There is a generic module for overlaying arbitrary SVG elements, `overlayer.js`. It can be used to implement highlighting text for annotations. It's the same technique used by [marks-pane](https://github.com/fchasen/marks), used by Epub.js, but it's designed to be easily extensible. You can return any SVG element in the `draw` function, making it possible to add custom styles such as squiggly lines or even free hand drawings. + +The overlay has no event listeners by default. It only provides a `.hitTest(event)` method, that can be used to do hit tests. Currently it does this with the client rects of `Range`s, not the element returned by `draw()`. + +An overlayer object implements the following interface for the consumption of renderers: +- `.element`: the DOM element of the overlayer. This element will be inserted, resized, and positioned automatically by the renderer on top of the page. +- `.redraw()`: called by the renderer when the overlay needs to be redrawn. + +### The Text Walker + +Not a particularly descriptive name, but essentially, `text-walker.js` is a small DOM utility that allows you to + +1. Gather all text nodes in a `Range`, `Document` or `DocumentFragment` into an array of strings. +2. Perform splitting or matching on the strings. +3. Get back the results of these string operations as `Range`s. + +E.g. you can join all the text nodes together, use `Intl.Segmenter` to segment the string into words, and get the results in DOM Ranges, so you can mark up those words in the original document. + +In foliate-js, this is used for searching and TTS. + +### Searching + +It provides a search module, which can in fact be used as a standalone module for searching across any array of strings. There's no limit on the number of strings a match is allowed to span. It's based on `Intl.Collator` and `Intl.Segmenter`, to support ignoring diacritics and matching whole words only. It's extrenely slow, and you'd probably want to load results incrementally. + +### Text-to-Speech (TTS) + +The TTS module doesn't directly handle speech output. Rather, its methods return SSML documents (as strings), which you can then feed to your speech synthesizer. + +The SSML attributes `ssml:ph` and `ssml:alphabet` are supported. There's no support for PLS and CSS Speech. + +### Offline Dictionaries + +The `dict.js` module can be used to load dictd and StarDict dictionaries. Usage: + +```js +import { StarDict } from './dict.js' +import { inflate } from 'your inflate implementation' + +const { ifo, dz, idx, syn } = { /* `File` (or `Blob`) objects */ } +const dict = new StarDict() +await dict.loadIfo(ifo) +await dict.loadDict(dz, inflate) +await dict.loadIdx(idx) +await dict.loadSyn(syn) + +// look up words +const query = '...' +await dictionary.lookup(query) +await dictionary.synonyms(query) +``` + +Note that you must supply your own `inflate` function. Here is an example using [fflate](https://github.com/101arrowz/fflate): +```js +const inflate = data => new Promise(resolve => { + const inflate = new fflate.Inflate() + inflate.ondata = data => resolve(data) + inflate.push(data) +}) +``` + +### OPDS + +The `opds.js` module can be used to implement OPDS clients. It can convert OPDS 1.x documents to OPDS 2.0: + +- `getFeed(doc)`: converts an OPDS 1.x feed to OPDS 2.0. The argument must be a DOM Document object. You need to use a `DOMParser` to obtain a Document first if you have a string. +- `getPublication(entry)`: converts a OPDS 1.x entry in acquisition feeds to an OPDS 2.0 publication. The argument must be a DOM Element object. + +It exports the following symbols for properties unsupported by OPDS 2.0: +- `SYMBOL.SUMMARY`: used on navigation links to represent the summary/content (see https://github.com/opds-community/drafts/issues/51) +- `SYMBOL.CONTENT`: used on publications to represent the content/description and its type. This is mainly for preserving the type info for XHTML. The value of this property is an object whose properties are: + - `.type`: either "text", "html", or "xhtml" + - `.value`: the value of the content + +There are also two functions that can be used to implement search forms: + +- `getOpenSearch(doc)`: for OpenSearch. The argument is a DOM Document object of an OpenSearch search document. +- `getSearch(link)` for templated search in OPDS 2.0. The argument must be an OPDS 2.0 Link object. Note that this function will import `uri-template.js`. + +These two functions return an object that implements the following interface: +- `.metadata`: an object with the string properties `title` and `description` +- `.params`: an array, representing the search parameters, whose elements are objects whose properties are + - `ns`: a string; the namespace of the parameter + - `name`: a string; the name of the parameter + - `required`: a boolean, whether the parameter is required + - `value`: a string; the default value of the parameter +- `.search(map)`: a function, whose argument is a `Map` whose values are `Map`s (i.e. a two-dimensional map). The first key is the namespace of the search parameter. For non-namespaced parameters, the first key must be `null`. The second key is the parameter's name. Returns a string representing the URL of the search results. + +### Generating Images for Quotes + +With `quote-image.js`, one can generate shareable images for quotes: + +```js +document.querySelector('foliate-quoteimage').getBlob({ + title: 'The Time Machine', + author: 'H. G. Wells', + text: 'Can an instantaneous cube exist?', +}) +``` + +### Supported Browsers + +It aims to support the latest version of WebKitGTK, Firefox, and Chromium. Older browsers like Firefox ESR are not supported. + +Although it's mainly indeded for rendering e-books in the browser, some features can be used in non-browser environments as well. In particular, `epubcfi.js` can be used as is in any environment if you only need to parse or sort CFIs. Most other features depend on having the global objects `Blob`, `TextDecoder`, `TextEncoder`, `DOMParser`, `XMLSerializer`, and `URL`, and should work if you polyfill them. + +## License + +MIT. + +Vendored libraries: +- [zip.js](https://github.com/gildas-lormeau/zip.js) is licensed under the BSD-3-Clause license. +- [fflate](https://github.com/101arrowz/fflate) is MIT licensed. +- [PDF.js](https://mozilla.github.io/pdf.js/) is licensed under Apache. diff --git a/web/vendor/foliate-js/comic-book.js b/web/vendor/foliate-js/comic-book.js new file mode 100644 index 00000000..924ee2bd --- /dev/null +++ b/web/vendor/foliate-js/comic-book.js @@ -0,0 +1,114 @@ +// Read series metadata from a ComicInfo.xml entry, if present. +// Spec: https://anansi-project.github.io/docs/comicinfo/intro +const readComicInfoXML = async ({ entries, loadBlob }) => { + const entry = entries.find(e => e.filename.toLowerCase() === 'comicinfo.xml') + if (!entry) return null + let text + try { + text = await (await loadBlob(entry.filename)).text() + } catch { + return null + } + let doc + try { + doc = new DOMParser().parseFromString(text, 'application/xml') + } catch { + return null + } + if (!doc || doc.getElementsByTagName('parsererror').length) return null + const get = name => doc.getElementsByTagName(name).item(0)?.textContent?.trim() || undefined + return { + title: get('Title'), + publisher: get('Publisher'), + language: get('LanguageISO'), + author: get('Writer'), + series: get('Series'), + seriesPosition: get('Number'), + seriesTotal: get('Count'), + } +} + +const readComicBookInfo = async ({ getComment }) => { + let info + try { + info = JSON.parse(await getComment() || '')['ComicBookInfo/1.0'] + } catch { + return null + } + if (!info) return null + const year = info.publicationYear + const month = info.publicationMonth + const mm = month && month >= 1 && month <= 12 ? String(month).padStart(2, '0') : null + return { + title: info.title, + publisher: info.publisher, + language: info.language || info.lang, + author: info.credits ? info.credits.map(c => `${c.person} (${c.role})`).join(', ') : '', + published: year && month ? `${year}-${mm}` : undefined, + series: info.series, + seriesPosition: info.issue == null ? undefined : String(info.issue), + } +} + +export const makeComicBook = async ({ entries, loadBlob, getSize, getComment }, file) => { + const cache = new Map() + const urls = new Map() + const load = async name => { + if (cache.has(name)) return cache.get(name) + const src = URL.createObjectURL(await loadBlob(name)) + const page = URL.createObjectURL( + new Blob([``], { type: 'text/html' })) + urls.set(name, [src, page]) + cache.set(name, page) + return page + } + const unload = name => { + urls.get(name)?.forEach?.(url => URL.revokeObjectURL(url)) + urls.delete(name) + cache.delete(name) + } + + const exts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.jxl', '.avif'] + const files = entries + .map(entry => entry.filename) + .filter(name => exts.some(ext => name.endsWith(ext))) + .sort() + if (!files.length) throw new Error('No supported image files in archive') + + const book = {} + // Prefer ComicInfo.xml (Anansi standard) over ComicBookInfo (JSON in zip comment). + // Fields missing from the preferred source fall through to the secondary one. + const xml = await readComicInfoXML({ entries, loadBlob }) + const cbi = await readComicBookInfo({ getComment }) + const merged = { ...(cbi || {}), ...(xml || {}) } + book.metadata = { + title: merged.title || file.name, + publisher: merged.publisher, + language: merged.language, + author: merged.author, + published: merged.published, + } + if (merged.series) { + const series = { name: merged.series } + if (merged.seriesPosition) series.position = merged.seriesPosition + if (merged.seriesTotal) series.total = merged.seriesTotal + book.metadata.belongsTo = { series } + } + book.getCover = () => loadBlob(files[0]) + book.sections = files.map(name => ({ + id: name, + load: () => load(name), + unload: () => unload(name), + size: getSize(name), + })) + book.toc = files.map(name => ({ label: name, href: name })) + book.rendition = { layout: 'pre-paginated' } + book.resolveHref = href => ({ index: book.sections.findIndex(s => s.id === href) }) + book.splitTOCHref = href => [href, null] + book.getTOCFragment = doc => doc.documentElement + book.destroy = () => { + for (const arr of urls.values()) + for (const url of arr) URL.revokeObjectURL(url) + } + return book +} diff --git a/web/vendor/foliate-js/dict.js b/web/vendor/foliate-js/dict.js new file mode 100644 index 00000000..9afa7ea1 --- /dev/null +++ b/web/vendor/foliate-js/dict.js @@ -0,0 +1,241 @@ +const decoder = new TextDecoder() +const decode = decoder.decode.bind(decoder) + +const concatTypedArray = (a, b) => { + const result = new a.constructor(a.length + b.length) + result.set(a) + result.set(b, a.length) + return result +} + +const strcmp = (a, b) => { + a = a.toLowerCase(), b = b.toLowerCase() + return a < b ? -1 : a > b ? 1 : 0 +} + +class DictZip { + #chlen + #chunks + #compressed + inflate + async load(file) { + const header = new DataView(await file.slice(0, 12).arrayBuffer()) + if (header.getUint8(0) !== 31 || header.getUint8(1) !== 139 + || header.getUint8(2) !== 8) throw new Error('Not a DictZip file') + const flg = header.getUint8(3) + if (!flg & 0b100) throw new Error('Missing FEXTRA flag') + + const xlen = header.getUint16(10, true) + const extra = new DataView(await file.slice(12, 12 + xlen).arrayBuffer()) + if (extra.getUint8(0) !== 82 || extra.getUint8(1) !== 65) + throw new Error('Subfield ID should be RA') + if (extra.getUint16(4, true) !== 1) throw new Error('Unsupported version') + + this.#chlen = extra.getUint16(6, true) + const chcnt = extra.getUint16(8, true) + this.#chunks = [] + for (let i = 0, chunkOffset = 0; i < chcnt; i++) { + const chunkSize = extra.getUint16(10 + 2 * i, true) + this.#chunks.push([chunkOffset, chunkSize]) + chunkOffset = chunkOffset + chunkSize + } + + // skip to compressed data + let offset = 12 + xlen + const max = Math.min(offset + 512, file.size) + const strArr = new Uint8Array(await file.slice(0, max).arrayBuffer()) + if (flg & 0b1000) { // fname + const i = strArr.indexOf(0, offset) + if (i < 0) throw new Error('Header too long') + offset = i + 1 + } + if (flg & 0b10000) { // fcomment + const i = strArr.indexOf(0, offset) + if (i < 0) throw new Error('Header too long') + offset = i + 1 + } + if (flg & 0b10) offset += 2 // fhcrc + this.#compressed = file.slice(offset) + } + async read(offset, size) { + const chunks = this.#chunks + const startIndex = Math.trunc(offset / this.#chlen) + const endIndex = Math.trunc((offset + size) / this.#chlen) + const buf = await this.#compressed.slice(chunks[startIndex][0], + chunks[endIndex][0] + chunks[endIndex][1]).arrayBuffer() + let arr = new Uint8Array() + for (let pos = 0, i = startIndex; i <= endIndex; i++) { + const data = new Uint8Array(buf, pos, chunks[i][1]) + arr = concatTypedArray(arr, await this.inflate(data)) + pos += chunks[i][1] + } + const startOffset = offset - startIndex * this.#chlen + return arr.subarray(startOffset, startOffset + size) + } +} + +class Index { + strcmp = strcmp + // binary search + bisect(query, start = 0, end = this.words.length - 1) { + if (end - start === 1) { + if (!this.strcmp(query, this.getWord(start))) return start + if (!this.strcmp(query, this.getWord(end))) return end + return null + } + const mid = Math.floor(start + (end - start) / 2) + const cmp = this.strcmp(query, this.getWord(mid)) + if (cmp < 0) return this.bisect(query, start, mid) + if (cmp > 0) return this.bisect(query, mid, end) + return mid + } + // check for multiple definitions + checkAdjacent(query, i) { + if (i == null) return [] + let j = i + const equals = i => { + const word = this.getWord(i) + return word ? this.strcmp(query, word) === 0 : false + } + while (equals(j - 1)) j-- + let k = i + while (equals(k + 1)) k++ + return j === k ? [i] : Array.from({ length: k + 1 - j }, (_, i) => j + i) + } + lookup(query) { + return this.checkAdjacent(query, this.bisect(query)) + } +} + +const decodeBase64Number = str => { + const { length } = str + let n = 0 + for (let i = 0; i < length; i++) { + const c = str.charCodeAt(i) + n += (c === 43 ? 62 // "+" + : c === 47 ? 63 // "/" + : c < 58 ? c + 4 // 0-9 -> 52-61 + : c < 91 ? c - 65 // A-Z -> 0-25 + : c - 71 // a-z -> 26-51 + ) * 64 ** (length - 1 - i) + } + return n +} + +class DictdIndex extends Index { + getWord(i) { + return this.words[i] + } + async load(file) { + const words = [] + const offsets = [] + const sizes = [] + for (const line of decode(await file.arrayBuffer()).split('\n')) { + const a = line.split('\t') + words.push(a[0]) + offsets.push(decodeBase64Number(a[1])) + sizes.push(decodeBase64Number(a[2])) + } + this.words = words + this.offsets = offsets + this.sizes = sizes + } +} + +export class DictdDict { + #dict = new DictZip() + #idx = new DictdIndex() + loadDict(file, inflate) { + this.#dict.inflate = inflate + return this.#dict.load(file) + } + async #readWord(i) { + const word = this.#idx.getWord(i) + const offset = this.#idx.offsets[i] + const size = this.#idx.sizes[i] + return { word, data: ['m', this.#dict.read(offset, size)] } + } + #readWords(arr) { + return Promise.all(arr.map(this.#readWord.bind(this))) + } + lookup(query) { + return this.#readWords(this.#idx.lookup(query)) + } +} + +class StarDictIndex extends Index { + isSyn + #arr + getWord(i) { + const word = this.words[i] + if (!word) return + return decode(this.#arr.subarray(word[0], word[1])) + } + async load(file) { + const { isSyn } = this + const buf = await file.arrayBuffer() + const arr = new Uint8Array(buf) + this.#arr = arr + const view = new DataView(buf) + const words = [] + const offsets = [] + const sizes = [] + for (let i = 0; i < arr.length;) { + const newI = arr.subarray(0, i + 256).indexOf(0, i) + if (newI < 0) throw new Error('Word too big') + words.push([i, newI]) + offsets.push(view.getUint32(newI + 1)) + if (isSyn) i = newI + 5 + else { + sizes.push(view.getUint32(newI + 5)) + i = newI + 9 + } + } + this.words = words + this.offsets = offsets + this.sizes = sizes + } +} + +export class StarDict { + #dict = new DictZip() + #idx = new StarDictIndex() + #syn = Object.assign(new StarDictIndex(), { isSyn: true }) + async loadIfo(file) { + const str = decode(await file.arrayBuffer()) + this.ifo = Object.fromEntries(str.split('\n').map(line => { + const sep = line.indexOf('=') + if (sep < 0) return + return [line.slice(0, sep), line.slice(sep + 1)] + }).filter(x => x)) + } + loadDict(file, inflate) { + this.#dict.inflate = inflate + return this.#dict.load(file) + } + loadIdx(file) { + return this.#idx.load(file) + } + loadSyn(file) { + if (file) return this.#syn.load(file) + } + async #readWord(i) { + const word = this.#idx.getWord(i) + const offset = this.#idx.offsets[i] + const size = this.#idx.sizes[i] + const data = await this.#dict.read(offset, size) + const seq = this.ifo.sametypesequence + if (!seq) throw new Error('TODO') + if (seq.length === 1) return { word, data: [[seq[0], data]] } + throw new Error('TODO') + } + #readWords(arr) { + return Promise.all(arr.map(this.#readWord.bind(this))) + } + lookup(query) { + return this.#readWords(this.#idx.lookup(query)) + } + synonyms(query) { + return this.#readWords(this.#syn.lookup(query).map(i => this.#syn.offsets[i])) + } +} diff --git a/web/vendor/foliate-js/epub.js b/web/vendor/foliate-js/epub.js new file mode 100644 index 00000000..e12f12ed --- /dev/null +++ b/web/vendor/foliate-js/epub.js @@ -0,0 +1,1223 @@ +import * as CFI from './epubcfi.js' + +const NS = { + CONTAINER: 'urn:oasis:names:tc:opendocument:xmlns:container', + XHTML: 'http://www.w3.org/1999/xhtml', + OPF: 'http://www.idpf.org/2007/opf', + EPUB: 'http://www.idpf.org/2007/ops', + DC: 'http://purl.org/dc/elements/1.1/', + DCTERMS: 'http://purl.org/dc/terms/', + ENC: 'http://www.w3.org/2001/04/xmlenc#', + NCX: 'http://www.daisy.org/z3986/2005/ncx/', + XLINK: 'http://www.w3.org/1999/xlink', + SMIL: 'http://www.w3.org/ns/SMIL', +} + +const MIME = { + XML: 'application/xml', + NCX: 'application/x-dtbncx+xml', + XHTML: 'application/xhtml+xml', + HTML: 'text/html', + CSS: 'text/css', + SVG: 'image/svg+xml', + JS: /\/(x-)?(javascript|ecmascript)/, +} + +// https://www.w3.org/TR/epub-33/#sec-reserved-prefixes +const PREFIX = { + a11y: 'http://www.idpf.org/epub/vocab/package/a11y/#', + dcterms: 'http://purl.org/dc/terms/', + marc: 'http://id.loc.gov/vocabulary/', + media: 'http://www.idpf.org/epub/vocab/overlays/#', + onix: 'http://www.editeur.org/ONIX/book/codelists/current.html#', + rendition: 'http://www.idpf.org/vocab/rendition/#', + schema: 'http://schema.org/', + xsd: 'http://www.w3.org/2001/XMLSchema#', + msv: 'http://www.idpf.org/epub/vocab/structure/magazine/#', + prism: 'http://www.prismstandard.org/specifications/3.0/PRISM_CV_Spec_3.0.htm#', +} + +const RELATORS = { + art: 'artist', + aut: 'author', + clr: 'colorist', + edt: 'editor', + ill: 'illustrator', + nrt: 'narrator', + trl: 'translator', + pbl: 'publisher', +} + +const ONIX5 = { + '02': 'isbn', + '06': 'doi', + '15': 'isbn', + '26': 'doi', + '34': 'issn', +} + +// convert to camel case +const camel = x => x.toLowerCase().replace(/[-:](.)/g, (_, g) => g.toUpperCase()) + +// strip and collapse ASCII whitespace +// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace +const normalizeWhitespace = str => str ? str + .replace(/[\t\n\f\r ]+/g, ' ') + .replace(/^[\t\n\f\r ]+/, '') + .replace(/[\t\n\f\r ]+$/, '') : '' + +const filterAttribute = (attr, value, isList) => isList + ? el => el.getAttribute(attr)?.split(/\s/)?.includes(value) + : typeof value === 'function' + ? el => value(el.getAttribute(attr)) + : el => el.getAttribute(attr) === value + +const getAttributes = (...xs) => el => + el ? Object.fromEntries(xs.map(x => [camel(x), el.getAttribute(x)])) : null + +const getElementText = el => normalizeWhitespace(el?.textContent) + +const childGetter = (doc, ns) => { + // ignore the namespace if it doesn't appear in document at all + const useNS = doc.lookupNamespaceURI(null) === ns || doc.lookupPrefix(ns) + const f = useNS + ? (el, name) => el => el.namespaceURI === ns && el.localName === name + : (el, name) => el => el.localName === name + return { + $: (el, name) => [...el.children].find(f(el, name)), + $$: (el, name) => [...el.children].filter(f(el, name)), + $$$: useNS + ? (el, name) => [...el.getElementsByTagNameNS(ns, name)] + : (el, name) => [...el.getElementsByTagName(name)], + } +} + +const resolveURL = (url, relativeTo) => { + try { + // replace %2c in the url with a comma, this might be introduced by calibre + url = url.replace(/%2c/gi, ',').replace(/%3a/gi, ':') + if (relativeTo.includes(':') && !relativeTo.startsWith('OEBPS')) return new URL(url, relativeTo) + // the base needs to be a valid URL, so set a base URL and then remove it + const root = 'https://invalid.invalid/' + const obj = new URL(url, root + relativeTo) + obj.search = '' + return decodeURI(obj.href.replace(root, '')) + } catch(e) { + console.warn(e) + return url + } +} + +const isExternal = uri => /^(?!blob)\w+:/i.test(uri) + +// like `path.relative()` in Node.js +const pathRelative = (from, to) => { + if (!from) return to + const as = from.replace(/\/$/, '').split('/') + const bs = to.replace(/\/$/, '').split('/') + const i = (as.length > bs.length ? as : bs).findIndex((_, i) => as[i] !== bs[i]) + return i < 0 ? '' : Array(as.length - i).fill('..').concat(bs.slice(i)).join('/') +} + +const pathDirname = str => str.slice(0, str.lastIndexOf('/') + 1) + +// replace asynchronously and sequentially +// same technique as https://stackoverflow.com/a/48032528 +const replaceSeries = async (str, regex, f) => { + const matches = [] + str.replace(regex, (...args) => (matches.push(args), null)) + const results = [] + for (const args of matches) results.push(await f(...args)) + return str.replace(regex, () => results.shift()) +} + +const regexEscape = str => str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') + +const tidy = obj => { + for (const [key, val] of Object.entries(obj)) + if (val == null) delete obj[key] + else if (Array.isArray(val)) { + obj[key] = val.filter(x => x).map(x => + typeof x === 'object' && !Array.isArray(x) ? tidy(x) : x) + if (!obj[key].length) delete obj[key] + else if (obj[key].length === 1) obj[key] = obj[key][0] + } + else if (typeof val === 'object') { + obj[key] = tidy(val) + if (!Object.keys(val).length) delete obj[key] + } + const keys = Object.keys(obj) + if (keys.length === 1 && keys[0] === 'name') return obj[keys[0]] + return obj +} + +// https://www.w3.org/TR/epub/#sec-prefix-attr +const getPrefixes = doc => { + const map = new Map(Object.entries(PREFIX)) + const value = doc.documentElement.getAttributeNS(NS.EPUB, 'prefix') + || doc.documentElement.getAttribute('prefix') + if (value) for (const [, prefix, url] of value + .matchAll(/(.+): +(.+)[ \t\r\n]*/g)) map.set(prefix, url) + return map +} + +// https://www.w3.org/TR/epub-rs/#sec-property-values +// but ignoring the case where the prefix is omitted +const getPropertyURL = (value, prefixes) => { + if (!value) return null + const [a, b] = value.split(':') + const prefix = b ? a : null + const reference = b ? b : a + const baseURL = prefixes.get(prefix) + return baseURL ? baseURL + reference : null +} + +const getMetadata = opf => { + const { $ } = childGetter(opf, NS.OPF) + const $metadata = $(opf.documentElement, 'metadata') + + // first pass: convert to JS objects + const els = Object.groupBy($metadata.children, el => + el.namespaceURI === NS.DC ? 'dc' + : el.namespaceURI === NS.OPF && el.localName === 'meta' ? + (el.hasAttribute('name') ? 'legacyMeta' : 'meta') : '') + const baseLang = $metadata.getAttribute('xml:lang') + ?? opf.documentElement.getAttribute('xml:lang') ?? 'und' + const prefixes = getPrefixes(opf) + const parse = el => { + const property = el.getAttribute('property') + const scheme = el.getAttribute('scheme') + return { + property: getPropertyURL(property, prefixes) ?? property, + scheme: getPropertyURL(scheme, prefixes) ?? scheme, + lang: el.getAttribute('xml:lang'), + value: getElementText(el), + props: getProperties(el), + // `opf:` attributes from EPUB 2 & EPUB 3.1 (removed in EPUB 3.2) + attrs: Object.fromEntries(Array.from(el.attributes) + .filter(attr => attr.namespaceURI === NS.OPF) + .map(attr => [attr.localName, attr.value])), + } + } + const refines = Map.groupBy(els.meta ?? [], el => el.getAttribute('refines')) + const getProperties = el => { + const els = refines.get(el ? '#' + el.getAttribute('id') : null) + if (!els) return null + return Object.groupBy(els.map(parse), x => x.property) + } + const dc = Object.fromEntries(Object.entries(Object.groupBy(els.dc || [], el => el.localName)) + .map(([name, els]) => [name, els.map(parse)])) + const properties = getProperties() ?? {} + const legacyMeta = Object.fromEntries(els.legacyMeta?.map(el => + [el.getAttribute('name'), el.getAttribute('content')]) ?? []) + + // second pass: map to webpub + const one = x => x?.[0]?.value + const prop = (x, p) => one(x?.props?.[p]) + const makeLanguageMap = x => { + if (!x) return null + const alts = x.props?.['alternate-script'] ?? [] + const altRep = x.attrs['alt-rep'] + if (!alts.length && (!x.lang || x.lang === baseLang) && !altRep) return x.value + const map = { [x.lang ?? baseLang]: x.value } + if (altRep) map[x.attrs['alt-rep-lang']] = altRep + for (const y of alts) map[y.lang] ??= y.value + return map + } + const makeContributor = x => x ? ({ + name: makeLanguageMap(x), + sortAs: makeLanguageMap(x.props?.['file-as']?.[0]) ?? x.attrs['file-as'], + role: x.props?.role?.filter(x => x.scheme === PREFIX.marc + 'relators') + ?.map(x => x.value) ?? [x.attrs.role], + code: prop(x, 'term') ?? x.attrs.term, + scheme: prop(x, 'authority') ?? x.attrs.authority, + }) : null + const makeCollection = x => ({ + name: makeLanguageMap(x), + // NOTE: webpub requires number but EPUB allows values like "2.2.1" + position: one(x.props?.['group-position']), + }) + const makeSeries = x => ({ + name: x.value, + position: one(x.props?.['group-position']), + }) + const makeAltIdentifier = x => { + const { value } = x + if (/^urn:/i.test(value)) return value + if (/^doi:/i.test(value)) return `urn:${value}` + const type = x.props?.['identifier-type'] + if (!type) { + const scheme = x.attrs.scheme + if (!scheme) return value + // https://idpf.github.io/epub-registries/identifiers/ + // but no "jdcn", which isn't a registered URN namespace + if (/^(doi|isbn|uuid)$/i.test(scheme)) return `urn:${scheme}:${value}` + // NOTE: webpub requires scheme to be a URI; EPUB allows anything + return { scheme, value } + } + if (type.scheme === PREFIX.onix + 'codelist5') { + const nid = ONIX5[type.value] + if (nid) return `urn:${nid}:${value}` + } + return value + } + const belongsTo = Object.groupBy(properties['belongs-to-collection'] ?? [], + x => prop(x, 'collection-type') === 'series' ? 'series' : 'collection') + const mainTitle = dc.title?.find(x => prop(x, 'title-type') === 'main') ?? dc.title?.[0] + const metadata = { + identifier: getIdentifier(opf), + title: makeLanguageMap(mainTitle), + sortAs: makeLanguageMap(mainTitle?.props?.['file-as']?.[0]) + ?? mainTitle?.attrs?.['file-as'] + ?? legacyMeta?.['calibre:title_sort'], + subtitle: dc.title?.find(x => prop(x, 'title-type') === 'subtitle')?.value, + language: dc.language?.map(x => x.value), + description: one(dc.description), + publisher: makeContributor(dc.publisher?.[0]), + published: dc.date?.find(x => x.attrs.event === 'publication')?.value + ?? one(dc.date), + modified: one(properties[PREFIX.dcterms + 'modified']) + ?? dc.date?.find(x => x.attrs.event === 'modification')?.value, + subject: dc.subject?.map(makeContributor), + belongsTo: { + collection: belongsTo.collection?.map(makeCollection), + series: belongsTo.series?.map(makeSeries) + ?? (legacyMeta?.['calibre:series'] ? { + name: legacyMeta?.['calibre:series'], + position: parseFloat(legacyMeta?.['calibre:series_index']), + } : null), + }, + altIdentifier: dc.identifier?.map(makeAltIdentifier), + source: dc.source?.map(makeAltIdentifier), // NOTE: not in webpub schema + rights: one(dc.rights), // NOTE: not in webpub schema + } + const remapContributor = defaultKey => x => { + const keys = new Set(x.role?.map(role => RELATORS[role] ?? defaultKey)) + return [keys.size ? keys : [defaultKey], x] + } + for (const [keys, val] of [].concat( + dc.creator?.map(makeContributor)?.map(remapContributor('author')) ?? [], + dc.contributor?.map(makeContributor)?.map(remapContributor('contributor')) ?? [])) + for (const key of keys) { + // if already parsed publisher don't remap it from author/contributor again + if (key === 'publisher' && metadata.publisher) continue + if (metadata[key]) metadata[key].push(val) + else metadata[key] = [val] + } + tidy(metadata) + if (metadata.altIdentifier === metadata.identifier) + delete metadata.altIdentifier + + const rendition = {} + const media = {} + for (const [key, val] of Object.entries(properties)) { + if (key.startsWith(PREFIX.rendition)) + rendition[camel(key.replace(PREFIX.rendition, ''))] = one(val) + else if (key.startsWith(PREFIX.media)) + media[camel(key.replace(PREFIX.media, ''))] = one(val) + } + if (media.duration) media.duration = parseClock(media.duration) + return { metadata, rendition, media } +} + +const parseNav = (doc, resolve = f => f) => { + const { $, $$, $$$ } = childGetter(doc, NS.XHTML) + const resolveHref = href => href ? decodeURI(resolve(href)) : null + const parseLI = getType => $li => { + const $a = $($li, 'a') ?? $($li, 'span') + const $ol = $($li, 'ol') + const href = resolveHref($a?.getAttribute('href')) + const label = getElementText($a) || $a?.getAttribute('title') + // TODO: get and concat alt/title texts in content + const result = { label, href, subitems: parseOL($ol) } + if (getType) result.type = $a?.getAttributeNS(NS.EPUB, 'type')?.split(/\s/) + return result + } + const parseOL = ($ol, getType) => $ol ? $$($ol, 'li').map(parseLI(getType)) : null + const parseNav = ($nav, getType) => parseOL($($nav, 'ol'), getType) + + const $$nav = $$$(doc, 'nav') + let toc = null, pageList = null, landmarks = null, others = [] + for (const $nav of $$nav) { + const type = $nav.getAttributeNS(NS.EPUB, 'type')?.split(/\s/) ?? [] + if (type.includes('toc')) toc ??= parseNav($nav) + else if (type.includes('page-list')) pageList ??= parseNav($nav) + else if (type.includes('landmarks')) landmarks ??= parseNav($nav, true) + else others.push({ + label: getElementText($nav.firstElementChild), type, + list: parseNav($nav), + }) + } + return { toc, pageList, landmarks, others } +} + +const parseNCX = (doc, resolve = f => f) => { + const { $, $$ } = childGetter(doc, NS.NCX) + const resolveHref = href => href ? decodeURI(resolve(href)) : null + const parseItem = el => { + const $label = $(el, 'navLabel') + const $content = $(el, 'content') + const label = getElementText($label) + const href = resolveHref($content.getAttribute('src')) + if (el.localName === 'navPoint') { + const els = $$(el, 'navPoint') + return { label, href, subitems: els.length ? els.map(parseItem) : null } + } + return { label, href } + } + const parseList = (el, itemName) => $$(el, itemName).map(parseItem) + const getSingle = (container, itemName) => { + const $container = $(doc.documentElement, container) + return $container ? parseList($container, itemName) : null + } + return { + toc: getSingle('navMap', 'navPoint'), + pageList: getSingle('pageList', 'pageTarget'), + others: $$(doc.documentElement, 'navList').map(el => ({ + label: getElementText($(el, 'navLabel')), + list: parseList(el, 'navTarget'), + })), + } +} + +const parseClock = str => { + if (!str) return + const parts = str.split(':').map(x => parseFloat(x)) + if (parts.length === 3) { + const [h, m, s] = parts + return h * 60 * 60 + m * 60 + s + } + if (parts.length === 2) { + const [m, s] = parts + return m * 60 + s + } + const [x, unit] = str.split(/(?=[^\d.])/) + const n = parseFloat(x) + const f = unit === 'h' ? 60 * 60 + : unit === 'min' ? 60 + : unit === 'ms' ? .001 + : 1 + return n * f +} + +const IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp'] +const FONT_EXTENSIONS = ['woff', 'woff2', 'ttf', 'otf'] + +const getImageMediaType = (path) => { + const extension = path.toLowerCase().split('.').pop() + const mediaTypeMap = { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'gif': 'image/gif', + 'webp': 'image/webp', + } + return mediaTypeMap[extension] || 'image/jpeg' +} + +const getFontMediaType = (path) => { + const extension = path.toLowerCase().split('.').pop() + const mediaTypeMap = { + 'woff': 'font/woff', + 'woff2': 'font/woff2', + 'ttf': 'font/ttf', + 'otf': 'font/otf', + } + return mediaTypeMap[extension] || 'font/ttf' +} + +class MediaOverlay extends EventTarget { + #entries + #lastMediaOverlayItem + #sectionIndex + #audioIndex + #itemIndex + #audio + #volume = 1 + #rate = 1 + #state + constructor(book, loadXML) { + super() + this.book = book + this.loadXML = loadXML + } + async #loadSMIL(item) { + if (this.#lastMediaOverlayItem === item) return + const doc = await this.loadXML(item.href) + const resolve = href => href ? resolveURL(href, item.href) : null + const { $, $$$ } = childGetter(doc, NS.SMIL) + this.#audioIndex = -1 + this.#itemIndex = -1 + this.#entries = $$$(doc, 'par').reduce((arr, $par) => { + const text = resolve($($par, 'text')?.getAttribute('src')) + const $audio = $($par, 'audio') + if (!text || !$audio) return arr + const src = resolve($audio.getAttribute('src')) + const begin = parseClock($audio.getAttribute('clipBegin')) + const end = parseClock($audio.getAttribute('clipEnd')) + const last = arr.at(-1) + if (last?.src === src) last.items.push({ text, begin, end }) + else arr.push({ src, items: [{ text, begin, end }] }) + return arr + }, []) + this.#lastMediaOverlayItem = item + } + get #activeAudio() { + return this.#entries[this.#audioIndex] + } + get #activeItem() { + return this.#activeAudio?.items?.[this.#itemIndex] + } + #error(e) { + console.error(e) + this.dispatchEvent(new CustomEvent('error', { detail: e })) + } + #highlight() { + this.dispatchEvent(new CustomEvent('highlight', { detail: this.#activeItem })) + } + #unhighlight() { + this.dispatchEvent(new CustomEvent('unhighlight', { detail: this.#activeItem })) + } + async #play(audioIndex, itemIndex) { + this.#stop() + this.#audioIndex = audioIndex + this.#itemIndex = itemIndex + const src = this.#activeAudio?.src + if (!src || !this.#activeItem) return this.start(this.#sectionIndex + 1) + + const url = URL.createObjectURL(await this.book.loadBlob(src)) + const audio = new Audio(url) + this.#audio = audio + audio.volume = this.#volume + audio.playbackRate = this.#rate + audio.addEventListener('timeupdate', () => { + if (audio.paused) return + const t = audio.currentTime + const { items } = this.#activeAudio + if (t > this.#activeItem?.end) { + this.#unhighlight() + if (this.#itemIndex === items.length - 1) { + this.#play(this.#audioIndex + 1, 0).catch(e => this.#error(e)) + return + } + } + const oldIndex = this.#itemIndex + while (items[this.#itemIndex + 1]?.begin <= t) this.#itemIndex++ + if (this.#itemIndex !== oldIndex) this.#highlight() + }) + audio.addEventListener('error', () => + this.#error(new Error(`Failed to load ${src}`))) + audio.addEventListener('playing', () => this.#highlight()) + audio.addEventListener('ended', () => { + this.#unhighlight() + URL.revokeObjectURL(url) + this.#audio = null + this.#play(audioIndex + 1, 0).catch(e => this.#error(e)) + }) + if (this.#state === 'paused') { + this.#highlight() + audio.currentTime = this.#activeItem.begin ?? 0 + } + else audio.addEventListener('canplaythrough', () => { + // for some reason need to seek in `canplaythrough` + // or it won't play when skipping in WebKit + audio.currentTime = this.#activeItem.begin ?? 0 + this.#state = 'playing' + audio.play().catch(e => this.#error(e)) + }, { once: true }) + } + async start(sectionIndex, filter = () => true) { + this.#audio?.pause() + const section = this.book.sections[sectionIndex] + const href = section?.id + if (!href) return + + const { mediaOverlay } = section + if (!mediaOverlay) return this.start(sectionIndex + 1) + this.#sectionIndex = sectionIndex + await this.#loadSMIL(mediaOverlay) + + for (let i = 0; i < this.#entries.length; i++) { + const { items } = this.#entries[i] + for (let j = 0; j < items.length; j++) { + if (items[j].text.split('#')[0] === href && filter(items[j], j, items)) + return this.#play(i, j).catch(e => this.#error(e)) + } + } + } + pause() { + this.#state = 'paused' + this.#audio?.pause() + } + resume() { + this.#state = 'playing' + this.#audio?.play().catch(e => this.#error(e)) + } + #stop() { + if (this.#audio) { + this.#audio.pause() + URL.revokeObjectURL(this.#audio.src) + this.#audio = null + this.#unhighlight() + } + } + stop() { + this.#state = 'stopped' + this.#stop() + } + prev() { + if (this.#itemIndex > 0) this.#play(this.#audioIndex, this.#itemIndex - 1) + else if (this.#audioIndex > 0) this.#play(this.#audioIndex - 1, + this.#entries[this.#audioIndex - 1].items.length - 1) + else if (this.#sectionIndex > 0) + this.start(this.#sectionIndex - 1, (_, i, items) => i === items.length - 1) + } + next() { + this.#play(this.#audioIndex, this.#itemIndex + 1) + } + setVolume(volume) { + this.#volume = volume + if (this.#audio) this.#audio.volume = volume + } + setRate(rate) { + this.#rate = rate + if (this.#audio) this.#audio.playbackRate = rate + } +} + +const isUUID = /([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/i + +const getUUID = opf => { + const extractUUID = el => { + const text = getElementText(el) + const id = text.split(':').slice(-1)[0] + const match = isUUID.exec(id) + return match ? match[0] : null + } + const identifiers = Array.from(opf.getElementsByTagNameNS(NS.DC, 'identifier')) + // 1. Prefer the unique-identifier (used by Adobe font obfuscation) + const uniqueIdAttr = opf.documentElement.getAttribute('unique-identifier') + if (uniqueIdAttr) { + const el = identifiers.find(el => el.getAttribute('id') === uniqueIdAttr) + if (el) { + const uuid = extractUUID(el) + if (uuid) return uuid + } + } + // 2. Prefer urn:uuid: identifiers (standard UUID URN per RFC 4122) + for (const el of identifiers) { + const text = getElementText(el) + if (/^urn:uuid:/i.test(text)) { + const uuid = extractUUID(el) + if (uuid) return uuid + } + } + // 3. Fall back to any identifier containing a UUID + for (const el of identifiers) { + const uuid = extractUUID(el) + if (uuid) return uuid + } + return '' +} + +const getIdentifier = opf => getElementText( + opf.getElementById(opf.documentElement.getAttribute('unique-identifier')) + ?? opf.getElementsByTagNameNS(NS.DC, 'identifier')[0]) + +// https://www.w3.org/publishing/epub32/epub-ocf.html#sec-resource-obfuscation +const deobfuscate = async (key, length, blob) => { + const array = new Uint8Array(await blob.slice(0, length).arrayBuffer()) + length = Math.min(length, array.length) + for (var i = 0; i < length; i++) array[i] = array[i] ^ key[i % key.length] + return new Blob([array, blob.slice(length)], { type: blob.type }) +} + +const WebCryptoSHA1 = async str => { + const data = new TextEncoder().encode(str) + const buffer = await globalThis.crypto.subtle.digest('SHA-1', data) + return new Uint8Array(buffer) +} + +const deobfuscators = (sha1 = WebCryptoSHA1) => ({ + 'http://www.idpf.org/2008/embedding': { + key: opf => sha1(getIdentifier(opf) + // eslint-disable-next-line no-control-regex + .replaceAll(/[\u0020\u0009\u000d\u000a]/g, '')), + decode: (key, blob) => deobfuscate(key, 1040, blob), + }, + 'http://ns.adobe.com/pdf/enc#RC': { + key: opf => { + const uuid = getUUID(opf).replaceAll('-', '') + return Uint8Array.from({ length: 16 }, (_, i) => + parseInt(uuid.slice(i * 2, i * 2 + 2), 16)) + }, + decode: (key, blob) => deobfuscate(key, 1024, blob), + }, +}) + +class Encryption { + #uris = new Map() + #decoders = new Map() + #algorithms + constructor(algorithms) { + this.#algorithms = algorithms + } + async init(encryption, opf) { + if (!encryption) return + const data = Array.from( + encryption.getElementsByTagNameNS(NS.ENC, 'EncryptedData'), el => ({ + algorithm: el.getElementsByTagNameNS(NS.ENC, 'EncryptionMethod')[0] + ?.getAttribute('Algorithm'), + uri: el.getElementsByTagNameNS(NS.ENC, 'CipherReference')[0] + ?.getAttribute('URI'), + })) + for (const { algorithm, uri } of data) { + if (!this.#decoders.has(algorithm)) { + const algo = this.#algorithms[algorithm] + if (!algo) { + console.warn('Unknown encryption algorithm') + continue + } + const key = await algo.key(opf) + this.#decoders.set(algorithm, blob => algo.decode(key, blob)) + } + this.#uris.set(uri, algorithm) + } + } + getDecoder(uri) { + return this.#decoders.get(this.#uris.get(uri)) ?? (x => x) + } +} + +class Resources { + constructor({ opf, resolveHref }) { + this.opf = opf + const { $, $$, $$$ } = childGetter(opf, NS.OPF) + + const $manifest = $(opf.documentElement, 'manifest') + const $spine = $(opf.documentElement, 'spine') + const $$itemref = $$($spine, 'itemref') + + this.manifest = $$($manifest, 'item') + .map(getAttributes('href', 'id', 'media-type', 'properties', 'media-overlay')) + .map(item => { + item.href = resolveHref(item.href) + item.properties = item.properties?.split(/\s/) + return item + }) + this.manifestById = new Map(this.manifest.map(item => [item.id, item])) + this.spine = $$itemref + .map(getAttributes('idref', 'id', 'linear', 'properties')) + .map(item => (item.properties = item.properties?.split(/\s/), item)) + this.pageProgressionDirection = $spine + .getAttribute('page-progression-direction') + + this.navPath = this.getItemByProperty('nav')?.href + this.ncxPath = (this.getItemByID($spine.getAttribute('toc')) + ?? this.manifest.find(item => item.mediaType === MIME.NCX))?.href + + const $guide = $(opf.documentElement, 'guide') + if ($guide) this.guide = $$($guide, 'reference') + .map(getAttributes('type', 'title', 'href')) + .map(({ type, title, href }) => ({ + label: title, + type: type.split(/\s/), + href: resolveHref(href), + })) + + this.cover = this.getItemByProperty('cover-image') + // EPUB 2 compat + ?? this.getItemByID($$$(opf, 'meta') + .find(filterAttribute('name', 'cover')) + ?.getAttribute('content')) + ?? this.manifest.find(item => item.id === 'cover' + && item.mediaType.startsWith('image')) + ?? this.manifest.find(item => item.href.includes('cover') + && item.mediaType.startsWith('image')) + ?? this.getItemByHref(this.guide + ?.find(ref => ref.type.includes('cover'))?.href) + // last resort: first image in manifest + ?? this.manifest.find(item => item.mediaType.startsWith('image')) + + this.cfis = CFI.fromElements($$itemref) + } + getItemByID(id) { + return this.manifestById.get(id) + } + getItemByHref(href) { + return this.manifest.find(item => item.href === href) + } + getItemByProperty(prop) { + return this.manifest.find(item => item.properties?.includes(prop)) + } + resolveCFI(cfi) { + const parts = CFI.parse(cfi) + const top = (parts.parent ?? parts).shift() + let $itemref = CFI.toElement(this.opf, top) + // make sure it's an idref; if not, try again without the ID assertion + // mainly because Epub.js used to generate wrong ID assertions + // https://github.com/futurepress/epub.js/issues/1236 + if ($itemref && $itemref.nodeName !== 'idref') { + top.at(-1).id = null + $itemref = CFI.toElement(this.opf, top) + } + const idref = $itemref?.getAttribute('idref') + const index = this.spine.findIndex(item => item.idref === idref) + const anchor = doc => CFI.toRange(doc, parts) + return { index, anchor } + } +} + +class Loader { + #cache = new Map() + #cacheXHTMLContent = new Map() + #children = new Map() + #refCount = new Map() + eventTarget = new EventTarget() + constructor({ loadText, loadBlob, resources, entries }) { + this.loadText = loadText + this.loadBlob = loadBlob + this.manifest = resources.manifest + this.assets = resources.manifest + this.entries = entries + // needed only when replacing in (X)HTML w/o parsing (see below) + //.filter(({ mediaType }) => ![MIME.XHTML, MIME.HTML].includes(mediaType)) + } + async createURL(href, data, type, parent) { + if (!data) return '' + const detail = { data, type } + Object.defineProperty(detail, 'name', { value: href }) // readonly + const event = new CustomEvent('data', { detail }) + this.eventTarget.dispatchEvent(event) + const newData = await event.detail.data + const newType = await event.detail.type + const url = URL.createObjectURL(new Blob([newData], { type: newType })) + this.#cache.set(href, url) + this.#refCount.set(href, 1) + if (newType === MIME.XHTML || newType === MIME.HTML) { + this.#cacheXHTMLContent.set(url, {href, type: newType, data: newData}) + } + if (parent) { + const childList = this.#children.get(parent) + if (childList) childList.push(href) + else this.#children.set(parent, [href]) + } + return url + } + ref(href, parent) { + const childList = this.#children.get(parent) + if (!childList?.includes(href)) { + this.#refCount.set(href, this.#refCount.get(href) + 1) + //console.log(`referencing ${href}, now ${this.#refCount.get(href)}`) + if (childList) childList.push(href) + else this.#children.set(parent, [href]) + } + return this.#cache.get(href) + } + unref(href) { + if (!this.#refCount.has(href)) return + const count = this.#refCount.get(href) - 1 + //console.log(`unreferencing ${href}, now ${count}`) + if (count < 1) { + //console.log(`unloading ${href}`) + const url = this.#cache.get(href) + URL.revokeObjectURL(url) + this.#cache.delete(href) + this.#cacheXHTMLContent.delete(url) + this.#refCount.delete(href) + // unref children + const childList = this.#children.get(href) + if (childList) while (childList.length) this.unref(childList.pop()) + this.#children.delete(href) + } else this.#refCount.set(href, count) + } + // load manifest item, recursively loading all resources as needed + async loadItem(item, parents = []) { + if (!item) return null + const { href, mediaType } = item + + const isScript = MIME.JS.test(item.mediaType) + const detail = { type: mediaType, href, isScript, allow: true} + const event = new CustomEvent('load', { detail }) + this.eventTarget.dispatchEvent(event) + const { allow, url } = await event.detail + if (!allow) return null + if (url !== undefined) return url + + const parent = parents.at(-1) + if (this.#cache.has(href)) return this.ref(href, parent) + + const shouldReplace = + (isScript || [MIME.XHTML, MIME.HTML, MIME.CSS, MIME.SVG].includes(mediaType)) + // prevent circular references + && parents.every(p => p !== href) + if (shouldReplace) return this.loadReplaced(item, parents) + // NOTE: this can be replaced with `Promise.try()` + const tryLoadBlob = Promise.resolve().then(() => this.loadBlob(href)) + return this.createURL(href, tryLoadBlob, mediaType, parent) + } + async loadItemXHTMLContent(item, parents = []) { + const url = await this.loadItem(item, parents) + if (url) return this.#cacheXHTMLContent.get(url)?.data + } + tryImageEntryItem(path) { + if (!IMAGE_EXTENSIONS.some(ext => path.toLowerCase().endsWith(`.${ext}`))) { + return null + } + if (!this.entries.get(path)) { + return null + } + return { + href: path, + mediaType: getImageMediaType(path), + } + } + tryFontEntryItem(path) { + if (!FONT_EXTENSIONS.some(ext => path.toLowerCase().endsWith(`.${ext}`))) { + return null + } + if (this.entries.get(path)) { + return { + href: path, + mediaType: getFontMediaType(path), + } + } + return { + href: `fonts/${path.split('/').pop()}`, + mediaType: getFontMediaType(path), + } + } + async loadHref(href, base, parents = []) { + if (isExternal(href)) return href + const path = resolveURL(href, base) + let item = this.manifest.find(item => item.href === path) + if (!item) { + item = this.tryImageEntryItem(path) ?? this.tryFontEntryItem(path) + if (!item) { + return href + } + } + return this.loadItem(item, parents.concat(base)) + } + async loadReplaced(item, parents = []) { + const { href, mediaType } = item + const parent = parents.at(-1) + let str = '' + try { + str = await this.loadText(href) + } catch (e) { + return this.createURL(href, Promise.reject(e), mediaType, parent) + } + if (!str) return null + + // note that one can also just use `replaceString` for everything: + // ``` + // const replaced = await this.replaceString(str, href, parents) + // return this.createURL(href, replaced, mediaType, parent) + // ``` + // which is basically what Epub.js does, which is simpler, but will + // break things like iframes (because you don't want to replace links) + // or text that just happen to be paths + + // parse and replace in HTML + if ([MIME.XHTML, MIME.HTML, MIME.SVG].includes(mediaType)) { + let doc = new DOMParser().parseFromString(str, mediaType) + // change to HTML if it's not valid XHTML + if (mediaType === MIME.XHTML && (doc.querySelector('parsererror') + || !doc.documentElement?.namespaceURI)) { + console.warn(doc.querySelector('parsererror')?.innerText ?? 'Invalid XHTML') + item.mediaType = MIME.HTML + doc = new DOMParser().parseFromString(str, item.mediaType) + } + // replace hrefs in XML processing instructions + // this is mainly for SVGs that use xml-stylesheet + if ([MIME.XHTML, MIME.SVG].includes(item.mediaType)) { + let child = doc.firstChild + while (child instanceof ProcessingInstruction) { + if (child.data) { + const replacedData = await replaceSeries(child.data, + /(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i, + (_, p1, p2, p3) => this.loadHref(p2, href, parents) + .then(p2 => `${p1}${p2}${p3}`)) + child.replaceWith(doc.createProcessingInstruction( + child.target, replacedData)) + } + child = child.nextSibling + } + } + // replace hrefs (excluding anchors) + const replace = async (el, attr) => el.setAttribute(attr, + await this.loadHref(el.getAttribute(attr), href, parents)) + for (const el of doc.querySelectorAll('link[href]')) await replace(el, 'href') + for (const el of doc.querySelectorAll('[src]')) await replace(el, 'src') + for (const el of doc.querySelectorAll('[poster]')) await replace(el, 'poster') + for (const el of doc.querySelectorAll('object[data]')) await replace(el, 'data') + for (const el of doc.querySelectorAll('[*|href]:not([href])')) + el.setAttributeNS(NS.XLINK, 'href', await this.loadHref( + el.getAttributeNS(NS.XLINK, 'href'), href, parents)) + for (const el of doc.querySelectorAll('[srcset]')) + el.setAttribute('srcset', await replaceSeries(el.getAttribute('srcset'), + /(\s*)(.+?)\s*((?:\s[\d.]+[wx])+\s*(?:,|$)|,\s+|$)/g, + (_, p1, p2, p3) => this.loadHref(p2, href, parents) + .then(p2 => `${p1}${p2}${p3}`))) + // replace inline styles + for (const el of doc.querySelectorAll('style')) + if (el.textContent) el.textContent = + await this.replaceCSS(el.textContent, href, parents) + for (const el of doc.querySelectorAll('[style]')) + el.setAttribute('style', + await this.replaceCSS(el.getAttribute('style'), href, parents)) + // TODO: replace inline scripts? probably not worth the trouble + const result = new XMLSerializer().serializeToString(doc) + return this.createURL(href, result, item.mediaType, parent) + } + + const result = mediaType === MIME.CSS + ? await this.replaceCSS(str, href, parents) + : await this.replaceString(str, href, parents) + return this.createURL(href, result, mediaType, parent) + } + async replaceCSS(str, href, parents = []) { + const replacedUrls = await replaceSeries(str, + /url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi, + (_, url) => this.loadHref(url, href, parents) + .then(url => `url("${url}")`)) + // apart from `url()`, strings can be used for `@import` (but why?!) + return replaceSeries(replacedUrls, + /@import\s*["']([^"'\n]*?)["']/gi, + (_, url) => this.loadHref(url, href, parents) + .then(url => `@import "${url}"`)) + } + // find & replace all possible relative paths for all assets without parsing + replaceString(str, href, parents = []) { + const assetMap = new Map() + const urls = this.assets.map(asset => { + // do not replace references to the file itself + if (asset.href === href) return + // href was decoded and resolved when parsing the manifest + const relative = pathRelative(pathDirname(href), asset.href) + const relativeEnc = encodeURI(relative) + const rootRelative = '/' + asset.href + const rootRelativeEnc = encodeURI(rootRelative) + const set = new Set([relative, relativeEnc, rootRelative, rootRelativeEnc]) + for (const url of set) assetMap.set(url, asset) + return Array.from(set) + }).flat().filter(x => x) + if (!urls.length) return str + const regex = new RegExp(urls.map(regexEscape).join('|'), 'g') + return replaceSeries(str, regex, async match => + this.loadItem(assetMap.get(match.replace(/^\//, '')), + parents.concat(href))) + } + unloadItem(item) { + this.unref(item?.href) + } + destroy() { + for (const url of this.#cache.values()) URL.revokeObjectURL(url) + } +} + +const getHTMLFragment = (doc, id) => doc.getElementById(id) + ?? doc.querySelector(`[name="${CSS.escape(id)}"]`) + +const getPageSpread = properties => { + for (const p of properties) { + if (p === 'page-spread-left' || p === 'rendition:page-spread-left') + return 'left' + if (p === 'page-spread-right' || p === 'rendition:page-spread-right') + return 'right' + if (p === 'rendition:page-spread-center') return 'center' + } +} + +const getDisplayOptions = doc => { + if (!doc) return null + return { + fixedLayout: getElementText(doc.querySelector('option[name="fixed-layout"]')), + openToSpread: getElementText(doc.querySelector('option[name="open-to-spread"]')), + } +} + +export class EPUB { + parser = new DOMParser() + #loader + #encryption + constructor({ entries, loadText, loadBlob, getSize, sha1 }) { + this.entries = entries.reduce((map, entry) => { + map.set(entry.filename, entry) + return map + }, new Map()) + this.loadText = loadText + this.loadBlob = loadBlob + this.getSize = getSize + this.#encryption = new Encryption(deobfuscators(sha1)) + } + #sanitizeXMLEntities(str) { + // Common HTML entities that aren't valid in XML + const entityMap = { + 'nbsp': ' ', + 'mdash': '—', + 'ndash': '–', + 'ldquo': '“', + 'rdquo': '”', + 'lsquo': '‘', + 'rsquo': '’', + 'hellip': '…', + 'copy': '©', + 'reg': '®', + 'trade': '™', + 'bull': '•', + 'middot': '·', + } + return str.replace(/&([a-z]+);/gi, (match, entity) => { + return entityMap[entity.toLowerCase()] || match + }) + } + async #loadXML(uri) { + const str = await this.loadText(uri) + if (!str) return null + const sanitized = this.#sanitizeXMLEntities(str) + const doc = this.parser.parseFromString(sanitized, MIME.XML) + if (doc.querySelector('parsererror')) + throw new Error(`XML parsing error: ${uri} +${doc.querySelector('parsererror').innerText}`) + return doc + } + async init() { + const $container = await this.#loadXML('META-INF/container.xml') + if (!$container) throw new Error('Failed to load container file') + + const opfs = Array.from( + $container.getElementsByTagNameNS(NS.CONTAINER, 'rootfile'), + getAttributes('full-path', 'media-type')) + .filter(file => file.mediaType === 'application/oebps-package+xml') + + if (!opfs.length) throw new Error('No package document defined in container') + const opfPath = opfs[0].fullPath + const opf = await this.#loadXML(opfPath) + if (!opf) throw new Error('Failed to load package document') + + const $encryption = await this.#loadXML('META-INF/encryption.xml') + await this.#encryption.init($encryption, opf) + + this.resources = new Resources({ + opf, + resolveHref: url => resolveURL(url, opfPath), + }) + this.#loader = new Loader({ + loadText: this.loadText, + loadBlob: uri => Promise.resolve(this.loadBlob(uri)) + .then(this.#encryption.getDecoder(uri)), + resources: this.resources, + entries: this.entries, + }) + this.transformTarget = this.#loader.eventTarget + this.sections = this.resources.spine.map((spineItem, index) => { + const { idref, linear, properties = [] } = spineItem + const item = this.resources.getItemByID(idref) + if (!item) { + console.warn(`Could not find item with ID "${idref}" in manifest`) + return null + } + return { + id: item.href, + load: () => this.#loader.loadItem(item), + unload: () => this.#loader.unloadItem(item), + loadText: () => this.#loader.loadText(item.href), + loadContent: () => this.#loader.loadItemXHTMLContent(item), + createDocument: () => this.loadDocument(item), + size: this.getSize(item.href), + cfi: this.resources.cfis[index], + linear, + spineProperties: properties, + pageSpread: getPageSpread(properties), + resolveHref: href => resolveURL(href, item.href), + mediaOverlay: item.mediaOverlay + ? this.resources.getItemByID(item.mediaOverlay) : null, + } + }).filter(s => s) + + const { navPath, ncxPath } = this.resources + if (navPath) try { + const resolve = url => resolveURL(url, navPath) + const nav = parseNav(await this.#loadXML(navPath), resolve) + this.toc = nav.toc + this.pageList = nav.pageList + this.landmarks = nav.landmarks + } catch(e) { + console.warn(e) + } + if (!this.toc && ncxPath) try { + const resolve = url => resolveURL(url, ncxPath) + const ncx = parseNCX(await this.#loadXML(ncxPath), resolve) + this.toc = ncx.toc + this.pageList = ncx.pageList + } catch(e) { + console.warn(e) + } + + this.landmarks ??= this.resources.guide + + const { metadata, rendition, media } = getMetadata(opf) + this.metadata = metadata + this.rendition = rendition + this.media = media + this.dir = this.resources.pageProgressionDirection + const displayOptions = getDisplayOptions( + await this.#loadXML('META-INF/com.apple.ibooks.display-options.xml') + ?? await this.#loadXML('META-INF/com.kobobooks.display-options.xml')) + if (displayOptions) { + if (displayOptions.fixedLayout === 'true') + this.rendition.layout ??= 'pre-paginated' + if (displayOptions.openToSpread === 'false') this.sections + .find(section => section.linear !== 'no').pageSpread ??= + this.dir === 'rtl' ? 'left' : 'right' + } + return this + } + async loadDocument(item) { + const str = await this.loadText(item.href) + return this.parser.parseFromString(str, item.mediaType) + } + getMediaOverlay() { + return new MediaOverlay(this, this.#loadXML.bind(this)) + } + resolveCFI(cfi) { + return this.resources.resolveCFI(cfi) + } + resolveHref(href) { + const [path, hash] = href.split('#') + const item = this.resources.getItemByHref(decodeURI(path)) + if (!item) return null + const index = this.resources.spine.findIndex(({ idref }) => idref === item.id) + const anchor = hash ? doc => getHTMLFragment(doc, hash) : () => 0 + return { index, anchor } + } + splitTOCHref(href) { + return href?.split('#') ?? [] + } + getTOCFragment(doc, id) { + return doc.getElementById(id) + ?? doc.querySelector(`[name="${CSS.escape(id)}"]`) + } + isExternal(uri) { + return isExternal(uri) + } + async getCover() { + const cover = this.resources?.cover + return cover?.href + ? new Blob([await this.loadBlob(cover.href)], { type: cover.mediaType }) + : null + } + async getCalibreBookmarks() { + const txt = await this.loadText('META-INF/calibre_bookmarks.txt') + const magic = 'encoding=json+base64:' + if (txt?.startsWith(magic)) { + const json = atob(txt.slice(magic.length)) + return JSON.parse(json) + } + } + destroy() { + this.#loader?.destroy() + } +} diff --git a/web/vendor/foliate-js/epubcfi.js b/web/vendor/foliate-js/epubcfi.js new file mode 100644 index 00000000..d61dc7b8 --- /dev/null +++ b/web/vendor/foliate-js/epubcfi.js @@ -0,0 +1,354 @@ +const findIndices = (arr, f) => arr + .map((x, i, a) => f(x, i, a) ? i : null).filter(x => x != null) +const splitAt = (arr, is) => [-1, ...is, arr.length].reduce(({ xs, a }, b) => + ({ xs: xs?.concat([arr.slice(a + 1, b)]) ?? [], a: b }), {}).xs +const concatArrays = (a, b) => + a.slice(0, -1).concat([a[a.length - 1].concat(b[0])]).concat(b.slice(1)) + +const isNumber = /\d/ +export const isCFI = /^epubcfi\((.*)\)$/ +const escapeCFI = str => str.replace(/[\^[\](),;=]/g, '^$&') + +const wrap = x => isCFI.test(x) ? x : `epubcfi(${x})` +const unwrap = x => x.match(isCFI)?.[1] ?? x +const lift = f => (...xs) => + `epubcfi(${f(...xs.map(x => x.match(isCFI)?.[1] ?? x))})` +export const joinIndir = lift((...xs) => xs.join('!')) + +const tokenizer = str => { + const tokens = [] + let state, escape, value = '' + const push = x => (tokens.push(x), state = null, value = '') + const cat = x => (value += x, escape = false) + for (const char of Array.from(str.trim()).concat('')) { + if (char === '^' && !escape) { + escape = true + continue + } + if (state === '!') push(['!']) + else if (state === ',') push([',']) + else if (state === '/' || state === ':') { + if (isNumber.test(char)) { + cat(char) + continue + } else push([state, parseInt(value)]) + } else if (state === '~') { + if (isNumber.test(char) || char === '.') { + cat(char) + continue + } else push(['~', parseFloat(value)]) + } else if (state === '@') { + if (char === ':') { + push(['@', parseFloat(value)]) + state = '@' + continue + } + if (isNumber.test(char) || char === '.') { + cat(char) + continue + } else push(['@', parseFloat(value)]) + } else if (state === '[') { + if (char === ';' && !escape) { + push(['[', value]) + state = ';' + } else if (char === ',' && !escape) { + push(['[', value]) + state = '[' + } else if (char === ']' && !escape) push(['[', value]) + else cat(char) + continue + } else if (state?.startsWith(';')) { + if (char === '=' && !escape) { + state = `;${value}` + value = '' + } else if (char === ';' && !escape) { + push([state, value]) + state = ';' + } else if (char === ']' && !escape) push([state, value]) + else cat(char) + continue + } + if (char === '/' || char === ':' || char === '~' || char === '@' + || char === '[' || char === '!' || char === ',') state = char + } + return tokens +} + +const findTokens = (tokens, x) => findIndices(tokens, ([t]) => t === x) + +const parser = tokens => { + const parts = [] + let state + for (const [type, val] of tokens) { + if (type === '/') parts.push({ index: val }) + else { + const last = parts[parts.length - 1] + if (type === ':') last.offset = val + else if (type === '~') last.temporal = val + else if (type === '@') last.spatial = (last.spatial ?? []).concat(val) + else if (type === ';s') last.side = val + else if (type === '[') { + if (state === '/' && val) last.id = val + else { + last.text = (last.text ?? []).concat(val) + continue + } + } + } + state = type + } + return parts +} + +// split at step indirections, then parse each part +const parserIndir = tokens => + splitAt(tokens, findTokens(tokens, '!')).map(parser) + +export const parse = cfi => { + const tokens = tokenizer(unwrap(cfi)) + const commas = findTokens(tokens, ',') + if (!commas.length) return parserIndir(tokens) + const [parent, start, end] = splitAt(tokens, commas).map(parserIndir) + return { parent, start, end } +} + +const partToString = ({ index, id, offset, temporal, spatial, text, side }) => { + const param = side ? `;s=${side}` : '' + return `/${index}` + + (id ? `[${escapeCFI(id)}${param}]` : '') + // "CFI expressions [..] SHOULD include an explicit character offset" + + (offset != null && index % 2 ? `:${offset}` : '') + + (temporal ? `~${temporal}` : '') + + (spatial ? `@${spatial.join(':')}` : '') + + (text || (!id && side) ? '[' + + (text?.map(escapeCFI)?.join(',') ?? '') + + param + ']' : '') +} + +const toInnerString = parsed => parsed.parent + ? [parsed.parent, parsed.start, parsed.end].map(toInnerString).join(',') + : parsed.map(parts => parts.map(partToString).join('')).join('!') + +const toString = parsed => wrap(toInnerString(parsed)) + +export const collapse = (x, toEnd) => typeof x === 'string' + ? toString(collapse(parse(x), toEnd)) + : x.parent ? concatArrays(x.parent, x[toEnd ? 'end' : 'start']) : x + +// create range CFI from two CFIs +const buildRange = (from, to) => { + if (typeof from === 'string') from = parse(from) + if (typeof to === 'string') to = parse(to) + from = collapse(from) + to = collapse(to, true) + // ranges across multiple documents are not allowed; handle local paths only + const localFrom = from[from.length - 1], localTo = to[to.length - 1] + const localParent = [], localStart = [], localEnd = [] + let pushToParent = true + const len = Math.max(localFrom.length, localTo.length) + for (let i = 0; i < len; i++) { + const a = localFrom[i], b = localTo[i] + pushToParent &&= a?.index === b?.index && !a?.offset && !b?.offset + if (pushToParent) localParent.push(a) + else { + if (a) localStart.push(a) + if (b) localEnd.push(b) + } + } + // copy non-local paths from `from` + const parent = from.slice(0, -1).concat([localParent]) + return toString({ parent, start: [localStart], end: [localEnd] }) +} + +export const compare = (a, b) => { + if (typeof a === 'string') a = parse(a) + if (typeof b === 'string') b = parse(b) + if (a.start || b.start) return compare(collapse(a), collapse(b)) + || compare(collapse(a, true), collapse(b, true)) + + for (let i = 0; i < Math.max(a.length, b.length); i++) { + const p = a[i] ?? [], q = b[i] ?? [] + const maxIndex = Math.max(p.length, q.length) - 1 + for (let i = 0; i <= maxIndex; i++) { + const x = p[i], y = q[i] + if (!x) return -1 + if (!y) return 1 + if (x.index > y.index) return 1 + if (x.index < y.index) return -1 + if (i === maxIndex) { + // TODO: compare temporal & spatial offsets + if (x.offset > y.offset) return 1 + if (x.offset < y.offset) return -1 + } + } + } + return 0 +} + +const isTextNode = ({ nodeType }) => nodeType === 3 || nodeType === 4 +const isElementNode = ({ nodeType }) => nodeType === 1 +const isInertNode = (node) => node.hasAttribute?.('cfi-inert') + +const getChildNodes = (node, filter) => { + const nodes = Array.from(node.childNodes) + // "content other than element and character data is ignored" + .filter(node => isTextNode(node) || isElementNode(node)) + // always skip nodes marked with cfi-inert attribute + .filter(node => !isInertNode(node)) + return filter ? nodes.map(node => { + const accept = filter(node) + if (accept === NodeFilter.FILTER_REJECT) return null + else if (accept === NodeFilter.FILTER_SKIP) return getChildNodes(node, filter) + else return node + }).flat().filter(x => x) : nodes +} + +// child nodes are organized such that the result is always +// [element, text, element, text, ..., element], +// regardless of the actual structure in the document; +// so multiple text nodes need to be combined, and nonexistent ones counted; +// see "Step Reference to Child Element or Character Data (/)" in EPUB CFI spec +const indexChildNodes = (node, filter) => { + const nodes = getChildNodes(node, filter) + .reduce((arr, node) => { + let last = arr[arr.length - 1] + if (!last) arr.push(node) + // "there is one chunk between each pair of child elements" + else if (isTextNode(node)) { + if (Array.isArray(last)) last.push(node) + else if (isTextNode(last)) arr[arr.length - 1] = [last, node] + else arr.push(node) + } else { + if (isElementNode(last)) arr.push(null, node) + else arr.push(node) + } + return arr + }, []) + // "the first chunk is located before the first child element" + if (isElementNode(nodes[0])) nodes.unshift('first') + // "the last chunk is located after the last child element" + if (isElementNode(nodes[nodes.length - 1])) nodes.push('last') + // "'virtual' elements" + nodes.unshift('before') // "0 is a valid index" + nodes.push('after') // "n+2 is a valid index" + return nodes +} + +const partsToNode = (node, parts, filter) => { + const { id } = parts[parts.length - 1] + if (id) { + const el = node.ownerDocument.getElementById(id) + if (el) return { node: el, offset: 0 } + } + for (const { index } of parts) { + const newNode = node ? indexChildNodes(node, filter)[index] : null + // handle non-existent nodes + if (newNode === 'first') return { node: node.firstChild ?? node } + if (newNode === 'last') return { node: node.lastChild ?? node } + if (newNode === 'before') return { node, before: true } + if (newNode === 'after') return { node, after: true } + node = newNode + } + const { offset } = parts[parts.length - 1] + if (!Array.isArray(node)) return { node, offset } + // get underlying text node and offset from the chunk + let sum = 0 + for (const n of node) { + const { length } = n.nodeValue + if (sum + length >= offset) return { node: n, offset: offset - sum } + sum += length + } +} + +const nodeToParts = (node, offset, filter) => { + const { parentNode, id } = node + const indexed = indexChildNodes(parentNode, filter) + const index = indexed.findIndex(x => + Array.isArray(x) ? x.some(x => x === node) : x === node) + // adjust offset as if merging the text nodes in the chunk + const chunk = indexed[index] + if (Array.isArray(chunk)) { + let sum = 0 + for (const x of chunk) { + if (x === node) { + sum += offset + break + } else sum += x.nodeValue.length + } + offset = sum + } + const part = { id, index, offset } + return (parentNode !== node.ownerDocument.documentElement + ? nodeToParts(parentNode, null, filter).concat(part) : [part]) + // remove ignored nodes + .filter(x => x.index !== -1) +} + +export const fromRange = (range, filter) => { + const { startContainer, startOffset, endContainer, endOffset } = range + const start = nodeToParts(startContainer, startOffset, filter) + if (range.collapsed) return toString([start]) + const end = nodeToParts(endContainer, endOffset, filter) + return buildRange([start], [end]) +} + +export const toRange = (doc, parts, filter) => { + try { + const startParts = collapse(parts) + const endParts = collapse(parts, true) + + const root = doc.documentElement + const start = partsToNode(root, startParts[0], filter) + const end = partsToNode(root, endParts[0], filter) + + if (!start?.node || !end?.node) return null + + const range = doc.createRange() + + if (start.before) range.setStartBefore(start.node) + else if (start.after) range.setStartAfter(start.node) + else range.setStart(start.node, start.offset) + + if (end.before) range.setEndBefore(end.node) + else if (end.after) range.setEndAfter(end.node) + else range.setEnd(end.node, end.offset) + return range + } catch { + return null + } +} + +// faster way of getting CFIs for sorted elements in a single parent +export const fromElements = elements => { + const results = [] + const { parentNode } = elements[0] + const parts = nodeToParts(parentNode) + for (const [index, node] of indexChildNodes(parentNode).entries()) { + const el = elements[results.length] + if (node === el) + results.push(toString([parts.concat({ id: el.id, index })])) + } + return results +} + +export const toElement = (doc, parts) => + partsToNode(doc.documentElement, collapse(parts)).node + +// turn indices into standard CFIs when you don't have an actual package document +export const fake = { + fromIndex: index => wrap(`/6/${(index + 1) * 2}`), + toIndex: parts => parts?.at(-1).index / 2 - 1, +} + +// get CFI from Calibre bookmarks +// see https://github.com/johnfactotum/foliate/issues/849 +export const fromCalibrePos = pos => { + const [parts] = parse(pos) + const item = parts.shift() + parts.shift() + return toString([[{ index: 6 }, item], parts]) +} +export const fromCalibreHighlight = ({ spine_index, start_cfi, end_cfi }) => { + const pre = fake.fromIndex(spine_index) + '!' + return buildRange(pre + start_cfi.slice(2), pre + end_cfi.slice(2)) +} diff --git a/web/vendor/foliate-js/fb2.js b/web/vendor/foliate-js/fb2.js new file mode 100644 index 00000000..a1623c40 --- /dev/null +++ b/web/vendor/foliate-js/fb2.js @@ -0,0 +1,348 @@ +const normalizeWhitespace = str => str ? str + .replace(/[\t\n\f\r ]+/g, ' ') + .replace(/^[\t\n\f\r ]+/, '') + .replace(/[\t\n\f\r ]+$/, '') : '' +const getElementText = el => normalizeWhitespace(el?.textContent) + +const NS = { + XLINK: 'http://www.w3.org/1999/xlink', + EPUB: 'http://www.idpf.org/2007/ops', +} + +const MIME = { + XML: 'application/xml', + XHTML: 'application/xhtml+xml', +} + +const STYLE = { + 'strong': ['strong', 'self'], + 'emphasis': ['em', 'self'], + 'style': ['span', 'self'], + 'a': 'anchor', + 'strikethrough': ['s', 'self'], + 'sub': ['sub', 'self'], + 'sup': ['sup', 'self'], + 'code': ['code', 'self'], + 'image': 'image', +} + +const TABLE = { + 'tr': ['tr', { + 'th': ['th', STYLE, ['colspan', 'rowspan', 'align', 'valign']], + 'td': ['td', STYLE, ['colspan', 'rowspan', 'align', 'valign']], + }, ['align']], +} + +const POEM = { + 'epigraph': ['blockquote'], + 'subtitle': ['h2', STYLE], + 'text-author': ['p', STYLE], + 'date': ['p', STYLE], + 'stanza': ['div', 'self'], + 'v': ['div', STYLE], +} + +const SECTION = { + 'title': ['header', { + 'p': ['h1', STYLE], + 'empty-line': ['br'], + }], + 'epigraph': ['blockquote', 'self'], + 'image': 'image', + 'annotation': ['aside'], + 'section': ['section', 'self'], + 'p': ['p', STYLE], + 'poem': ['blockquote', POEM], + 'subtitle': ['h2', STYLE], + 'cite': ['blockquote', 'self'], + 'empty-line': ['br'], + 'table': ['table', TABLE], + 'text-author': ['p', STYLE], +} +POEM['epigraph'].push(SECTION) + +const BODY = { + 'image': 'image', + 'title': ['section', { + 'p': ['h1', STYLE], + 'empty-line': ['br'], + }], + 'epigraph': ['section', SECTION], + 'section': ['section', SECTION], +} + +class FB2Converter { + constructor(fb2) { + this.fb2 = fb2 + this.doc = document.implementation.createDocument(NS.XHTML, 'html') + // use this instead of `getElementById` to allow images like + // `` + this.bins = new Map(Array.from(this.fb2.getElementsByTagName('binary'), + el => [el.id, el])) + } + getImageSrc(el) { + const href = el.getAttributeNS(NS.XLINK, 'href') + if (!href) return 'data:,' + const [, id] = href.split('#') + if (!id) return href + const bin = this.bins.get(id) + return bin + ? `data:${bin.getAttribute('content-type')};base64,${bin.textContent}` + : href + } + image(node) { + const el = this.doc.createElement('img') + el.alt = node.getAttribute('alt') + el.title = node.getAttribute('title') + el.setAttribute('src', this.getImageSrc(node)) + return el + } + anchor(node) { + const el = this.convert(node, { 'a': ['a', STYLE] }) + el.setAttribute('href', node.getAttributeNS(NS.XLINK, 'href')) + if (node.getAttribute('type') === 'note') + el.setAttributeNS(NS.EPUB, 'epub:type', 'noteref') + return el + } + convert(node, def) { + // not an element; return text content + if (node.nodeType === 3) return this.doc.createTextNode(node.textContent) + if (node.nodeType === 4) return this.doc.createCDATASection(node.textContent) + if (node.nodeType === 8) return this.doc.createComment(node.textContent) + + const d = def?.[node.nodeName] + if (!d) return null + if (typeof d === 'string') return this[d](node) + + const [name, opts, attrs] = d + const el = this.doc.createElement(name) + + // copy the ID, and set class name from original element name + if (node.id) el.id = node.id + el.classList.add(node.nodeName) + + // copy attributes + if (Array.isArray(attrs)) for (const attr of attrs) { + const value = node.getAttribute(attr) + if (value) el.setAttribute(attr, value) + } + + // process child elements recursively + const childDef = opts === 'self' ? def : opts + let child = node.firstChild + while (child) { + const childEl = this.convert(child, childDef) + if (childEl) el.append(childEl) + child = child.nextSibling + } + return el + } +} + +const parseXML = async blob => { + const buffer = await blob.arrayBuffer() + const str = new TextDecoder('utf-8').decode(buffer) + const parser = new DOMParser() + const doc = parser.parseFromString(str, MIME.XML) + const encoding = doc.xmlEncoding + // `Document.xmlEncoding` is deprecated, and already removed in Firefox + // so parse the XML declaration manually + || str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1] + if (encoding && encoding.toLowerCase() !== 'utf-8') { + const str = new TextDecoder(encoding).decode(buffer) + return parser.parseFromString(str, MIME.XML) + } + return doc +} + +const style = URL.createObjectURL(new Blob([` +@namespace epub "http://www.idpf.org/2007/ops"; +body > img, section > img { + display: block; + margin: auto; +} +.title h1 { + text-align: center; +} +body > section > .title, body.notesBodyType > .title { + margin: 3em 0; +} +body.notesBodyType > section .title h1 { + text-align: start; +} +body.notesBodyType > section .title { + margin: 1em 0; +} +p { + text-indent: 1em; + margin: 0; +} +:not(p) + p, p:first-child { + text-indent: 0; +} +.stanza { + text-indent: 0; + margin: 1em 0; +} +.text-author, .date { + text-align: end; +} +.text-author:before { + content: "—"; +} +table { + border-collapse: collapse; +} +td, th { + padding: .25em; +} +a[epub|type~="noteref"] { + font-size: .75em; + vertical-align: super; +} +body:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph { + margin: 3em 0; +} +`], { type: 'text/css' })) + +const template = html => ` + + + ${html} +` + +// name of custom ID attribute for TOC items +const dataID = 'data-foliate-id' + +export const makeFB2 = async blob => { + const book = {} + const doc = await parseXML(blob) + const converter = new FB2Converter(doc) + + const $ = x => doc.querySelector(x) + const $$ = x => [...doc.querySelectorAll(x)] + const getPerson = el => { + const nick = getElementText(el.querySelector('nickname')) + if (nick) return nick + const first = getElementText(el.querySelector('first-name')) + const middle = getElementText(el.querySelector('middle-name')) + const last = getElementText(el.querySelector('last-name')) + const name = [first, middle, last].filter(x => x).join(' ') + const sortAs = last + ? [last, [first, middle].filter(x => x).join(' ')].join(', ') + : null + return { name, sortAs } + } + const getDate = el => el?.getAttribute('value') ?? getElementText(el) + const annotation = $('title-info annotation') + book.metadata = { + title: getElementText($('title-info book-title')), + identifier: getElementText($('document-info id')), + language: getElementText($('title-info lang')), + author: $$('title-info author').map(getPerson), + translator: $$('title-info translator').map(getPerson), + contributor: $$('document-info author').map(getPerson) + // techincially the program probably shouldn't get the `bkp` role + // but it has been so used by calibre, so ¯\_(ツ)_/¯ + .concat($$('document-info program-used').map(getElementText)) + .map(x => Object.assign(typeof x === 'string' ? { name: x } : x, + { role: 'bkp' })), + publisher: getElementText($('publish-info publisher')), + published: getDate($('title-info date')), + modified: getDate($('document-info date')), + description: annotation ? converter.convert(annotation, + { annotation: ['div', SECTION] }).innerHTML : null, + subject: $$('title-info genre').map(getElementText), + } + if ($('coverpage image')) { + const src = converter.getImageSrc($('coverpage image')) + book.getCover = () => fetch(src).then(res => res.blob()) + } else book.getCover = () => null + + // get convert each body + const bodyData = Array.from(doc.querySelectorAll('body'), body => { + const converted = converter.convert(body, { body: ['body', BODY] }) + return [Array.from(converted.children, el => { + // get list of IDs in the section + const ids = [el, ...el.querySelectorAll('[id]')].map(el => el.id) + return { el, ids } + }), converted] + }) + + const urls = [] + const sectionData = bodyData[0][0] + // make a separate section for each section in the first body + .map(({ el, ids }, id) => { + // set up titles for TOC + const titles = Array.from( + el.querySelectorAll(':scope > section > .title'), + (el, index) => { + el.setAttribute(dataID, index) + const section = el.closest('section') + const size = new TextEncoder().encode(section.innerHTML).length + - Array.from(section.querySelectorAll('[src]')) + .reduce((sum, el) => sum + (el.getAttribute('src')?.length ?? 0), 0) + return { title: getElementText(el), index, size, href: `${id}#${index}` } + }) + return { ids, titles, el } + }) + // for additional bodies, only make one section for each body + .concat(bodyData.slice(1).map(([sections, body]) => { + const ids = sections.map(s => s.ids).flat() + body.classList.add('notesBodyType') + return { ids, el: body, linear: 'no' } + })) + .map(({ ids, titles, el, linear }) => { + const str = template(el.outerHTML) + const blob = new Blob([str], { type: MIME.XHTML }) + const url = URL.createObjectURL(blob) + urls.push(url) + const title = normalizeWhitespace( + el.querySelector('.title, .subtitle, p')?.textContent + ?? (el.classList.contains('title') ? el.textContent : '')) + return { + ids, title, titles, load: () => url, + createDocument: () => new DOMParser().parseFromString(str, MIME.XHTML), + // doo't count image data as it'd skew the size too much + size: blob.size - Array.from(el.querySelectorAll('[src]'), + el => el.getAttribute('src')?.length ?? 0) + .reduce((a, b) => a + b, 0), + linear, + } + }) + + const idMap = new Map() + book.sections = sectionData.map((section, index) => { + const { ids, load, createDocument, size, linear, titles } = section + for (const id of ids) if (id) idMap.set(id, index) + return { id: index, load, createDocument, size, linear, subitems: titles } + }) + + book.toc = sectionData.map(({ title, titles }, index) => { + const id = index.toString() + return { + label: title, + href: id, + subitems: titles?.length ? titles.map(({ title, index }) => ({ + label: title, + href: `${id}#${index}`, + })) : null, + } + }).filter(item => item) + + book.resolveHref = href => { + const [a, b] = href.split('#') + return a + // the link is from the TOC + ? { index: Number(a), anchor: doc => doc.querySelector(`[${dataID}="${b}"]`) } + // link from within the page + : { index: idMap.get(b), anchor: doc => doc.getElementById(b) } + } + book.splitTOCHref = href => href?.split('#')?.map(x => Number(x)) ?? [] + book.getTOCFragment = (doc, id) => doc.querySelector(`[${dataID}="${id}"]`) + + book.destroy = () => { + for (const url of urls) URL.revokeObjectURL(url) + } + return book +} diff --git a/web/vendor/foliate-js/fixed-layout.js b/web/vendor/foliate-js/fixed-layout.js new file mode 100644 index 00000000..57c85f2b --- /dev/null +++ b/web/vendor/foliate-js/fixed-layout.js @@ -0,0 +1,1295 @@ +import 'construct-style-sheets-polyfill' + +const parseViewport = str => str + ?.split(/[,;\s]/) // NOTE: technically, only the comma is valid + ?.filter(x => x) + ?.map(x => x.split('=').map(x => x.trim())) + +const getViewport = (doc, viewport) => { + // use `viewBox` for SVG + if (doc.documentElement.localName === 'svg') { + const [, , width, height] = doc.documentElement + .getAttribute('viewBox')?.split(/\s/) ?? [] + return { width, height } + } + + // get `viewport` `meta` element + const meta = parseViewport(doc.querySelector('meta[name="viewport"]') + ?.getAttribute('content')) + if (meta) return Object.fromEntries(meta) + + // fallback to book's viewport + if (typeof viewport === 'string') return parseViewport(viewport) + if (viewport?.width && viewport.height) return viewport + + // if no viewport (possibly with image directly in spine), get image size + const img = doc.querySelector('img') + if (img) return { width: img.naturalWidth, height: img.naturalHeight } + + // just show *something*, i guess... + console.warn(new Error('Missing viewport properties')) + return { width: 1000, height: 2000 } +} + +const clamp = (value, min, max) => Math.min(max, Math.max(min, value)) + +export const captureScrollModeAnchor = (pages, scrollTop, fallbackIndex = -1) => { + const fallbackPage = pages.find(page => page.index === fallbackIndex) + const currentPage = pages.find(page => + page.height > 0 + && scrollTop >= page.top + && scrollTop < page.top + page.height) + ?? fallbackPage + ?? pages.find(page => page.height > 0) + + if (!currentPage) return null + return { + index: currentPage.index, + fraction: currentPage.height > 0 + ? clamp((scrollTop - currentPage.top) / currentPage.height, 0, 1) + : 0, + scrollTop, + } +} + +export const restoreScrollModeAnchor = (pages, anchor, maxScrollTop) => { + if (!anchor) return 0 + const page = pages.find(candidate => candidate.index === anchor.index) + if (!page || page.height <= 0) return clamp(anchor.scrollTop, 0, maxScrollTop) + return clamp(page.top + page.height * anchor.fraction, 0, maxScrollTop) +} + +export class FixedLayout extends HTMLElement { + static observedAttributes = ['zoom', 'scale-factor', 'spread', 'flow'] + #root = this.attachShadow({ mode: 'open' }) + #observer = new ResizeObserver(() => this.#render()) + #spreads + #index = -1 + defaultViewport + spread + #portrait = false + #left + #right + #center + #side + #zoom + #scaleFactor = 1.0 + #totalScaleFactor = 1.0 + #scrollLocked = false + #isOverflowX = false + #isOverflowY = false + #preloadCache = new Map() + #prerenderedSpreads = new Map() + #spreadAccessTime = new Map() + #maxConcurrentPreloads = 1 + #numPrerenderedSpreads = 1 + #maxCachedSpreads = 2 + #overlayers = new Map() + #pageColors = {} + #preloadQueue = [] + #activePreloads = 0 + // Scroll mode fields + #scrollMode = false + #scrollPages = [] + #scrollObserver = null + #scrollContainer = null + #scrollLoadGen = new Map() + #scrollMaxLoaded = 8 + #scrollIdleTimer = null + #scrollCurrentIndex = -1 + #getScrollModePageMetrics() { + return this.#scrollPages.map(page => ({ + index: page.index, + top: page.el.offsetTop, + height: page.el.offsetHeight, + })) + } + #captureScrollModeAnchor() { + if (!this.#scrollPages.length) return null + const fallbackIndex = this.#scrollCurrentIndex >= 0 + ? this.#scrollCurrentIndex : this.#getScrollIndex() + return captureScrollModeAnchor( + this.#getScrollModePageMetrics(), + this.scrollTop, + fallbackIndex, + ) + } + #restoreScrollModeAnchor(anchor) { + if (!anchor || !this.#scrollPages.length) return + const maxScrollTop = Math.max(0, this.scrollHeight - this.clientHeight) + this.scrollTop = restoreScrollModeAnchor( + this.#getScrollModePageMetrics(), + anchor, + maxScrollTop, + ) + this.#scrollCurrentIndex = anchor.index + } + constructor() { + super() + + const sheet = new CSSStyleSheet() + this.#root.adoptedStyleSheets = [sheet] + sheet.replaceSync(`:host { + width: 100%; + height: 100%; + display: flex; + justify-content: flex-start; + align-items: center; + overflow: auto; + } + @supports (justify-content: safe center) { + :host { + justify-content: safe center; + } + } + :host([flow="scrolled"]) { + display: block; + overflow-y: auto; + overflow-x: hidden; + } + :host([flow="scrolled"]) .scroll-container { + display: flex; + flex-direction: column; + align-items: center; + min-height: 100%; + background-color: var(--scroll-bg-color); + background-opacity: var(--scroll-bg-opacity); + } + :host([flow="scrolled"]) .scroll-page { + position: relative; + flex-shrink: 0; + overflow: hidden; + margin: 4px 0; + } + :host([flow="scrolled"]) .scroll-page iframe { + pointer-events: none; + }`) + + this.#observer.observe(this) + } + attributeChangedCallback(name, _, value) { + switch (name) { + case 'zoom': + this.#zoom = value !== 'fit-width' && value !== 'fit-page' + ? parseFloat(value) : value + this.#render() + break + case 'scale-factor': + this.#scaleFactor = parseFloat(value) / 100 + this.#render() + break + case 'spread': + this.#respread(value) + break + case 'flow': + if (value === 'scrolled' && !this.#scrollMode) { + // Capture index from paginated mode BEFORE setting scroll flag + const savedIndex = this.index + this.#scrollMode = true + if (this.book) this.#initScrollMode(savedIndex) + } else if (value !== 'scrolled' && this.#scrollMode) { + this.#destroyScrollMode() + this.#scrollMode = false + this.#render() + } + break + } + } + async #createFrame({ index, src: srcOption, detached = false }) { + const srcOptionIsString = typeof srcOption === 'string' + const src = srcOptionIsString ? srcOption : srcOption?.src + const data = srcOptionIsString ? null : srcOption?.data + const onZoom = srcOptionIsString ? null : srcOption?.onZoom + const element = document.createElement('div') + element.setAttribute('dir', 'ltr') + element.style.position = 'relative' + const iframe = document.createElement('iframe') + element.append(iframe) + Object.assign(iframe.style, { + border: '0', + display: 'none', + overflow: 'hidden', + }) + // `allow-scripts` is needed for events because of WebKit bug + // https://bugs.webkit.org/show_bug.cgi?id=218086 + iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts') + iframe.setAttribute('scrolling', 'no') + iframe.setAttribute('part', 'filter') + this.#root.append(element) + + if (detached) { + Object.assign(element.style, { + position: 'absolute', + visibility: 'hidden', + pointerEvents: 'none', + }) + } + + if (!src) return { blank: true, element, iframe } + return new Promise(resolve => { + iframe.addEventListener('load', () => { + const doc = iframe.contentDocument + iframe.dataset.sectionIndex = index + this.dispatchEvent(new CustomEvent('load', { detail: { doc, index } })) + const { width, height } = getViewport(doc, this.defaultViewport) + resolve({ + element, iframe, + width: parseFloat(width), + height: parseFloat(height), + onZoom, + detached, + }) + }, { once: true }) + if (data) { + iframe.srcdoc = data + } else { + iframe.src = src + } + }) + } + #render(side = this.#side) { + if (this.#scrollMode) { + this.#renderScrollMode() + return [] + } + if (!side) return [] + const left = this.#left ?? {} + const right = this.#center ?? this.#right ?? {} + const target = side === 'left' ? left : right + const { width, height } = this.getBoundingClientRect() + // for unfolded devices with slightly taller height than width also use landscape layout + const portrait = this.spread !== 'both' && this.spread !== 'portrait' + && height > width * 1.2 + this.#portrait = portrait + const blankWidth = left.width ?? right.width ?? 0 + const blankHeight = left.height ?? right.height ?? 0 + + let scale = typeof this.#zoom === 'number' && !isNaN(this.#zoom) + ? this.#zoom + : (this.#zoom === 'fit-width' + ? (portrait || this.#center + ? width / (target.width ?? blankWidth) + : width / ((left.width ?? blankWidth) + (right.width ?? blankWidth))) + : (portrait || this.#center + ? Math.min( + width / (target.width ?? blankWidth), + height / (target.height ?? blankHeight)) + : Math.min( + width / ((left.width ?? blankWidth) + (right.width ?? blankWidth)), + height / Math.max( + left.height ?? blankHeight, + right.height ?? blankHeight))) + ) || 1 + + scale *= this.#scaleFactor + this.#totalScaleFactor = scale + + const renderPromises = [] + const transform = ({frame, styles}) => { + let { element, iframe, width, height, blank, onZoom } = frame + if (!iframe) return + if (onZoom) { + const p = onZoom({ doc: frame.iframe.contentDocument, scale, pageColors: this.#pageColors }) + if (p?.then) { + // onZoom (e.g. pdf.js) may rebuild the text layer DOM, + // invalidating Range objects stored in the overlayer. After + // the rebuild, re-emit create-overlayer so listeners can + // re-anchor annotations against the fresh DOM. + const refreshed = p.then(() => this.#refreshOverlayerForFrame(frame)) + renderPromises.push(refreshed) + } + } + const iframeScale = onZoom ? scale : 1 + const zoomedOut = this.#scaleFactor < 1.0 + Object.assign(iframe.style, { + width: `${width * iframeScale}px`, + height: `${height * iframeScale}px`, + transform: onZoom ? 'none' : `scale(${scale})`, + transformOrigin: 'top left', + display: blank ? 'none' : 'block', + }) + Object.assign(element.style, { + width: `${(width ?? blankWidth) * scale}px`, + height: `${(height ?? blankHeight) * scale}px`, + flexShrink: '0', + display: zoomedOut ? 'flex' : 'block', + marginBlock: zoomedOut ? undefined : 'auto', + alignItems: zoomedOut ? 'center' : undefined, + justifyContent: zoomedOut ? 'center' : undefined, + ...styles, + }) + if (portrait && frame !== target) { + element.style.display = 'none' + } + + // position and redraw overlayer to match the scaled iframe + const sectionIndex = iframe.dataset.sectionIndex != null + ? parseInt(iframe.dataset.sectionIndex) : undefined + if (sectionIndex != null) { + const overlayer = this.#overlayers.get(sectionIndex) + if (overlayer) { + Object.assign(overlayer.element.style, { + position: 'absolute', + top: '0', + left: '0', + width: `${(width ?? blankWidth) * scale}px`, + height: `${(height ?? blankHeight) * scale}px`, + }) + overlayer.redraw() + } + } + + const container= element.parentNode?.host + if (!container) return + const containerWidth = container.clientWidth + const containerHeight = container.clientHeight + container.scrollLeft = (element.clientWidth - containerWidth) / 2 + + return { + width: element.clientWidth, + height: element.clientHeight, + containerWidth, + containerHeight, + } + } + if (this.#center) { + const dimensions = transform({frame: this.#center, styles: { marginInline: 'auto' }}) + if (!dimensions) return renderPromises + const {width, height, containerWidth, containerHeight} = dimensions + this.#isOverflowX = width > containerWidth + this.#isOverflowY = height > containerHeight + } else { + const leftDimensions = transform({frame: left, styles: { marginInlineStart: 'auto' }}) + const rightDimensions = transform({frame: right, styles: { marginInlineEnd: 'auto' }}) + if (!leftDimensions || !rightDimensions) return renderPromises + const {width: leftWidth, height: leftHeight, containerWidth, containerHeight} = leftDimensions + const {width: rightWidth, height: rightHeight} = rightDimensions + this.#isOverflowX = leftWidth + rightWidth > containerWidth + this.#isOverflowY = Math.max(leftHeight, rightHeight) > containerHeight + } + return renderPromises + } + async #showSpread({ left, right, center, side, spreadIndex }) { + this.#left = null + this.#right = null + this.#center = null + + const cacheKey = spreadIndex !== undefined ? `spread-${spreadIndex}` : null + const prerendered = cacheKey ? this.#prerenderedSpreads.get(cacheKey) : null + + if (prerendered) { + this.#spreadAccessTime.set(cacheKey, Date.now()) + if (prerendered.center) { + this.#center = prerendered.center + } else { + this.#left = prerendered.left + this.#right = prerendered.right + } + } else { + if (center) { + this.#center = await this.#createFrame(center) + if (cacheKey) { + this.#prerenderedSpreads.set(cacheKey, { center: this.#center }) + this.#spreadAccessTime.set(cacheKey, Date.now()) + } + } else { + this.#left = await this.#createFrame(left) + this.#right = await this.#createFrame(right) + if (cacheKey) { + this.#prerenderedSpreads.set(cacheKey, { left: this.#left, right: this.#right }) + this.#spreadAccessTime.set(cacheKey, Date.now()) + } + } + } + + this.#side = center ? 'center' : this.#left?.blank ? 'right' + : this.#right?.blank ? 'left' : side + const visibleFrames = center + ? [this.#center?.element] + : [this.#left?.element, this.#right?.element] + + Array.from(this.#root.children).forEach(child => { + const isVisible = visibleFrames.includes(child) + Object.assign(child.style, { + position: isVisible ? 'relative' : 'absolute', + visibility: isVisible ? 'visible' : 'hidden', + pointerEvents: isVisible ? 'auto' : 'none', + }) + }) + + // Render layout and await any async onZoom callbacks (e.g. PDF text + // layer rendering) so the document is fully populated before overlayers + // try to resolve CFIs against it. + const renderPromises = this.#render() + if (renderPromises.length) await Promise.all(renderPromises) + + const showingFrames = center + ? [this.#center] + : [this.#left, this.#right] + for (const frame of showingFrames) { + if (!frame?.iframe) continue + const index = frame.iframe.dataset.sectionIndex != null + ? parseInt(frame.iframe.dataset.sectionIndex) : undefined + if (index != null && !this.#overlayers.has(index)) { + const doc = frame.iframe.contentDocument + if (doc) { + this.dispatchEvent(new CustomEvent('create-overlayer', { + detail: { + doc, index, + attach: overlayer => { + this.#overlayers.set(index, overlayer) + frame.element.append(overlayer.element) + }, + }, + })) + } + } + } + } + #initScrollMode(targetIndex = 0) { + const currentIndex = targetIndex + + // Hide all paginated content + for (const child of Array.from(this.#root.children)) { + child.style.display = 'none' + } + + this.#scrollContainer = document.createElement('div') + this.#scrollContainer.className = 'scroll-container' + this.#root.append(this.#scrollContainer) + + const sections = this.book.sections + const viewport = this.defaultViewport + const vw = viewport?.width ?? 1000 + const vh = viewport?.height ?? 1400 + this.#scrollPages = sections.map((section, i) => { + const el = document.createElement('div') + el.className = 'scroll-page' + el.dataset.index = i + this.#scrollContainer.append(el) + return { el, index: i, section, state: 'idle', frame: null, vpWidth: vw, vpHeight: vh } + }) + + this.#renderScrollMode() + + // Scroll to target position BEFORE setting up the observer + // so only pages near the target are observed as intersecting + if (currentIndex >= 0 && currentIndex < this.#scrollPages.length) { + this.#scrollPages[currentIndex].el.scrollIntoView() + this.#scrollCurrentIndex = currentIndex + } + + this.addEventListener('scroll', this.#handleScrollEvent) + + // Set up IntersectionObserver after scroll position is established. + // rootMargin '50%' loads ~1 page buffer above/below the viewport. + this.#scrollObserver = new IntersectionObserver(entries => { + for (const entry of entries) { + if (!entry.isIntersecting) continue + const index = parseInt(entry.target.dataset.index) + const pageData = this.#scrollPages[index] + if (pageData && pageData.state === 'idle') { + this.#loadScrollPage(pageData) + } + } + this.#evictScrollPages() + }, { root: this, rootMargin: '50% 0px' }) + + for (const page of this.#scrollPages) { + this.#scrollObserver.observe(page.el) + } + } + #handleScrollEvent = () => { + // Disable iframe interaction during scroll for native smooth scrolling + this.#setScrollIframeInteraction(false) + if (this.#scrollIdleTimer) clearTimeout(this.#scrollIdleTimer) + this.#scrollIdleTimer = setTimeout(() => { + this.#setScrollIframeInteraction(true) + // Report location only after scroll settles to avoid + // expensive React re-renders on every frame + this.#reportScrollLocation() + }, 150) + } + #setScrollIframeInteraction(enabled) { + const value = enabled ? 'auto' : '' + for (const page of this.#scrollPages) { + if (page.frame?.iframe) { + page.frame.iframe.style.pointerEvents = value + } + } + } + #destroyScrollMode() { + // Use the cached scroll index because by the time attributeChangedCallback + // fires, the CSS has already switched from block/scroll to flex layout, + // making #getScrollIndex() return incorrect positions + const currentIndex = this.#scrollCurrentIndex >= 0 + ? this.#scrollCurrentIndex : this.#getScrollIndex() + this.removeEventListener('scroll', this.#handleScrollEvent) + if (this.#scrollObserver) { + this.#scrollObserver.disconnect() + this.#scrollObserver = null + } + if (this.#scrollIdleTimer) { + clearTimeout(this.#scrollIdleTimer) + this.#scrollIdleTimer = null + } + // Clean up all scroll page frames and overlayers + for (const page of this.#scrollPages) { + this.#teardownScrollPage(page) + } + this.#scrollPages = [] + this.#scrollLoadGen.clear() + this.#scrollCurrentIndex = -1 + if (this.#scrollContainer) { + this.#scrollContainer.remove() + this.#scrollContainer = null + } + + // Reset scroll position left over from scroll mode + this.scrollTop = 0 + this.scrollLeft = 0 + + // Restore paginated content + for (const child of Array.from(this.#root.children)) { + child.style.display = '' + } + + // Navigate to the page we were on + if (currentIndex >= 0) { + const section = this.book.sections[currentIndex] + if (section) { + const spread = this.getSpreadOf(section) + if (spread) { + this.#index = -1 + this.goToSpread(spread.index, spread.side, 'page') + } + } + } + } + // Create an iframe directly inside the page placeholder (no reparenting) + async #createScrollFrame(pageData, srcOption) { + const srcOptionIsString = typeof srcOption === 'string' + const src = srcOptionIsString ? srcOption : srcOption?.src + const data = srcOptionIsString ? null : srcOption?.data + const onZoom = srcOptionIsString ? null : srcOption?.onZoom + + const element = document.createElement('div') + element.setAttribute('dir', 'ltr') + element.style.position = 'relative' + const iframe = document.createElement('iframe') + element.append(iframe) + Object.assign(iframe.style, { + border: '0', + display: 'none', + overflow: 'hidden', + }) + iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts') + iframe.setAttribute('scrolling', 'no') + iframe.setAttribute('part', 'filter') + // Place directly in the placeholder — no root append + reparent + pageData.el.append(element) + + if (!src) return { blank: true, element, iframe } + return new Promise(resolve => { + iframe.addEventListener('load', () => { + const doc = iframe.contentDocument + iframe.dataset.sectionIndex = pageData.index + this.dispatchEvent(new CustomEvent('load', { detail: { doc, index: pageData.index } })) + const { width, height } = getViewport(doc, this.defaultViewport) + resolve({ + element, iframe, + width: parseFloat(width), + height: parseFloat(height), + onZoom, + }) + }, { once: true }) + if (data) { + iframe.srcdoc = data + } else { + iframe.src = src + } + }) + } + async #loadScrollPage(pageData) { + if (pageData.state !== 'idle') return + pageData.state = 'loading' + + // Generation counter to detect stale loads + const gen = (this.#scrollLoadGen.get(pageData.index) || 0) + 1 + this.#scrollLoadGen.set(pageData.index, gen) + + try { + const src = await pageData.section.load?.() + // Bail if cancelled or mode changed + if (this.#scrollLoadGen.get(pageData.index) !== gen || !this.#scrollMode) { + pageData.state = 'idle' + return + } + if (!src) { pageData.state = 'idle'; return } + + const frame = await this.#createScrollFrame(pageData, src) + // Bail if cancelled during frame creation + if (this.#scrollLoadGen.get(pageData.index) !== gen || !this.#scrollMode) { + frame.element?.remove() + pageData.state = 'idle' + return + } + + pageData.frame = frame + pageData.state = 'loaded' + const scrollAnchor = this.#captureScrollModeAnchor() + // Update dimensions from actual page viewport + if (frame.width && frame.height) { + pageData.vpWidth = frame.width + pageData.vpHeight = frame.height + } + this.#renderScrollPage(pageData) + this.#restoreScrollModeAnchor(scrollAnchor) + + // Create overlayer + const doc = frame.iframe.contentDocument + if (doc) { + this.dispatchEvent(new CustomEvent('create-overlayer', { + detail: { + doc, index: pageData.index, + attach: overlayer => { + this.#overlayers.set(pageData.index, overlayer) + frame.element.append(overlayer.element) + }, + }, + })) + // Forward wheel events to host when iframe has pointer-events + // (fallback for the brief window after scroll settles) + doc.addEventListener('wheel', e => { + // Disable pointer-events immediately so subsequent + // wheel ticks use native scroll + this.#setScrollIframeInteraction(false) + this.scrollBy({ top: e.deltaY, left: e.deltaX, behavior: 'instant' }) + }, { passive: true }) + } + } catch (e) { + console.warn('Failed to load scroll page', pageData.index, e) + pageData.state = 'idle' + } + } + // Remove a loaded scroll page's frame and overlayer + #teardownScrollPage(pageData) { + // Bump generation to cancel any in-progress load + const gen = (this.#scrollLoadGen.get(pageData.index) || 0) + 1 + this.#scrollLoadGen.set(pageData.index, gen) + + if (pageData.frame) { + const idx = pageData.index + this.#overlayers.delete(idx) + pageData.frame.element?.remove() + } + pageData.frame = null + pageData.state = 'idle' + } + // Evict the farthest loaded pages when over limit + #evictScrollPages() { + const loaded = this.#scrollPages.filter(p => p.state === 'loaded') + if (loaded.length <= this.#scrollMaxLoaded) return + const currentIndex = this.#getScrollIndex() + loaded.sort((a, b) => + Math.abs(a.index - currentIndex) - Math.abs(b.index - currentIndex)) + for (const page of loaded.slice(this.#scrollMaxLoaded)) { + this.#teardownScrollPage(page) + } + } + #renderScrollMode() { + const { width: hostWidth } = this.getBoundingClientRect() + if (!hostWidth) return + const scrollAnchor = this.#captureScrollModeAnchor() + for (const page of this.#scrollPages) { + const scale = (hostWidth / page.vpWidth) * this.#scaleFactor + page.el.style.width = `${page.vpWidth * scale}px` + page.el.style.height = `${page.vpHeight * scale}px` + if (page.state === 'loaded' && page.frame) { + this.#renderScrollPage(page) + } + } + this.#restoreScrollModeAnchor(scrollAnchor) + } + #renderScrollPage(pageData) { + const { width: hostWidth } = this.getBoundingClientRect() + if (!hostWidth || !pageData.frame) return + const { vpWidth: vw, vpHeight: vh, frame } = pageData + const scale = (hostWidth / vw) * this.#scaleFactor + + if (frame.onZoom) { + frame.onZoom({ doc: frame.iframe.contentDocument, scale, pageColors: this.#pageColors }) + Object.assign(frame.iframe.style, { + width: `${vw * scale}px`, + height: `${vh * scale}px`, + transform: 'none', + display: 'block', + }) + } else { + Object.assign(frame.iframe.style, { + width: `${vw}px`, + height: `${vh}px`, + transform: `scale(${scale})`, + transformOrigin: 'top left', + display: 'block', + }) + } + Object.assign(frame.element.style, { + width: `${vw * scale}px`, + height: `${vh * scale}px`, + }) + // Update placeholder to match actual page dimensions + pageData.el.style.width = `${vw * scale}px` + pageData.el.style.height = `${vh * scale}px` + + const overlayer = this.#overlayers.get(pageData.index) + if (overlayer) { + Object.assign(overlayer.element.style, { + position: 'absolute', + top: '0', + left: '0', + width: `${vw * scale}px`, + height: `${vh * scale}px`, + }) + overlayer.redraw() + } + } + #getScrollIndex() { + if (!this.#scrollPages.length) return -1 + const hostRect = this.getBoundingClientRect() + const midY = hostRect.top + hostRect.height / 2 + for (const page of this.#scrollPages) { + const rect = page.el.getBoundingClientRect() + if (rect.top <= midY && rect.bottom >= midY) return page.index + } + let closest = 0, minDist = Infinity + for (const page of this.#scrollPages) { + const rect = page.el.getBoundingClientRect() + const dist = Math.abs(rect.top + rect.height / 2 - midY) + if (dist < minDist) { minDist = dist; closest = page.index } + } + return closest + } + #reportScrollLocation() { + const index = this.#getScrollIndex() + if (index < 0) return + this.#scrollCurrentIndex = index + this.dispatchEvent(new CustomEvent('relocate', { detail: + { reason: 'scroll', range: null, index, fraction: 0, size: 1 } })) + } + #goLeft() { + if (this.#center || this.#left?.blank) return + if (this.#portrait && this.#left?.element?.style?.display === 'none') { + this.#side = 'left' + this.#render() + this.#reportLocation('page') + return true + } + } + #goRight() { + if (this.#center || this.#right?.blank) return + if (this.#portrait && this.#right?.element?.style?.display === 'none') { + this.#side = 'right' + this.#render() + this.#reportLocation('page') + return true + } + } + open(book) { + this.book = book + this.defaultViewport = book.rendition?.viewport + this.rtl = book.dir === 'rtl' + + this.#spread() + if (this.#scrollMode) this.#initScrollMode() + } + #spread(mode) { + const book = this.book + const { rendition } = book + const rtl = this.rtl + const ltr = !rtl + this.spread = mode || rendition?.spread + + if (this.spread === 'none') + this.#spreads = book.sections.map(section => ({ center: section })) + else this.#spreads = book.sections.reduce((arr, section, i) => { + const last = arr[arr.length - 1] + const { pageSpread } = section + const newSpread = () => { + const spread = {} + arr.push(spread) + return spread + } + if (pageSpread === 'center') { + const spread = last.left || last.right ? newSpread() : last + spread.center = section + } + else if (pageSpread === 'left') { + const spread = last.center || last.left || ltr && i ? newSpread() : last + spread.left = section + } + else if (pageSpread === 'right') { + const spread = last.center || last.right || rtl && i ? newSpread() : last + spread.right = section + } + else if (ltr) { + if (last.center || last.right) newSpread().left = section + else if (last.left || !i) last.right = section + else last.left = section + } + else { + if (last.center || last.left) newSpread().right = section + else if (last.right || !i) last.left = section + else last.right = section + } + return arr + }, [{}]) + } + #respread(spreadMode) { + if (this.#index === -1) return + const section = this.book.sections[this.index] + this.#spread(spreadMode) + const { index } = this.getSpreadOf(section) + this.#index = -1 + this.#preloadCache.clear() + for (const frames of this.#prerenderedSpreads.values()) { + if (frames.center) { + frames.center.element?.remove() + } else { + frames.left?.element?.remove() + frames.right?.element?.remove() + } + } + this.#prerenderedSpreads.clear() + this.#spreadAccessTime.clear() + this.#overlayers.clear() + this.goToSpread(index, this.rtl ? 'right' : 'left', 'page') + } + get index() { + if (this.#scrollMode) return this.#scrollCurrentIndex >= 0 + ? this.#scrollCurrentIndex : this.#getScrollIndex() + if (this.#index < 0 || !this.#spreads) return -1 + const spread = this.#spreads[this.#index] + if (!spread) return -1 + const section = spread.center ?? (this.#side === 'left' + ? spread.left ?? spread.right : spread.right ?? spread.left) + return this.book.sections.indexOf(section) + } + get pageColors() { + return this.#pageColors + } + set pageColors(value) { + this.#pageColors = value + this.#render() + } + get scrolled() { + return this.#scrollMode + } + get scrollLocked() { + return this.#scrollLocked + } + set scrollLocked(value) { + this.#scrollLocked = value + } + get isOverflowX() { + return this.#isOverflowX + } + get isOverflowY() { + return this.#isOverflowY + } + get atStart() { + if (this.#scrollMode) return this.scrollTop <= 0 + return this.#index <= 0 + } + get atEnd() { + if (this.#scrollMode) return this.scrollTop + this.clientHeight >= this.scrollHeight - 2 + return this.#index >= this.#spreads.length - 1 + } + #reportLocation(reason) { + this.dispatchEvent(new CustomEvent('relocate', { detail: + { reason, range: null, index: this.index, fraction: 0, size: 1 } })) + } + getSpreadOf(section) { + const spreads = this.#spreads + for (let index = 0; index < spreads.length; index++) { + const { left, right, center } = spreads[index] + if (left === section) return { index, side: 'left' } + if (right === section) return { index, side: 'right' } + if (center === section) return { index, side: 'center' } + } + } + async goToSpread(index, side, reason) { + if (index < 0 || index > this.#spreads.length - 1) return + if (index === this.#index) { + this.#render(side) + return + } + this.#index = index + const spread = this.#spreads[index] + const cacheKey = `spread-${index}` + const cached = this.#preloadCache.get(cacheKey) + if (cached && cached !== 'loading') { + if (cached.center) { + const sectionIndex = this.book.sections.indexOf(spread.center) + await this.#showSpread({ center: { index: sectionIndex, src: cached.center }, spreadIndex: index, side }) + } else { + const indexL = this.book.sections.indexOf(spread.left) + const indexR = this.book.sections.indexOf(spread.right) + const left = { index: indexL, src: cached.left } + const right = { index: indexR, src: cached.right } + await this.#showSpread({ left, right, side, spreadIndex: index }) + } + } else { + if (spread.center) { + const sectionIndex = this.book.sections.indexOf(spread.center) + const src = await spread.center?.load?.() + await this.#showSpread({ center: { index: sectionIndex, src }, spreadIndex: index, side }) + } else { + const indexL = this.book.sections.indexOf(spread.left) + const indexR = this.book.sections.indexOf(spread.right) + const srcL = await spread.left?.load?.() + const srcR = await spread.right?.load?.() + const left = { index: indexL, src: srcL } + const right = { index: indexR, src: srcR } + await this.#showSpread({ left, right, side, spreadIndex: index }) + } + } + + this.#reportLocation(reason) + this.#preloadNextSpreads() + } + #preloadNextSpreads() { + this.#cleanupPreloadCache() + + if (this.#numPrerenderedSpreads <= 0) return + + const toPreload = [] + const forwardPreloadCount = Math.max(1, this.#numPrerenderedSpreads - 1) + const backwardPreloadCount = Math.max(0, this.#numPrerenderedSpreads - forwardPreloadCount) + for (let distance = 1; distance <= forwardPreloadCount; distance++) { + const forwardIndex = this.#index + distance + if (forwardIndex >= 0 && forwardIndex < this.#spreads.length) { + toPreload.push({ index: forwardIndex, direction: 'forward', distance }) + } + } + for (let distance = 1; distance <= backwardPreloadCount; distance++) { + const backwardIndex = this.#index - distance + if (backwardIndex >= 0 && backwardIndex < this.#spreads.length) { + toPreload.push({ index: backwardIndex, direction: 'backward', distance }) + } + } + for (const { index: targetIndex, direction } of toPreload) { + const cacheKey = `spread-${targetIndex}` + if (this.#prerenderedSpreads.has(cacheKey)) continue + const spread = this.#spreads[targetIndex] + if (!spread) continue + this.#preloadQueue.push({ targetIndex, direction, spread, cacheKey }) + } + + this.#processPreloadQueue() + } + + async #processPreloadQueue() { + while (this.#preloadQueue.length > 0 && this.#activePreloads < this.#maxConcurrentPreloads) { + const task = this.#preloadQueue.shift() + if (!task) break + + const { spread, cacheKey } = task + this.#preloadCache.set(cacheKey, 'loading') + this.#activePreloads++ + Promise.resolve().then(async () => { + try { + if (spread.center) { + const src = await spread.center?.load?.() + this.#preloadCache.set(cacheKey, { center: src }) + + const sectionIndex = this.book.sections.indexOf(spread.center) + const frame = await this.#createFrame({ index: sectionIndex, src, detached: true }) + + this.#prerenderedSpreads.set(cacheKey, { center: frame }) + this.#spreadAccessTime.set(cacheKey, Date.now()) + if (frame.onZoom) { + const doc = frame.iframe.contentDocument + frame.onZoom({ doc, scale: this.#totalScaleFactor, pageColors: this.#pageColors }) + } + } else { + const srcL = await spread.left?.load?.() + const srcR = await spread.right?.load?.() + this.#preloadCache.set(cacheKey, { left: srcL, right: srcR }) + + const indexL = this.book.sections.indexOf(spread.left) + const indexR = this.book.sections.indexOf(spread.right) + const leftFrame = await this.#createFrame({ index: indexL, src: srcL, detached: true }) + const rightFrame = await this.#createFrame({ index: indexR, src: srcR, detached: true }) + + this.#prerenderedSpreads.set(cacheKey, { left: leftFrame, right: rightFrame }) + this.#spreadAccessTime.set(cacheKey, Date.now()) + + if (leftFrame.onZoom) { + const docL = leftFrame.iframe.contentDocument + leftFrame.onZoom({ doc: docL, scale: this.#totalScaleFactor, pageColors: this.#pageColors }) + } + if (rightFrame.onZoom) { + const docR = rightFrame.iframe.contentDocument + rightFrame.onZoom({ doc: docR, scale: this.#totalScaleFactor, pageColors: this.#pageColors }) + } + } + } catch { + this.#preloadCache.delete(cacheKey) + this.#prerenderedSpreads.delete(cacheKey) + } finally { + this.#activePreloads-- + this.#processPreloadQueue() + } + }) + } + } + #cleanupPreloadCache() { + const maxSpreads = this.#maxCachedSpreads + if (this.#prerenderedSpreads.size <= maxSpreads) { + return + } + + const framesByAge = Array.from(this.#prerenderedSpreads.keys()) + .map(key => ({ + key, + accessTime: this.#spreadAccessTime.get(key) || 0, + })) + .sort((a, b) => a.accessTime - b.accessTime) + + const numToRemove = this.#prerenderedSpreads.size - maxSpreads + const framesToDelete = framesByAge.slice(0, numToRemove).map(item => item.key) + + if (framesToDelete.length > 0) { + framesToDelete.forEach(key => { + const frames = this.#prerenderedSpreads.get(key) + if (frames) { + if (frames.center) { + this.#removeOverlayerForFrame(frames.center) + frames.center.element?.remove() + } else { + this.#removeOverlayerForFrame(frames.left) + this.#removeOverlayerForFrame(frames.right) + frames.left?.element?.remove() + frames.right?.element?.remove() + } + } + + this.#prerenderedSpreads.delete(key) + this.#spreadAccessTime.delete(key) + this.#preloadCache.delete(key) + }) + } + } + #removeOverlayerForFrame(frame) { + if (!frame?.iframe) return + const idx = frame.iframe.dataset.sectionIndex != null + ? parseInt(frame.iframe.dataset.sectionIndex) : undefined + if (idx != null) this.#overlayers.delete(idx) + } + // Drop a frame's overlayer and re-emit create-overlayer so listeners can + // re-add annotations. Called after a text layer rebuild (e.g. pdf.js + // onZoom) which invalidates Range objects stored in the overlayer. + #refreshOverlayerForFrame(frame) { + if (!frame?.iframe) return + const index = frame.iframe.dataset.sectionIndex != null + ? parseInt(frame.iframe.dataset.sectionIndex) : undefined + if (index == null) return + const stale = this.#overlayers.get(index) + if (!stale) return + // Only refresh for frames currently visible; hidden frames keep their + // overlayer untouched until they are shown again. + const isVisible = frame.element?.parentNode + && frame.element.style.visibility !== 'hidden' + if (!isVisible) return + stale.element?.remove() + this.#overlayers.delete(index) + const doc = frame.iframe.contentDocument + if (!doc) return + this.dispatchEvent(new CustomEvent('create-overlayer', { + detail: { + doc, index, + attach: overlayer => { + this.#overlayers.set(index, overlayer) + frame.element.append(overlayer.element) + }, + }, + })) + } + async select(target) { + await this.goTo(target) + // TODO + } + async goTo(target) { + const resolved = await target + if (this.#scrollMode) { + const page = this.#scrollPages[resolved.index] + if (page) { + page.el.scrollIntoView() + this.#scrollCurrentIndex = resolved.index + } + return + } + const { book } = this + const section = book.sections[resolved.index] + if (!section) return + const { index, side } = this.getSpreadOf(section) + await this.goToSpread(index, side) + } + async next(distance) { + if (this.#scrollMode) { + this.scrollBy({ top: distance || this.clientHeight, behavior: 'smooth' }) + return + } + const s = this.rtl ? this.#goLeft() : this.#goRight() + if (!s) return this.goToSpread(this.#index + 1, this.rtl ? 'right' : 'left', 'page') + } + async prev(distance) { + if (this.#scrollMode) { + this.scrollBy({ top: -(distance || this.clientHeight), behavior: 'smooth' }) + return + } + const s = this.rtl ? this.#goRight() : this.#goLeft() + if (!s) return this.goToSpread(this.#index - 1, this.rtl ? 'left' : 'right', 'page') + } + nextSection() { + if (!this.#scrollMode) return + const currentIndex = this.#getScrollIndex() + const nextIndex = Math.min(currentIndex + 1, this.#scrollPages.length - 1) + this.#scrollPages[nextIndex]?.el.scrollIntoView({ behavior: 'smooth' }) + this.#scrollCurrentIndex = nextIndex + } + prevSection() { + if (!this.#scrollMode) return + const currentIndex = this.#getScrollIndex() + const prevIndex = Math.max(currentIndex - 1, 0) + this.#scrollPages[prevIndex]?.el.scrollIntoView({ behavior: 'smooth' }) + this.#scrollCurrentIndex = prevIndex + } + async pan(dx, dy) { + if (this.#scrollMode) { + this.scrollBy({ top: dy, left: dx, behavior: 'auto' }) + return + } + if (this.#scrollLocked) return + this.#scrollLocked = true + + const transform = frame => { + let { element, iframe } = frame + if (!iframe || !element) return + + const scrollableContainer = element.parentNode.host + scrollableContainer.scrollLeft += dx + scrollableContainer.scrollTop += dy + } + + transform(this.#center ?? this.#right ?? {}) + this.#scrollLocked = false + } + getContents() { + if (this.#scrollMode) { + return this.#scrollPages + .filter(p => p.state === 'loaded' && p.frame?.iframe) + .map(p => ({ + doc: p.frame.iframe.contentDocument, + index: p.index, + overlayer: this.#overlayers.get(p.index), + })) + } + return Array.from(this.#root.querySelectorAll('iframe')) + .filter(frame => { + const parent = frame.parentElement + return parent && parent.style.visibility !== 'hidden' + }) + .map(frame => { + const index = frame.dataset.sectionIndex != null + ? parseInt(frame.dataset.sectionIndex) : undefined + return { + doc: frame.contentDocument, + index, + overlayer: index != null ? this.#overlayers.get(index) : undefined, + } + }) + } + pinchZoom(ratio) { + const frames = this.#center + ? [this.#center] + : [this.#left, this.#right] + for (const frame of frames) { + if (!frame?.element || frame.element.style.visibility === 'hidden') continue + frame.element.style.transform = `scale(${ratio})` + frame.element.style.transformOrigin = 'center' + } + } + pinchEnd() { + for (const frame of [this.#center, this.#left, this.#right]) { + if (!frame?.element) continue + frame.element.style.removeProperty('transform') + frame.element.style.removeProperty('transform-origin') + } + } + get size() { + return this.clientHeight + } + get viewSize() { + return this.#scrollMode ? this.scrollHeight : this.clientHeight + } + get start() { + return this.#scrollMode ? this.scrollTop : 0 + } + get end() { + return this.#scrollMode ? this.scrollTop + this.clientHeight : this.clientHeight + } + get page() { + if (this.#scrollMode) return this.#scrollCurrentIndex >= 0 + ? this.#scrollCurrentIndex : this.#getScrollIndex() + return this.#index + } + get pages() { + if (this.#scrollMode) return this.#scrollPages.length + return this.#spreads?.length ?? 0 + } + get containerPosition() { + return 0 + } + get sideProp() { + return this.#scrollMode ? 'height' : 'width' + } + destroy() { + this.#observer.unobserve(this) + if (this.#scrollMode) { + this.removeEventListener('scroll', this.#handleScrollEvent) + if (this.#scrollObserver) { + this.#scrollObserver.disconnect() + this.#scrollObserver = null + } + if (this.#scrollIdleTimer) { + clearTimeout(this.#scrollIdleTimer) + this.#scrollIdleTimer = null + } + for (const page of this.#scrollPages) { + this.#teardownScrollPage(page) + } + this.#scrollPages = [] + this.#scrollLoadGen.clear() + if (this.#scrollContainer) { + this.#scrollContainer.remove() + this.#scrollContainer = null + } + } + for (const frames of this.#prerenderedSpreads.values()) { + if (frames.center) { + frames.center.element?.remove() + } else { + frames.left?.element?.remove() + frames.right?.element?.remove() + } + } + this.#prerenderedSpreads.clear() + this.#preloadCache.clear() + this.#spreadAccessTime.clear() + this.#overlayers.clear() + } +} + +customElements.define('foliate-fxl', FixedLayout) diff --git a/web/vendor/foliate-js/footnotes.js b/web/vendor/foliate-js/footnotes.js new file mode 100644 index 00000000..836e3601 --- /dev/null +++ b/web/vendor/foliate-js/footnotes.js @@ -0,0 +1,152 @@ +const getTypes = el => new Set([ + ...(el?.getAttributeNS?.('http://www.idpf.org/2007/ops', 'type')?.split(' ') ?? []), + ...(el?.attributes?.getNamedItem?.('epub:type')?.value?.split(' ') ?? []), +]) +const getRoles = el => new Set(el?.getAttribute?.('role')?.split(' ')) + +const isSuper = el => { + if (el.matches('sup')) return true + const { verticalAlign } = getComputedStyle(el) + return verticalAlign === 'super' + || verticalAlign === 'top' + || verticalAlign === 'text-top' + || /^\d/.test(verticalAlign) +} + +const refTypes = ['biblioref', 'glossref', 'noteref'] +const refRoles = ['doc-biblioref', 'doc-glossref', 'doc-noteref'] +const isFootnoteReference = a => { + const types = getTypes(a) + const roles = getRoles(a) + return { + yes: refRoles.some(r => roles.has(r)) || refTypes.some(t => types.has(t)), + maybe: () => !types.has('backlink') && !roles.has('doc-backlink') + && (isSuper(a) || a.children.length === 1 && isSuper(a.children[0]) + || isSuper(a.parentElement)), + } +} + +const getReferencedType = el => { + const types = getTypes(el) + const roles = getRoles(el) + return roles.has('doc-biblioentry') || types.has('biblioentry') ? 'biblioentry' + : roles.has('definition') || types.has('glossdef') ? 'definition' + : roles.has('doc-endnote') || types.has('endnote') || types.has('rearnote') ? 'endnote' + : roles.has('doc-footnote') || types.has('footnote') ? 'footnote' + : roles.has('note') || types.has('note') ? 'note' : null +} + +const isInline = 'a, span, sup, sub, em, strong, i, b, small, big' +const extractFootnote = (doc, anchor) => { + let el = anchor(doc) + const target = el + while (el.matches(isInline)) { + const parent = el.parentElement + if (!parent) break + el = parent + } + if (el === doc.body) { + const sibling = target.nextElementSibling + if (sibling && !sibling.matches(isInline)) return sibling + throw new Error('Failed to extract footnote') + } + return el +} + +export class FootnoteHandler extends EventTarget { + detectFootnotes = true + #showFragment(book, { index, anchor, check }, href) { + const view = document.createElement('foliate-view') + return new Promise((resolve, reject) => { + view.addEventListener('load', e => { + try { + const { doc } = e.detail + const el = anchor(doc) + const type = getReferencedType(el) + const hidden = el?.matches?.('aside') && type === 'footnote' + if (el) { + let range + if (el.startContainer) { + range = el + } else if (el.matches('li, aside')) { + range = doc.createRange() + range.selectNodeContents(el) + } else if (el.matches('dt')) { + range = doc.createRange() + range.setStartBefore(el) + let sibling = el.nextElementSibling + let lastDD = null + while (sibling && sibling.matches('dd')) { + lastDD = sibling + sibling = sibling.nextElementSibling + } + range.setEndAfter(lastDD || el) + } else if (el.closest('li')) { + range = doc.createRange() + range.selectNodeContents(el.closest('li')) + } else if (el.closest('.note')) { + range = doc.createRange() + range.selectNodeContents(el.closest('.note')) + } else if (el.querySelector('a')) { + range = doc.createRange() + range.setStartBefore(el) + let next = el.nextElementSibling + while (next) { + if (next.querySelector('a')) break + next = next.nextElementSibling + } + if (next) { + range.setEndBefore(next) + } else { + range.setEndAfter(el.parentNode.lastChild) + } + if (check && el.children.length > 3) { + reject(new Error('Failed to locate footnote content')) + return + } + } else if (check) { + reject(new Error('Failed to locate footnote content')) + return + } else { + range = doc.createRange() + const hasContent = el.textContent?.trim() || el.children.length > 0 + if (!hasContent && el.parentElement) { + range.selectNodeContents(el.parentElement) + } else { + range.selectNode(el) + } + } + const frag = range.extractContents() + doc.body.replaceChildren() + doc.body.appendChild(frag) + } + const detail = { view, href, type, hidden, target: el } + this.dispatchEvent(new CustomEvent('render', { detail })) + resolve() + } catch (e) { + reject(e) + } + }) + view.open(book) + .then(() => this.dispatchEvent(new CustomEvent('before-render', { detail: { view } }))) + .then(() => view.goTo(index)) + .catch(reject) + }) + } + handle(book, e) { + const { a, href, follow, check } = e.detail + const { yes, maybe } = isFootnoteReference(a) + if (yes || follow) { + e.preventDefault() + return Promise.resolve(book.resolveHref(href)).then(target => + this.#showFragment(book, target, href)) + } + else if (this.detectFootnotes && (maybe() || check)) { + e.preventDefault() + return Promise.resolve(book.resolveHref(href)).then(({ index, anchor }) => { + const target = { index, anchor: doc => extractFootnote(doc, anchor), check } + return this.#showFragment(book, target, href) + }) + } + } +} diff --git a/web/vendor/foliate-js/mobi.js b/web/vendor/foliate-js/mobi.js new file mode 100644 index 00000000..99ceb36f --- /dev/null +++ b/web/vendor/foliate-js/mobi.js @@ -0,0 +1,1242 @@ +const unescapeHTML = str => { + if (!str) return '' + const textarea = document.createElement('textarea') + textarea.innerHTML = str + return textarea.value +} + +const MIME = { + XML: 'application/xml', + XHTML: 'application/xhtml+xml', + HTML: 'text/html', + CSS: 'text/css', + SVG: 'image/svg+xml', +} + +const PDB_HEADER = { + name: [0, 32, 'string'], + type: [60, 4, 'string'], + creator: [64, 4, 'string'], + numRecords: [76, 2, 'uint'], +} + +const PALMDOC_HEADER = { + compression: [0, 2, 'uint'], + numTextRecords: [8, 2, 'uint'], + recordSize: [10, 2, 'uint'], + encryption: [12, 2, 'uint'], +} + +const MOBI_HEADER = { + magic: [16, 4, 'string'], + length: [20, 4, 'uint'], + type: [24, 4, 'uint'], + encoding: [28, 4, 'uint'], + uid: [32, 4, 'uint'], + version: [36, 4, 'uint'], + titleOffset: [84, 4, 'uint'], + titleLength: [88, 4, 'uint'], + localeRegion: [94, 1, 'uint'], + localeLanguage: [95, 1, 'uint'], + resourceStart: [108, 4, 'uint'], + huffcdic: [112, 4, 'uint'], + numHuffcdic: [116, 4, 'uint'], + exthFlag: [128, 4, 'uint'], + trailingFlags: [240, 4, 'uint'], + indx: [244, 4, 'uint'], +} + +const KF8_HEADER = { + resourceStart: [108, 4, 'uint'], + fdst: [192, 4, 'uint'], + numFdst: [196, 4, 'uint'], + frag: [248, 4, 'uint'], + skel: [252, 4, 'uint'], + guide: [260, 4, 'uint'], +} + +const EXTH_HEADER = { + magic: [0, 4, 'string'], + length: [4, 4, 'uint'], + count: [8, 4, 'uint'], +} + +const INDX_HEADER = { + magic: [0, 4, 'string'], + length: [4, 4, 'uint'], + type: [8, 4, 'uint'], + idxt: [20, 4, 'uint'], + numRecords: [24, 4, 'uint'], + encoding: [28, 4, 'uint'], + language: [32, 4, 'uint'], + total: [36, 4, 'uint'], + ordt: [40, 4, 'uint'], + ligt: [44, 4, 'uint'], + numLigt: [48, 4, 'uint'], + numCncx: [52, 4, 'uint'], +} + +const TAGX_HEADER = { + magic: [0, 4, 'string'], + length: [4, 4, 'uint'], + numControlBytes: [8, 4, 'uint'], +} + +const HUFF_HEADER = { + magic: [0, 4, 'string'], + offset1: [8, 4, 'uint'], + offset2: [12, 4, 'uint'], +} + +const CDIC_HEADER = { + magic: [0, 4, 'string'], + length: [4, 4, 'uint'], + numEntries: [8, 4, 'uint'], + codeLength: [12, 4, 'uint'], +} + +const FDST_HEADER = { + magic: [0, 4, 'string'], + numEntries: [8, 4, 'uint'], +} + +const FONT_HEADER = { + flags: [8, 4, 'uint'], + dataStart: [12, 4, 'uint'], + keyLength: [16, 4, 'uint'], + keyStart: [20, 4, 'uint'], +} + +const MOBI_ENCODING = { + 1252: 'windows-1252', + 65001: 'utf-8', +} + +const EXTH_RECORD_TYPE = { + 100: ['creator', 'string', true], + 101: ['publisher'], + 103: ['description'], + 104: ['isbn'], + 105: ['subject', 'string', true], + 106: ['date'], + 108: ['contributor', 'string', true], + 109: ['rights'], + 110: ['subjectCode', 'string', true], + 112: ['source', 'string', true], + 113: ['asin'], + 121: ['boundary', 'uint'], + 122: ['fixedLayout'], + 125: ['numResources', 'uint'], + 126: ['originalResolution'], + 127: ['zeroGutter'], + 128: ['zeroMargin'], + 129: ['coverURI'], + 132: ['regionMagnification'], + 201: ['coverOffset', 'uint'], + 202: ['thumbnailOffset', 'uint'], + 503: ['title'], + 524: ['language', 'string', true], + 527: ['pageProgressionDirection'], +} + +const MOBI_LANG = { + 1: ['ar', 'ar-SA', 'ar-IQ', 'ar-EG', 'ar-LY', 'ar-DZ', 'ar-MA', 'ar-TN', 'ar-OM', + 'ar-YE', 'ar-SY', 'ar-JO', 'ar-LB', 'ar-KW', 'ar-AE', 'ar-BH', 'ar-QA'], + 2: ['bg'], 3: ['ca'], 4: ['zh', 'zh-TW', 'zh-CN', 'zh-HK', 'zh-SG'], 5: ['cs'], + 6: ['da'], 7: ['de', 'de-DE', 'de-CH', 'de-AT', 'de-LU', 'de-LI'], 8: ['el'], + 9: ['en', 'en-US', 'en-GB', 'en-AU', 'en-CA', 'en-NZ', 'en-IE', 'en-ZA', + 'en-JM', null, 'en-BZ', 'en-TT', 'en-ZW', 'en-PH'], + 10: ['es', 'es-ES', 'es-MX', null, 'es-GT', 'es-CR', 'es-PA', 'es-DO', + 'es-VE', 'es-CO', 'es-PE', 'es-AR', 'es-EC', 'es-CL', 'es-UY', 'es-PY', + 'es-BO', 'es-SV', 'es-HN', 'es-NI', 'es-PR'], + 11: ['fi'], 12: ['fr', 'fr-FR', 'fr-BE', 'fr-CA', 'fr-CH', 'fr-LU', 'fr-MC'], + 13: ['he'], 14: ['hu'], 15: ['is'], 16: ['it', 'it-IT', 'it-CH'], + 17: ['ja'], 18: ['ko'], 19: ['nl', 'nl-NL', 'nl-BE'], 20: ['no', 'nb', 'nn'], + 21: ['pl'], 22: ['pt', 'pt-BR', 'pt-PT'], 23: ['rm'], 24: ['ro'], 25: ['ru'], + 26: ['hr', null, 'sr'], 27: ['sk'], 28: ['sq'], 29: ['sv', 'sv-SE', 'sv-FI'], + 30: ['th'], 31: ['tr'], 32: ['ur'], 33: ['id'], 34: ['uk'], 35: ['be'], + 36: ['sl'], 37: ['et'], 38: ['lv'], 39: ['lt'], 41: ['fa'], 42: ['vi'], + 43: ['hy'], 44: ['az'], 45: ['eu'], 46: ['hsb'], 47: ['mk'], 48: ['st'], + 49: ['ts'], 50: ['tn'], 52: ['xh'], 53: ['zu'], 54: ['af'], 55: ['ka'], + 56: ['fo'], 57: ['hi'], 58: ['mt'], 59: ['se'], 62: ['ms'], 63: ['kk'], + 65: ['sw'], 67: ['uz', null, 'uz-UZ'], 68: ['tt'], 69: ['bn'], 70: ['pa'], + 71: ['gu'], 72: ['or'], 73: ['ta'], 74: ['te'], 75: ['kn'], 76: ['ml'], + 77: ['as'], 78: ['mr'], 79: ['sa'], 82: ['cy', 'cy-GB'], 83: ['gl', 'gl-ES'], + 87: ['kok'], 97: ['ne'], 98: ['fy'], +} + +const concatTypedArray = (a, b) => { + const result = new a.constructor(a.length + b.length) + result.set(a) + result.set(b, a.length) + return result +} +const concatTypedArray3 = (a, b, c) => { + const result = new a.constructor(a.length + b.length + c.length) + result.set(a) + result.set(b, a.length) + result.set(c, a.length + b.length) + return result +} + +const decoder = new TextDecoder() +const getString = buffer => decoder.decode(buffer) +const getUint = buffer => { + if (!buffer) return + const l = buffer.byteLength + const func = l === 4 ? 'getUint32' : l === 2 ? 'getUint16' : 'getUint8' + return new DataView(buffer)[func](0) +} +const getStruct = (def, buffer) => Object.fromEntries(Array.from(Object.entries(def)) + .map(([key, [start, len, type]]) => [key, + (type === 'string' ? getString : getUint)(buffer.slice(start, start + len))])) + +const getDecoder = x => new TextDecoder(MOBI_ENCODING[x]) + +const getVarLen = (byteArray, i = 0) => { + let value = 0, length = 0 + for (const byte of byteArray.subarray(i, i + 4)) { + value = (value << 7) | (byte & 0b111_1111) >>> 0 + length++ + if (byte & 0b1000_0000) break + } + return { value, length } +} + +// variable-length quantity, but read from the end of data +const getVarLenFromEnd = byteArray => { + let value = 0 + for (const byte of byteArray.subarray(-4)) { + // `byte & 0b1000_0000` indicates the start of value + if (byte & 0b1000_0000) value = 0 + value = (value << 7) | (byte & 0b111_1111) + } + return value +} + +const countBitsSet = x => { + let count = 0 + for (; x > 0; x = x >> 1) if ((x & 1) === 1) count++ + return count +} + +const countUnsetEnd = x => { + let count = 0 + while ((x & 1) === 0) x = x >> 1, count++ + return count +} + +const decompressPalmDOC = array => { + let output = [] + for (let i = 0; i < array.length; i++) { + const byte = array[i] + if (byte === 0) output.push(0) // uncompressed literal, just copy it + else if (byte <= 8) // copy next 1-8 bytes + for (const x of array.subarray(i + 1, (i += byte) + 1)) + output.push(x) + else if (byte <= 0b0111_1111) output.push(byte) // uncompressed literal + else if (byte <= 0b1011_1111) { + // 1st and 2nd bits are 10, meaning this is a length-distance pair + // read next byte and combine it with current byte + const bytes = (byte << 8) | array[i++ + 1] + // the 3rd to 13th bits encode distance + const distance = (bytes & 0b0011_1111_1111_1111) >>> 3 + // the last 3 bits, plus 3, is the length to copy + const length = (bytes & 0b111) + 3 + for (let j = 0; j < length; j++) + output.push(output[output.length - distance]) + } + // compressed from space plus char + else output.push(32, byte ^ 0b1000_0000) + } + return Uint8Array.from(output) +} + +const read32Bits = (byteArray, from) => { + const startByte = from >> 3 + const end = from + 32 + const endByte = end >> 3 + let bits = 0n + for (let i = startByte; i <= endByte; i++) + bits = bits << 8n | BigInt(byteArray[i] ?? 0) + return (bits >> (8n - BigInt(end & 7))) & 0xffffffffn +} + +const huffcdic = async (mobi, loadRecord) => { + const huffRecord = await loadRecord(mobi.huffcdic) + const { magic, offset1, offset2 } = getStruct(HUFF_HEADER, huffRecord) + if (magic !== 'HUFF') throw new Error('Invalid HUFF record') + + // table1 is indexed by byte value + const table1 = Array.from({ length: 256 }, (_, i) => offset1 + i * 4) + .map(offset => getUint(huffRecord.slice(offset, offset + 4))) + .map(x => [x & 0b1000_0000, x & 0b1_1111, x >>> 8]) + + // table2 is indexed by code length + const table2 = [null].concat(Array.from({ length: 32 }, (_, i) => offset2 + i * 8) + .map(offset => [ + getUint(huffRecord.slice(offset, offset + 4)), + getUint(huffRecord.slice(offset + 4, offset + 8))])) + + const dictionary = [] + for (let i = 1; i < mobi.numHuffcdic; i++) { + const record = await loadRecord(mobi.huffcdic + i) + const cdic = getStruct(CDIC_HEADER, record) + if (cdic.magic !== 'CDIC') throw new Error('Invalid CDIC record') + // `numEntries` is the total number of dictionary data across CDIC records + // so `n` here is the number of entries in *this* record + const n = Math.min(1 << cdic.codeLength, cdic.numEntries - dictionary.length) + const buffer = record.slice(cdic.length) + for (let i = 0; i < n; i++) { + const offset = getUint(buffer.slice(i * 2, i * 2 + 2)) + const x = getUint(buffer.slice(offset, offset + 2)) + const length = x & 0x7fff + const decompressed = x & 0x8000 + const value = new Uint8Array( + buffer.slice(offset + 2, offset + 2 + length)) + dictionary.push([value, decompressed]) + } + } + + const decompress = byteArray => { + let output = new Uint8Array() + const bitLength = byteArray.byteLength * 8 + for (let i = 0; i < bitLength;) { + const bits = Number(read32Bits(byteArray, i)) + let [found, codeLength, value] = table1[bits >>> 24] + if (!found) { + while (bits >>> (32 - codeLength) < table2[codeLength][0]) + codeLength += 1 + value = table2[codeLength][1] + } + if ((i += codeLength) > bitLength) break + + const code = value - (bits >>> (32 - codeLength)) + let [result, decompressed] = dictionary[code] + if (!decompressed) { + // the result is itself compressed + result = decompress(result) + // cache the result for next time + dictionary[code] = [result, true] + } + output = concatTypedArray(output, result) + } + return output + } + return decompress +} + +const getIndexData = async (indxIndex, loadRecord) => { + const indxRecord = await loadRecord(indxIndex) + const indx = getStruct(INDX_HEADER, indxRecord) + if (indx.magic !== 'INDX') throw new Error('Invalid INDX record') + const decoder = getDecoder(indx.encoding) + + const tagxBuffer = indxRecord.slice(indx.length) + const tagx = getStruct(TAGX_HEADER, tagxBuffer) + if (tagx.magic !== 'TAGX') throw new Error('Invalid TAGX section') + const numTags = (tagx.length - 12) / 4 + const tagTable = Array.from({ length: numTags }, (_, i) => + new Uint8Array(tagxBuffer.slice(12 + i * 4, 12 + i * 4 + 4))) + + const cncx = {} + let cncxRecordOffset = 0 + for (let i = 0; i < indx.numCncx; i++) { + const record = await loadRecord(indxIndex + indx.numRecords + i + 1) + const array = new Uint8Array(record) + for (let pos = 0; pos < array.byteLength;) { + const index = pos + const { value, length } = getVarLen(array, pos) + pos += length + const result = record.slice(pos, pos + value) + pos += value + cncx[cncxRecordOffset + index] = decoder.decode(result) + } + cncxRecordOffset += 0x10000 + } + + const table = [] + for (let i = 0; i < indx.numRecords; i++) { + const record = await loadRecord(indxIndex + 1 + i) + const array = new Uint8Array(record) + const indx = getStruct(INDX_HEADER, record) + if (indx.magic !== 'INDX') throw new Error('Invalid INDX record') + for (let j = 0; j < indx.numRecords; j++) { + const offsetOffset = indx.idxt + 4 + 2 * j + const offset = getUint(record.slice(offsetOffset, offsetOffset + 2)) + + const length = getUint(record.slice(offset, offset + 1)) + const name = getString(record.slice(offset + 1, offset + 1 + length)) + + const tags = [] + const startPos = offset + 1 + length + let controlByteIndex = 0 + let pos = startPos + tagx.numControlBytes + for (const [tag, numValues, mask, end] of tagTable) { + if (end & 1) { + controlByteIndex++ + continue + } + const offset = startPos + controlByteIndex + const value = getUint(record.slice(offset, offset + 1)) & mask + if (value === mask) { + if (countBitsSet(mask) > 1) { + const { value, length } = getVarLen(array, pos) + tags.push([tag, null, value, numValues]) + pos += length + } else tags.push([tag, 1, null, numValues]) + } else tags.push([tag, value >> countUnsetEnd(mask), null, numValues]) + } + + const tagMap = {} + for (const [tag, valueCount, valueBytes, numValues] of tags) { + const values = [] + if (valueCount != null) { + for (let i = 0; i < valueCount * numValues; i++) { + const { value, length } = getVarLen(array, pos) + values.push(value) + pos += length + } + } else { + let count = 0 + while (count < valueBytes) { + const { value, length } = getVarLen(array, pos) + values.push(value) + pos += length + count += length + } + } + tagMap[tag] = values + } + table.push({ name, tagMap }) + } + } + return { table, cncx } +} + +const getNCX = async (indxIndex, loadRecord) => { + const { table, cncx } = await getIndexData(indxIndex, loadRecord) + const items = table.map(({ tagMap }, index) => ({ + index, + offset: tagMap[1]?.[0], + size: tagMap[2]?.[0], + label: cncx[tagMap[3]] ?? '', + headingLevel: tagMap[4]?.[0], + pos: tagMap[6], + parent: tagMap[21]?.[0], + firstChild: tagMap[22]?.[0], + lastChild: tagMap[23]?.[0], + })) + const getChildren = item => { + if (item.firstChild == null) return item + item.children = items.filter(x => x.parent === item.index).map(getChildren) + return item + } + return items.filter(item => item.headingLevel === 0).map(getChildren) +} + +const getEXTH = (buf, encoding) => { + const { magic, count } = getStruct(EXTH_HEADER, buf) + if (magic !== 'EXTH') throw new Error('Invalid EXTH header') + const decoder = getDecoder(encoding) + const results = {} + let offset = 12 + for (let i = 0; i < count; i++) { + const type = getUint(buf.slice(offset, offset + 4)) + const length = getUint(buf.slice(offset + 4, offset + 8)) + if (type in EXTH_RECORD_TYPE) { + const [name, typ, many] = EXTH_RECORD_TYPE[type] + const data = buf.slice(offset + 8, offset + length) + const value = typ === 'uint' ? getUint(data) : decoder.decode(data) + if (many) { + results[name] ??= [] + results[name].push(value) + } else results[name] = value + } + offset += length + } + return results +} + +const getFont = async (buf, unzlib) => { + const { flags, dataStart, keyLength, keyStart } = getStruct(FONT_HEADER, buf) + const array = new Uint8Array(buf.slice(dataStart)) + // deobfuscate font + if (flags & 0b10) { + const bytes = keyLength === 16 ? 1024 : 1040 + const key = new Uint8Array(buf.slice(keyStart, keyStart + keyLength)) + const length = Math.min(bytes, array.length) + for (var i = 0; i < length; i++) array[i] = array[i] ^ key[i % key.length] + } + // decompress font + if (flags & 1) try { + return await unzlib(array) + } catch (e) { + console.warn(e) + console.warn('Failed to decompress font') + } + return array +} + +export const isMOBI = async file => { + const magic = getString(await file.slice(60, 68).arrayBuffer()) + return magic === 'BOOKMOBI'// || magic === 'TEXtREAd' +} + +class PDB { + #file + #offsets + pdb + async open(file) { + this.#file = file + const pdb = getStruct(PDB_HEADER, await file.slice(0, 78).arrayBuffer()) + this.pdb = pdb + const buffer = await file.slice(78, 78 + pdb.numRecords * 8).arrayBuffer() + // get start and end offsets for each record + this.#offsets = Array.from({ length: pdb.numRecords }, + (_, i) => getUint(buffer.slice(i * 8, i * 8 + 4))) + .map((x, i, a) => [x, a[i + 1]]) + } + loadRecord(index) { + const offsets = this.#offsets[index] + if (!offsets) throw new RangeError('Record index out of bounds') + return this.#file.slice(...offsets).arrayBuffer() + } + async loadMagic(index) { + const start = this.#offsets[index][0] + return getString(await this.#file.slice(start, start + 4).arrayBuffer()) + } +} + +export class MOBI extends PDB { + #start = 0 + #resourceStart + #decoder + #encoder + #decompress + #removeTrailingEntries + constructor({ unzlib }) { + super() + this.unzlib = unzlib + } + async open(file) { + await super.open(file) + // TODO: if (this.pdb.type === 'TEXt') + this.headers = this.#getHeaders(await super.loadRecord(0)) + this.#resourceStart = this.headers.mobi.resourceStart + let isKF8 = this.headers.mobi.version >= 8 + if (!isKF8) { + const boundary = this.headers.exth?.boundary + if (boundary < 0xffffffff) try { + // it's a "combo" MOBI/KF8 file; try to open the KF8 part + this.headers = this.#getHeaders(await super.loadRecord(boundary)) + this.#start = boundary + isKF8 = true + } catch (e) { + console.warn(e) + console.warn('Failed to open KF8; falling back to MOBI') + } + } + await this.#setup() + return isKF8 ? new KF8(this).init() : new MOBI6(this).init() + } + #getHeaders(buf) { + const palmdoc = getStruct(PALMDOC_HEADER, buf) + const mobi = getStruct(MOBI_HEADER, buf) + if (mobi.magic !== 'MOBI') throw new Error('Missing MOBI header') + + const { titleOffset, titleLength, localeLanguage, localeRegion } = mobi + mobi.title = buf.slice(titleOffset, titleOffset + titleLength) + const lang = MOBI_LANG[localeLanguage] + mobi.language = lang?.[localeRegion >> 2] ?? lang?.[0] + + const exth = mobi.exthFlag & 0b100_0000 + ? getEXTH(buf.slice(mobi.length + 16), mobi.encoding) : null + const kf8 = mobi.version >= 8 ? getStruct(KF8_HEADER, buf) : null + return { palmdoc, mobi, exth, kf8 } + } + async #setup() { + const { palmdoc, mobi } = this.headers + this.#decoder = getDecoder(mobi.encoding) + // `TextEncoder` only supports UTF-8 + // we are only encoding ASCII anyway, so I think it's fine + this.#encoder = new TextEncoder() + + // set up decompressor + const { compression } = palmdoc + this.#decompress = compression === 1 ? f => f + : compression === 2 ? decompressPalmDOC + : compression === 17480 ? await huffcdic(mobi, this.loadRecord.bind(this)) + : null + if (!this.#decompress) throw new Error('Unknown compression type') + + // set up function for removing trailing bytes + const { trailingFlags } = mobi + const multibyte = trailingFlags & 1 + const numTrailingEntries = countBitsSet(trailingFlags >>> 1) + this.#removeTrailingEntries = array => { + for (let i = 0; i < numTrailingEntries; i++) { + const length = getVarLenFromEnd(array) + array = array.subarray(0, -length) + } + if (multibyte) { + const length = (array[array.length - 1] & 0b11) + 1 + array = array.subarray(0, -length) + } + return array + } + } + decode(...args) { + return this.#decoder.decode(...args) + } + encode(...args) { + return this.#encoder.encode(...args) + } + loadRecord(index) { + return super.loadRecord(this.#start + index) + } + loadMagic(index) { + return super.loadMagic(this.#start + index) + } + loadText(index) { + return this.loadRecord(index + 1) + .then(buf => new Uint8Array(buf)) + .then(this.#removeTrailingEntries) + .then(this.#decompress) + } + async loadResource(index) { + const buf = await super.loadRecord(this.#resourceStart + index) + const magic = getString(buf.slice(0, 4)) + if (magic === 'FONT') return getFont(buf, this.unzlib) + if (magic === 'VIDE' || magic === 'AUDI') return buf.slice(12) + return buf + } + getNCX() { + const index = this.headers.mobi.indx + if (index < 0xffffffff) return getNCX(index, this.loadRecord.bind(this)) + } + getMetadata() { + const { mobi, exth } = this.headers + return { + identifier: mobi.uid.toString(), + title: unescapeHTML(exth?.title || this.decode(mobi.title)), + author: exth?.creator?.map(unescapeHTML), + publisher: unescapeHTML(exth?.publisher), + language: exth?.language ?? mobi.language, + published: exth?.date, + description: unescapeHTML(exth?.description), + subject: exth?.subject?.map(unescapeHTML), + rights: unescapeHTML(exth?.rights), + contributor: exth?.contributor, + } + } + async getCover() { + const { exth } = this.headers + const offset = exth?.coverOffset < 0xffffffff ? exth?.coverOffset + : exth?.thumbnailOffset < 0xffffffff ? exth?.thumbnailOffset : null + if (offset != null) { + const buf = await this.loadResource(offset) + return new Blob([buf]) + } + } +} + +const mbpPagebreakRegex = /<\s*(?:mbp:)?pagebreak[^>]*>/gi +const fileposRegex = /<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi +const selfClosingRegex = /<(a|div|span|p)\s*\/>/gi + +const getIndent = el => { + let x = 0 + while (el) { + const parent = el.parentElement + if (parent) { + const tag = parent.tagName.toLowerCase() + if (tag === 'p') x += 1.5 + else if (tag === 'blockquote') x += 2 + } + el = parent + } + return x +} + +function rawBytesToString(uint8Array) { + const chunkSize = 0x8000 + let result = '' + for (let i = 0; i < uint8Array.length; i += chunkSize) { + result += String.fromCharCode.apply(null, uint8Array.subarray(i, i + chunkSize)) + } + return result +} + +class MOBI6 { + parser = new DOMParser() + serializer = new XMLSerializer() + #resourceCache = new Map() + #textCache = new Map() + #cache = new Map() + #sections + #fileposList = [] + #type = MIME.HTML + constructor(mobi) { + this.mobi = mobi + } + async init() { + const recordBuffers = [] + for (let i = 0; i < this.mobi.headers.palmdoc.numTextRecords; i++) { + const buf = await this.mobi.loadText(i) + recordBuffers.push(buf) + } + const totalLength = recordBuffers.reduce((sum, buf) => sum + buf.byteLength, 0) + // load all text records in an array + const array = new Uint8Array(totalLength) + recordBuffers.reduce((offset, buf) => { + array.set(new Uint8Array(buf), offset) + return offset + buf.byteLength + }, 0) + // convert to string so we can use regex + // note that `filepos` are byte offsets + // so it needs to preserve each byte as a separate character + // (see https://stackoverflow.com/q/50198017) + const str = rawBytesToString(array) + + // split content into sections at each `` + this.#sections = [0] + .concat(Array.from(str.matchAll(mbpPagebreakRegex), m => m.index)) + .map((start, i, a) => { + const end = a[i + 1] ?? array.length + return { book: this, raw: array.subarray(start, end) } + }) + // get start and end filepos for each section + .map((section, i, arr) => { + section.start = arr[i - 1]?.end ?? 0 + section.end = section.start + section.raw.byteLength + return section + }) + + this.sections = this.#sections.map((section, index) => ({ + id: index, + load: () => this.loadSection(section), + createDocument: () => this.createDocument(section), + size: section.end - section.start, + })) + + try { + this.landmarks = await this.getGuide() + const tocHref = this.landmarks + .find(({ type }) => type?.includes('toc'))?.href + if (tocHref) { + const { index } = this.resolveHref(tocHref) + const doc = await this.sections[index].createDocument() + let lastItem + let lastLevel = 0 + let lastIndent = 0 + const lastLevelOfIndent = new Map() + const lastParentOfLevel = new Map() + this.toc = Array.from(doc.querySelectorAll('a[filepos]')) + .reduce((arr, a) => { + const indent = getIndent(a) + const item = { + label: a.innerText?.trim() ?? '', + href: `filepos:${a.getAttribute('filepos')}`, + } + const level = indent > lastIndent ? lastLevel + 1 + : indent === lastIndent ? lastLevel + : lastLevelOfIndent.get(indent) ?? Math.max(0, lastLevel - 1) + if (level > lastLevel) { + if (lastItem) { + lastItem.subitems ??= [] + lastItem.subitems.push(item) + lastParentOfLevel.set(level, lastItem) + } + else arr.push(item) + } + else { + const parent = lastParentOfLevel.get(level) + if (parent) parent.subitems.push(item) + else arr.push(item) + } + lastItem = item + lastLevel = level + lastIndent = indent + lastLevelOfIndent.set(indent, level) + return arr + }, []) + } + } catch(e) { + console.warn(e) + } + + // get list of all `filepos` references in the book, + // which will be used to insert anchor elements + // because only then can they be referenced in the DOM + this.#fileposList = [...new Set( + Array.from(str.matchAll(fileposRegex), m => m[1]))] + .map(filepos => ({ filepos, number: Number(filepos) })) + .sort((a, b) => a.number - b.number) + + this.metadata = this.mobi.getMetadata() + this.getCover = this.mobi.getCover.bind(this.mobi) + return this + } + async getGuide() { + const doc = await this.createDocument(this.#sections[0]) + return Array.from(doc.getElementsByTagName('reference'), ref => ({ + label: ref.getAttribute('title'), + type: ref.getAttribute('type')?.split(/\s/), + href: `filepos:${ref.getAttribute('filepos')}`, + })) + } + async loadResource(index) { + if (this.#resourceCache.has(index)) return this.#resourceCache.get(index) + const raw = await this.mobi.loadResource(index) + const url = URL.createObjectURL(new Blob([raw])) + this.#resourceCache.set(index, url) + return url + } + async loadRecindex(recindex) { + return this.loadResource(Number(recindex) - 1) + } + async replaceResources(doc) { + for (const img of doc.querySelectorAll('img[recindex]')) { + const recindex = img.getAttribute('recindex') + try { + img.src = await this.loadRecindex(recindex) + } catch { + console.warn(`Failed to load image ${recindex}`) + } + } + for (const media of doc.querySelectorAll('[mediarecindex]')) { + const mediarecindex = media.getAttribute('mediarecindex') + const recindex = media.getAttribute('recindex') + try { + media.src = await this.loadRecindex(mediarecindex) + if (recindex) media.poster = await this.loadRecindex(recindex) + } catch { + console.warn(`Failed to load media ${mediarecindex}`) + } + } + for (const a of doc.querySelectorAll('[filepos]')) { + const filepos = a.getAttribute('filepos') + a.href = `filepos:${filepos}` + } + } + async loadText(section) { + if (this.#textCache.has(section)) return this.#textCache.get(section) + const { raw } = section + + // insert anchor elements for each `filepos` + const fileposList = this.#fileposList + .filter(({ number }) => number >= section.start && number < section.end) + .map(obj => ({ ...obj, offset: obj.number - section.start })) + let arr = raw + if (fileposList.length) { + arr = raw.subarray(0, fileposList[0].offset) + fileposList.forEach(({ filepos, offset }, i) => { + const next = fileposList[i + 1] + const a = this.mobi.encode(``) + arr = concatTypedArray3(arr, a, raw.subarray(offset, next?.offset)) + }) + } + const str = this.mobi.decode(arr).replaceAll(mbpPagebreakRegex, '') + this.#textCache.set(section, str) + return str + } + #sanitize(str) { + // HTML5 ignores the `/` in `` for non-void elements, + // leaving the tag unclosed. Rewrite the ones we've seen in MOBI. + return str.replace(selfClosingRegex, '<$1>') + } + async createDocument(section) { + const str = await this.loadText(section) + return this.parser.parseFromString(this.#sanitize(str), this.#type) + } + async loadSection(section) { + if (this.#cache.has(section)) return this.#cache.get(section) + const doc = await this.createDocument(section) + + // inject default stylesheet + const style = doc.createElement('style') + doc.head.append(style) + // blockquotes in MOBI seem to have only a small left margin by default + // many books seem to rely on this, as it's the only way to set margin + // (since there's no CSS) + style.append(doc.createTextNode(`blockquote { + margin-block-start: 0; + margin-block-end: 0; + margin-inline-start: 1em; + margin-inline-end: 0; + }`)) + + await this.replaceResources(doc) + const result = this.serializer.serializeToString(doc) + const url = URL.createObjectURL(new Blob([result], { type: this.#type })) + this.#cache.set(section, url) + return url + } + resolveHref(href) { + const filepos = href.match(/filepos:(.*)/)[1] + const number = Number(filepos) + const index = this.#sections.findIndex(section => section.end > number) + const anchor = doc => doc.getElementById(`filepos${filepos}`) + return { index, anchor } + } + splitTOCHref(href) { + const filepos = href.match(/filepos:(.*)/)[1] + const number = Number(filepos) + const index = this.#sections.findIndex(section => section.end > number) + return [index, `filepos${filepos}`] + } + getTOCFragment(doc, id) { + return doc.getElementById(id) + } + isExternal(uri) { + return /^(?!blob|filepos)\w+:/i.test(uri) + } + destroy() { + for (const url of this.#resourceCache.values()) URL.revokeObjectURL(url) + for (const url of this.#cache.values()) URL.revokeObjectURL(url) + } +} + +// handlers for `kindle:` uris +const kindleResourceRegex = /kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/ +const kindlePosRegex = /kindle:pos:fid:(\w+):off:(\w+)/ +const parseResourceURI = str => { + const [resourceType, id, type] = str.match(kindleResourceRegex).slice(1) + return { resourceType, id: parseInt(id, 32), type } +} +const parsePosURI = str => { + const [fid, off] = str.match(kindlePosRegex).slice(1) + return { fid: parseInt(fid, 32), off: parseInt(off, 32) } +} +const makePosURI = (fid = 0, off = 0) => + `kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4, '0') + }:off:${off.toString(32).toUpperCase().padStart(10, '0')}` + +// `kindle:pos:` links are originally links that contain fragments identifiers +// so there should exist an element with `id` or `name` +// otherwise try to find one with an `aid` attribute +const getFragmentSelector = str => { + const match = str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i) + if (!match) return + const [, attr, value] = match + return `[${attr}="${CSS.escape(value)}"]` +} + +// replace asynchronously and sequentially +const replaceSeries = async (str, regex, f) => { + const matches = [] + str.replace(regex, (...args) => (matches.push(args), null)) + const results = [] + for (const args of matches) results.push(await f(...args)) + return str.replace(regex, () => results.shift()) +} + +const getPageSpread = properties => { + for (const p of properties) { + if (p === 'page-spread-left' || p === 'rendition:page-spread-left') + return 'left' + if (p === 'page-spread-right' || p === 'rendition:page-spread-right') + return 'right' + if (p === 'rendition:page-spread-center') return 'center' + } +} + +class KF8 { + parser = new DOMParser() + serializer = new XMLSerializer() + transformTarget = new EventTarget() + #cache = new Map() + #fragmentOffsets = new Map() + #fragmentSelectors = new Map() + #tables = {} + #sections + #fullRawLength + #rawHead = new Uint8Array() + #rawTail = new Uint8Array() + #lastLoadedHead = -1 + #lastLoadedTail = -1 + #type = MIME.XHTML + #inlineMap = new Map() + constructor(mobi) { + this.mobi = mobi + } + async init() { + const loadRecord = this.mobi.loadRecord.bind(this.mobi) + const { kf8 } = this.mobi.headers + + try { + const fdstBuffer = await loadRecord(kf8.fdst) + const fdst = getStruct(FDST_HEADER, fdstBuffer) + if (fdst.magic !== 'FDST') throw new Error('Missing FDST record') + const fdstTable = Array.from({ length: fdst.numEntries }, + (_, i) => 12 + i * 8) + .map(offset => [ + getUint(fdstBuffer.slice(offset, offset + 4)), + getUint(fdstBuffer.slice(offset + 4, offset + 8))]) + this.#tables.fdstTable = fdstTable + this.#fullRawLength = fdstTable[fdstTable.length - 1][1] + } catch {} + + const skelTable = (await getIndexData(kf8.skel, loadRecord)).table + .map(({ name, tagMap }, index) => ({ + index, name, + numFrag: tagMap[1][0], + offset: tagMap[6][0], + length: tagMap[6][1], + })) + const fragData = await getIndexData(kf8.frag, loadRecord) + const fragTable = fragData.table.map(({ name, tagMap }) => ({ + insertOffset: parseInt(name), + selector: fragData.cncx[tagMap[2][0]], + index: tagMap[4][0], + offset: tagMap[6][0], + length: tagMap[6][1], + })) + this.#tables.skelTable = skelTable + this.#tables.fragTable = fragTable + + this.#sections = skelTable.reduce((arr, skel) => { + const last = arr[arr.length - 1] + const fragStart = last?.fragEnd ?? 0, fragEnd = fragStart + skel.numFrag + const frags = fragTable.slice(fragStart, fragEnd) + const length = skel.length + frags.map(f => f.length).reduce((a, b) => a + b, 0) + const totalLength = (last?.totalLength ?? 0) + length + return arr.concat({ skel, frags, fragEnd, length, totalLength }) + }, []) + + const resources = await this.getResourcesByMagic(['RESC', 'PAGE']) + const pageSpreads = new Map() + if (resources.RESC) { + const buf = await this.mobi.loadRecord(resources.RESC) + const str = this.mobi.decode(buf.slice(16)).replace(/\0/g, '') + // the RESC record lacks the root `` element + // but seem to be otherwise valid XML + const index = str.search(/\?>/) + const xmlStr = `${str.slice(index)}` + const opf = this.parser.parseFromString(xmlStr, MIME.XML) + for (const $itemref of opf.querySelectorAll('spine > itemref')) { + const i = parseInt($itemref.getAttribute('skelid')) + pageSpreads.set(i, getPageSpread( + $itemref.getAttribute('properties')?.split(' ') ?? [])) + } + } + + this.sections = this.#sections.map((section, index) => + section.frags.length ? ({ + id: index, + load: () => this.loadSection(section), + createDocument: () => this.createDocument(section), + size: section.length, + pageSpread: pageSpreads.get(index), + }) : ({ linear: 'no' })) + + try { + const ncx = await this.mobi.getNCX() + const map = ({ label, pos, children }) => { + const [fid, off] = pos + const href = makePosURI(fid, off) + const arr = this.#fragmentOffsets.get(fid) + if (arr) arr.push(off) + else this.#fragmentOffsets.set(fid, [off]) + return { label: unescapeHTML(label), href, subitems: children?.map(map) } + } + this.toc = ncx?.map(map) + this.landmarks = await this.getGuide() + } catch(e) { + console.warn(e) + } + + const { exth } = this.mobi.headers + this.dir = exth.pageProgressionDirection + this.rendition = { + layout: exth.fixedLayout === 'true' ? 'pre-paginated' : 'reflowable', + viewport: Object.fromEntries(exth.originalResolution + ?.split('x')?.slice(0, 2) + ?.map((x, i) => [i ? 'height' : 'width', x]) ?? []), + } + + this.metadata = this.mobi.getMetadata() + this.getCover = this.mobi.getCover.bind(this.mobi) + return this + } + // is this really the only way of getting to RESC, PAGE, etc.? + async getResourcesByMagic(keys) { + const results = {} + const start = this.mobi.headers.kf8.resourceStart + const end = this.mobi.pdb.numRecords + for (let i = start; i < end; i++) { + try { + const magic = await this.mobi.loadMagic(i) + const match = keys.find(key => key === magic) + if (match) results[match] = i + } catch {} + } + return results + } + async getGuide() { + const index = this.mobi.headers.kf8.guide + if (index < 0xffffffff) { + const loadRecord = this.mobi.loadRecord.bind(this.mobi) + const { table, cncx } = await getIndexData(index, loadRecord) + return table.map(({ name, tagMap }) => ({ + label: cncx[tagMap[1][0]] ?? '', + type: name?.split(/\s/), + href: makePosURI(tagMap[6]?.[0] ?? tagMap[3]?.[0]), + })) + } + } + async loadResourceBlob(str) { + const { resourceType, id, type } = parseResourceURI(str) + const raw = resourceType === 'flow' ? await this.loadFlow(id) + : await this.mobi.loadResource(id - 1) + const result = [MIME.XHTML, MIME.HTML, MIME.CSS, MIME.SVG].includes(type) + ? await this.replaceResources(this.mobi.decode(raw)) : raw + const detail = { data: result, type } + const event = new CustomEvent('data', { detail }) + this.transformTarget.dispatchEvent(event) + const newData = await event.detail.data + const newType = await event.detail.type + const doc = newType === MIME.SVG ? this.parser.parseFromString(newData, newType) : null + return [new Blob([newData], { newType }), + // SVG wrappers need to be inlined + // as browsers don't allow external resources when loading SVG as an image + doc?.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'image')?.length + ? doc.documentElement : null] + } + async loadResource(str) { + if (this.#cache.has(str)) return this.#cache.get(str) + const [blob, inline] = await this.loadResourceBlob(str) + const url = inline ? str : URL.createObjectURL(blob) + if (inline) this.#inlineMap.set(url, inline) + this.#cache.set(str, url) + return url + } + replaceResources(str) { + const regex = new RegExp(kindleResourceRegex, 'g') + return replaceSeries(str, regex, this.loadResource.bind(this)) + } + // NOTE: there doesn't seem to be a way to access text randomly? + // how to know the decompressed size of the records without decompressing? + // 4096 is just the maximum size + async loadRaw(start, end) { + // here we load either from the front or back until we have reached the + // required offsets; at worst you'd have to load half the book at once + const distanceHead = end - this.#rawHead.length + const distanceEnd = this.#fullRawLength == null ? Infinity + : (this.#fullRawLength - this.#rawTail.length) - start + // load from the start + if (distanceHead < 0 || distanceHead < distanceEnd) { + while (this.#rawHead.length < end) { + const index = ++this.#lastLoadedHead + const data = await this.mobi.loadText(index) + this.#rawHead = concatTypedArray(this.#rawHead, data) + } + return this.#rawHead.slice(start, end) + } + // load from the end + while (this.#fullRawLength - this.#rawTail.length > start) { + const index = this.mobi.headers.palmdoc.numTextRecords - 1 + - (++this.#lastLoadedTail) + const data = await this.mobi.loadText(index) + this.#rawTail = concatTypedArray(data, this.#rawTail) + } + const rawTailStart = this.#fullRawLength - this.#rawTail.length + return this.#rawTail.slice(start - rawTailStart, end - rawTailStart) + } + loadFlow(index) { + if (index < 0xffffffff) + return this.loadRaw(...this.#tables.fdstTable[index]) + } + async loadText(section) { + const { skel, frags, length } = section + const raw = await this.loadRaw(skel.offset, skel.offset + length) + let skeleton = raw.slice(0, skel.length) + for (const frag of frags) { + const insertOffset = frag.insertOffset - skel.offset + const offset = skel.length + frag.offset + const fragRaw = raw.slice(offset, offset + frag.length) + skeleton = concatTypedArray3( + skeleton.slice(0, insertOffset), fragRaw, + skeleton.slice(insertOffset)) + + const offsets = this.#fragmentOffsets.get(frag.index) + if (offsets) for (const offset of offsets) { + const str = this.mobi.decode(fragRaw.slice(offset)) + const selector = getFragmentSelector(str) + this.#setFragmentSelector(frag.index, offset, selector) + } + } + return this.mobi.decode(skeleton) + } + async createDocument(section) { + const str = await this.loadText(section) + return this.parser.parseFromString(str, this.#type) + } + async loadSection(section) { + if (this.#cache.has(section)) return this.#cache.get(section) + const str = await this.loadText(section) + const replaced = await this.replaceResources(str) + + // by default, type is XHTML; change to HTML if it's not valid XHTML + let doc = this.parser.parseFromString(replaced, this.#type) + if (doc.querySelector('parsererror') || !doc.documentElement?.namespaceURI) { + this.#type = MIME.HTML + doc = this.parser.parseFromString(replaced, this.#type) + } + for (const [url, node] of this.#inlineMap) { + for (const el of doc.querySelectorAll(`img[src="${url}"]`)) + el.replaceWith(node) + } + const url = URL.createObjectURL( + new Blob([this.serializer.serializeToString(doc)], { type: this.#type })) + this.#cache.set(section, url) + return url + } + getIndexByFID(fid) { + return this.#sections.findIndex(section => + section.frags.some(frag => frag.index === fid)) + } + #setFragmentSelector(id, offset, selector) { + const map = this.#fragmentSelectors.get(id) + if (map) map.set(offset, selector) + else { + const map = new Map() + this.#fragmentSelectors.set(id, map) + map.set(offset, selector) + } + } + async resolveHref(href) { + const { fid, off } = parsePosURI(href) + const index = this.getIndexByFID(fid) + if (index < 0) return + + const saved = this.#fragmentSelectors.get(fid)?.get(off) + if (saved) return { index, anchor: doc => doc.querySelector(saved) } + + const { skel, frags } = this.#sections[index] + const frag = frags.find(frag => frag.index === fid) + const offset = skel.offset + skel.length + frag.offset + const fragRaw = await this.loadRaw(offset, offset + frag.length) + const str = this.mobi.decode(fragRaw.slice(off)) + const selector = getFragmentSelector(str) + this.#setFragmentSelector(fid, off, selector) + const anchor = doc => doc.querySelector(selector) + return { index, anchor } + } + splitTOCHref(href) { + const pos = parsePosURI(href) + const index = this.getIndexByFID(pos.fid) + return [index, pos] + } + getTOCFragment(doc, { fid, off }) { + const selector = this.#fragmentSelectors.get(fid)?.get(off) + return doc.querySelector(selector) + } + isExternal(uri) { + return /^(?!blob|kindle)\w+:/i.test(uri) + } + destroy() { + for (const url of this.#cache.values()) URL.revokeObjectURL(url) + } +} diff --git a/web/vendor/foliate-js/opds.js b/web/vendor/foliate-js/opds.js new file mode 100644 index 00000000..5112e8f7 --- /dev/null +++ b/web/vendor/foliate-js/opds.js @@ -0,0 +1,400 @@ +const NS = { + ATOM: 'http://www.w3.org/2005/Atom', + OPDS: 'http://opds-spec.org/2010/catalog', + THR: 'http://purl.org/syndication/thread/1.0', + DC: 'http://purl.org/dc/elements/1.1/', + DCTERMS: 'http://purl.org/dc/terms/', + FH: 'http://purl.org/syndication/history/1.0', + PSE: 'http://vaemendis.net/opds-pse/ns', + OS: 'http://a9.com/-/spec/opensearch/1.1/', +} + +const MIME = { + ATOM: 'application/atom+xml', + OPDS2: 'application/opds+json', +} + +export const REL = { + ACQ: 'http://opds-spec.org/acquisition', + FACET: 'http://opds-spec.org/facet', + GROUP: 'http://opds-spec.org/group', + COVER: [ + 'http://opds-spec.org/image', + 'http://opds-spec.org/cover', // ManyBooks legacy, not in spec + 'x-stanza-cover-image', // Lexcycle Stanza legacy + ], + THUMBNAIL: [ + 'http://opds-spec.org/image/thumbnail', + 'http://opds-spec.org/thumbnail', // ManyBooks legacy, not in spec + 'x-stanza-cover-image-thumbnail', // Lexcycle Stanza legacy + ], + STREAM: 'http://vaemendis.net/opds-pse/stream', +} + +export const SYMBOL = { + SUMMARY: Symbol('summary'), + CONTENT: Symbol('content'), +} + +const FACET_GROUP = Symbol('facetGroup') + +const groupByArray = (arr, f) => { + const map = new Map() + if (arr) { + for (const el of arr) { + const keys = f(el) + const keyArray = keys == null ? [] : (Array.isArray(keys) ? keys : [keys]) + for (const key of keyArray) { + const group = map.get(key) + if (group) group.push(el) + else map.set(key, [el]) + } + } + } + return map +} + +// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1 +const parseMediaType = str => { + if (!str) return + const [mediaType, ...ps] = str.split(/ *; */) + if (!mediaType) return + return { + mediaType: mediaType.toLowerCase(), + parameters: ps.reduce((acc, p) => { + const [name, val] = p.split('=') + if (name) { + acc[name.toLowerCase()] = val?.replace(/(^"|"$)/g, '') + } + return acc + }, {}), + } +} + +export const isOPDSCatalog = str => { + const parsed = parseMediaType(str) + if (!parsed) return false + const { mediaType, parameters } = parsed + if (mediaType === MIME.OPDS2) return true + return mediaType === MIME.ATOM && parameters.profile?.toLowerCase() === 'opds-catalog' +} + +// ignore the namespace if it doesn't appear in document at all +const useNS = (doc, ns) => + doc.lookupNamespaceURI(null) === ns || doc.lookupPrefix(ns) ? ns : undefined + +const filterNS = ns => ns + ? name => el => el.namespaceURI === ns && el.localName === name + : name => el => el.localName === name + +const getContent = el => { + if (!el) return + const type = el.getAttribute('type') ?? 'text' + const value = type === 'xhtml' ? el.innerHTML + : type === 'html' ? el.textContent + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('&', '&') + : el.textContent + return { value, type } +} + +const getTextContent = el => { + const content = getContent(el) + if (content?.type === 'text') return content.value +} + +const getSummary = (a, b) => getTextContent(a) ?? getTextContent(b) + +// Fetch only direct children to avoid polluting with nested deep indirect acquisitions +const getDirectChildren = (el, ns, localName, tagName) => { + return Array.from(el.childNodes).filter(node => + node.nodeType === 1 && + ( + (node.namespaceURI === ns && node.localName === localName) || + (node.tagName === tagName) + ) + ) +} + +const getPrice = link => { + const prices = getDirectChildren(link, NS.OPDS, 'price', 'opds:price') + if (!prices.length) return + const parsed = prices.reduce((acc, price) => { + const value = parseFloat(price.textContent) + if (!Number.isNaN(value)) { + acc.push({ + currency: price.getAttribute('currencycode') ?? undefined, + value, + }) + } + return acc + }, []) + + if (!parsed.length) return + // OPDS 1.x allows multiple prices, OPDS 2.0 schema defines price as a single object + return parsed.length === 1 ? parsed[0] : parsed +} + +const getIndirectAcquisition = el => { + const ias = getDirectChildren(el, NS.OPDS, 'indirectAcquisition', 'opds:indirectAcquisition') + if (!ias.length) return [] + return ias.reduce((acc, ia) => { + const type = ia.getAttribute('type') + if (type) { + acc.push({ + type, + child: getIndirectAcquisition(ia), + }) + } + return acc + }, []) +} + +const getLink = link => { + const relAttr = link.getAttribute('rel') + const rel = relAttr ? relAttr.split(/ +/) : undefined + + const isAcquisition = rel?.some(r => r.startsWith(REL.ACQ) || r === 'preview') + const isStream = rel?.includes(REL.STREAM) + + // Map OPDS 1.x active facets to OPDS 2.0 "self" link + const activeFacet = link.getAttributeNS(NS.OPDS, 'activeFacet') || link.getAttribute('opds:activeFacet') + const mappedRel = activeFacet === 'true' ? [rel ?? []].flat().concat('self') : rel + + // Maps OPDS 1.x thr:count seamlessly to OPDS 2.0 properties.numberOfItems + const thrCount = link.getAttributeNS(NS.THR, 'count') || link.getAttribute('thr:count') + // Support for systems that incorrectly use standard `count` for facet hints + const fallbackCount = link.getAttribute('count') + + // --- OPDS-PSE Extensions --- + const pseCount = link.getAttributeNS(NS.PSE, 'count') || link.getAttribute('pse:count') + const pseLastRead = link.getAttributeNS(NS.PSE, 'lastRead') || link.getAttribute('pse:lastRead') + const pseLastReadDate = link.getAttributeNS(NS.PSE, 'lastReadDate') || link.getAttribute('pse:lastReadDate') + + return { + rel: mappedRel, + href: link.getAttribute('href') ?? undefined, + type: link.getAttribute('type') ?? undefined, + title: link.getAttribute('title') ?? undefined, + // --- Facet Grouping --- + [FACET_GROUP]: (link.getAttributeNS(NS.OPDS, 'facetGroup') || link.getAttribute('opds:facetGroup')) ?? undefined, + properties: { + price: (isAcquisition || isStream) ? getPrice(link) : undefined, + indirectAcquisition: (isAcquisition || isStream) ? getIndirectAcquisition(link) : undefined, + // --- Pagination / Facet Counters --- + numberOfItems: thrCount != null ? Number(thrCount) : (!isStream && fallbackCount != null) ? Number(fallbackCount) : undefined, + 'pse:count': isStream && (pseCount ?? fallbackCount) != null ? Number(pseCount ?? fallbackCount) : undefined, + 'pse:lastRead': isStream && pseLastRead != null ? Number(pseLastRead) : undefined, + 'pse:lastReadDate': isStream ? pseLastReadDate ?? undefined : undefined, + }, + } +} + +const getPerson = person => { + const NS = person.namespaceURI + const uri = person.getElementsByTagNameNS(NS, 'uri')[0]?.textContent + return { + name: person.getElementsByTagNameNS(NS, 'name')[0]?.textContent ?? undefined, + links: uri ? [{ href: uri }] : [], + } +} + +export const getPublication = entry => { + const filter = filterNS(useNS(entry.ownerDocument, NS.ATOM)) + const children = Array.from(entry.children) + const filterDCEL = filterNS(NS.DC) + const filterDCTERMS = filterNS(NS.DCTERMS) + const filterDC = x => y => filterDCEL(x)(y) || filterDCTERMS(x)(y) + const links = children.filter(filter('link')).map(getLink) + const linksByRel = groupByArray(links, link => link.rel) + return { + metadata: { + id: children.find(filter('id'))?.textContent ?? undefined, + updated: children.find(filter('updated'))?.textContent ?? undefined, + title: children.find(filter('title'))?.textContent ?? undefined, + author: children.filter(filter('author')).map(getPerson), + contributor: children.filter(filter('contributor')).map(getPerson), + publisher: children.find(filterDC('publisher'))?.textContent ?? undefined, + published: (children.find(filter('published')) + ?? children.find(filterDCTERMS('issued')) + ?? children.find(filterDC('date')))?.textContent ?? undefined, + language: children.find(filterDC('language'))?.textContent ?? undefined, + identifier: children.find(filterDC('identifier'))?.textContent ?? undefined, + subject: children.filter(filter('category')).map(category => ({ + name: category.getAttribute('label') ?? undefined, + code: category.getAttribute('term') ?? undefined, + scheme: category.getAttribute('scheme') ?? undefined, + })), + rights: children.find(filter('rights'))?.textContent ?? undefined, + [SYMBOL.CONTENT]: getContent(children.find(filter('content')) ?? children.find(filter('summary'))) ?? undefined, + }, + links, + images: REL.COVER.concat(REL.THUMBNAIL) + .map(R => linksByRel.get(R)?.[0]).filter(Boolean), + } +} + +export const getFeed = doc => { + const ns = useNS(doc, NS.ATOM) + const filter = filterNS(ns) + const children = Array.from(doc.documentElement.children) + const entries = children.filter(filter('entry')) + const links = children.filter(filter('link')).map(getLink) + const linksByRel = groupByArray(links, link => link.rel) + + const filterFH = filterNS(NS.FH) + const filterOS = filterNS(NS.OS) + + const groupedItems = new Map([[undefined, []]]) + const groupLinkMap = new Map() + for (const entry of entries) { + const children = Array.from(entry.children) + const links = children.filter(filter('link')).map(getLink) + const linksByRel = groupByArray(links, link => link.rel) + const isPub = Array.from(linksByRel.keys()) + .some(rel => rel?.startsWith(REL.ACQ) || rel === 'preview' || rel === REL.STREAM) + + const groupLinks = linksByRel.get(REL.GROUP) ?? linksByRel.get('collection') + const groupLink = groupLinks?.length + ? groupLinks.find(link => groupedItems.has(link.href)) ?? groupLinks[0] : undefined + if (groupLink?.href && !groupLinkMap.has(groupLink.href)) { + groupLinkMap.set(groupLink.href, groupLink) + } + + const item = isPub + ? getPublication(entry) + : Object.assign(links.find(link => isOPDSCatalog(link.type)) ?? links[0] ?? {}, { + title: children.find(filter('title'))?.textContent ?? undefined, + [SYMBOL.SUMMARY]: getSummary(children.find(filter('summary')), + children.find(filter('content'))) ?? undefined, + }) + + // Flag the item with its resolved OPDS 2.0 type + item.__type = isPub ? 'publication' : 'navigation' + + const arr = groupedItems.get(groupLink?.href) + if (arr) arr.push(item) + else groupedItems.set(groupLink.href, [item]) + } + + const [items, ...groups] = Array.from(groupedItems, ([key, groupItems]) => { + // Separate publications and navigation items within the group + const publications = [] + const navigation = [] + for (const item of groupItems) { + if (item.__type === 'publication') { + delete item.__type + publications.push(item) + } else { + delete item.__type + navigation.push(item) + } + } + + const groupContent = {} + if (publications.length) groupContent.publications = publications + if (navigation.length) groupContent.navigation = navigation + + if (key === undefined) return groupContent + const link = groupLinkMap.get(key) + return { + metadata: { + title: link?.title, + numberOfItems: link?.properties?.numberOfItems, + }, + links: [{ rel: 'self', href: link?.href, type: link?.type }], + ...groupContent, + } + }) + + // --- OPDS 2.0 Pagination (derived from OpenSearch / RFC 5005) --- + const totalResults = children.find(filterOS('totalResults'))?.textContent + const itemsPerPage = children.find(filterOS('itemsPerPage'))?.textContent + const startIndex = children.find(filterOS('startIndex'))?.textContent + + let currentPage + if (startIndex != null && itemsPerPage != null) { + const start = Number(startIndex) + const items = Number(itemsPerPage) + // Resolves typical 1-based offset to a page number + currentPage = Math.floor((start > 0 ? start - 1 : 0) / items) + 1 + } + + return { + metadata: { + id: children.find(filter('id'))?.textContent ?? undefined, + updated: children.find(filter('updated'))?.textContent ?? undefined, + title: children.find(filter('title'))?.textContent ?? undefined, + subtitle: children.find(filter('subtitle'))?.textContent ?? undefined, + numberOfItems: totalResults != null ? Number(totalResults) : undefined, + itemsPerPage: itemsPerPage != null ? Number(itemsPerPage) : undefined, + currentPage, + }, + links, + isComplete: !!children.find(filterFH('complete')) || undefined, + isArchive: !!children.find(filterFH('archive')) || undefined, + ...items, // contains top-level 'publications' and/or 'navigation' arrays + groups: groups.length ? groups : undefined, + facets: Array.from( + groupByArray(linksByRel.get(REL.FACET) ?? [], link => link[FACET_GROUP]), + ([facet, links]) => ({ metadata: { title: facet ?? undefined }, links }) + ), + } +} + +export const getSearch = async link => { + const { replace, getVariables } = await import('./uri-template.js') + const href = link.href || '' + return { + metadata: { + title: link.title ?? undefined, + }, + search: map => replace(href, map.get(undefined)), + params: Array.from(getVariables(href), name => ({ name })), + } +} + +export const getOpenSearch = doc => { + const defaultNS = doc.documentElement.namespaceURI + const filter = filterNS(defaultNS) + const children = Array.from(doc.documentElement.children) + + const $$urls = children.filter(filter('Url')) + const $url = $$urls.find(url => isOPDSCatalog(url.getAttribute('type'))) ?? $$urls[0] + if (!$url) throw new Error('document must contain at least one Url element') + + const regex = /{(?:([^}]+?):)?(.+?)(\?)?}/g + const defaultMap = new Map([ + ['count', '100'], + ['startIndex', $url.getAttribute('indexOffset') ?? '0'], + ['startPage', $url.getAttribute('pageOffset') ?? '0'], + ['language', '*'], + ['inputEncoding', 'UTF-8'], + ['outputEncoding', 'UTF-8'], + ]) + + const template = $url.getAttribute('template') || '' + return { + metadata: { + title: (children.find(filter('LongName')) ?? children.find(filter('ShortName')))?.textContent ?? undefined, + description: children.find(filter('Description'))?.textContent ?? undefined, + }, + search: map => template.replace(regex, (_, prefix, param) => { + const namespace = prefix ? $url.lookupNamespaceURI(prefix) : undefined + const ns = namespace === defaultNS ? undefined : namespace + const val = map.get(ns)?.get(param) + return encodeURIComponent(val ?? (!ns ? defaultMap.get(param) ?? '' : '')) + }), + params: Array.from(template.matchAll(regex), ([, prefix, param, optional]) => { + const namespace = prefix ? $url.lookupNamespaceURI(prefix) : undefined + const ns = namespace === defaultNS ? undefined : namespace + return { + ns, + name: param, // (.+?) ensures `param` is non-empty + required: !optional, + value: ns && ns !== defaultNS ? undefined : defaultMap.get(param) ?? undefined, + } + }), + } +} diff --git a/web/vendor/foliate-js/overlayer.js b/web/vendor/foliate-js/overlayer.js new file mode 100644 index 00000000..172d37cd --- /dev/null +++ b/web/vendor/foliate-js/overlayer.js @@ -0,0 +1,422 @@ +const createSVGElement = tag => + document.createElementNS('http://www.w3.org/2000/svg', tag) + +let overlayerCounter = 0 + +export class Overlayer { + #svg = createSVGElement('svg') + #map = new Map() + #doc = null + #clipPath = null + #clipPathPath = null + #clipPathId + + constructor(doc) { + this.#doc = doc + this.#clipPathId = `foliate-loupe-clip-${overlayerCounter++}` + Object.assign(this.#svg.style, { + position: 'absolute', top: '0', left: '0', + width: '100%', height: '100%', + pointerEvents: 'none', + }) + + // Create a clipPath to cut a hole for the loupe. + // We use clip-rule="evenodd" with a large outer rect and inner circle + // to create the hole effect efficiently without mask compositing. + const defs = createSVGElement('defs') + this.#clipPath = createSVGElement('clipPath') + this.#clipPath.setAttribute('id', this.#clipPathId) + this.#clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse') + + this.#clipPathPath = createSVGElement('path') + this.#clipPathPath.setAttribute('clip-rule', 'evenodd') + this.#clipPathPath.setAttribute('fill-rule', 'evenodd') // for older renderers + + this.#clipPath.append(this.#clipPathPath) + defs.append(this.#clipPath) + this.#svg.append(defs) + } + + setHole(cx, cy, w, h, r) { + // Define a path with a large outer rect and a capsule-shaped hole. + // The capsule is a rounded rectangle (stadium shape) centred at (cx, cy). + const outer = 'M -2000000 -2000000 H 4000000 V 4000000 H -2000000 Z' + const hw = w / 2, hh = h / 2 + const cr = Math.min(r, hw, hh) // clamp corner radius + const inner = `M ${cx - hw + cr} ${cy - hh}` + + ` H ${cx + hw - cr}` + + ` A ${cr} ${cr} 0 0 1 ${cx + hw} ${cy - hh + cr}` + + ` V ${cy + hh - cr}` + + ` A ${cr} ${cr} 0 0 1 ${cx + hw - cr} ${cy + hh}` + + ` H ${cx - hw + cr}` + + ` A ${cr} ${cr} 0 0 1 ${cx - hw} ${cy + hh - cr}` + + ` V ${cy - hh + cr}` + + ` A ${cr} ${cr} 0 0 1 ${cx - hw + cr} ${cy - hh} Z` + this.#clipPathPath.setAttribute('d', `${outer} ${inner}`) + + this.#svg.setAttribute('clip-path', `url(#${this.#clipPathId})`) + this.#svg.style.webkitClipPath = `url(#${this.#clipPathId})` + } + + clearHole() { + this.#svg.removeAttribute('clip-path') + this.#svg.style.webkitClipPath = '' + this.#clipPathPath.removeAttribute('d') + } + + get element() { + return this.#svg + } + get #zoom() { + // Safari does not zoom the client rects, while Chrome, Edge and Firefox does + if (/^((?!chrome|android).)*AppleWebKit/i.test(navigator.userAgent) && !window.chrome) { + return window.getComputedStyle(this.#doc.body).zoom || 1.0 + } + return 1.0 + } + #splitRangeByParagraph(range) { + const ancestor = range.commonAncestorContainer + const paragraphs = Array.from(ancestor.querySelectorAll?.('p, h1, h2, h3, h4') || []) + + const splitRanges = [] + paragraphs.forEach((p) => { + const pRange = document.createRange() + if (range.intersectsNode(p)) { + pRange.selectNodeContents(p) + if (pRange.compareBoundaryPoints(Range.START_TO_START, range) < 0) { + pRange.setStart(range.startContainer, range.startOffset) + } + if (pRange.compareBoundaryPoints(Range.END_TO_END, range) > 0) { + pRange.setEnd(range.endContainer, range.endOffset) + } + splitRanges.push(pRange) + } + }) + return splitRanges.length === 0 ? [range] : splitRanges + } + add(key, range, draw, options) { + if (this.#map.has(key)) this.remove(key) + if (typeof range === 'function') range = range(this.#svg.getRootNode()) + const zoom = this.#zoom + let rects = [] + this.#splitRangeByParagraph(range).forEach((pRange) => { + const pRects = Array.from(pRange.getClientRects()).map(rect => ({ + left: rect.left * zoom, + top: rect.top * zoom, + right: rect.right * zoom, + bottom: rect.bottom * zoom, + width: rect.width * zoom, + height: rect.height * zoom, + })) + rects = rects.concat(pRects) + }) + const element = draw(rects, options) + this.#svg.append(element) + this.#map.set(key, { range, draw, options, element, rects }) + } + remove(key) { + if (!this.#map.has(key)) return + this.#svg.removeChild(this.#map.get(key).element) + this.#map.delete(key) + } + redraw() { + for (const obj of this.#map.values()) { + const { range, draw, options, element } = obj + this.#svg.removeChild(element) + const zoom = this.#zoom + let rects = [] + this.#splitRangeByParagraph(range).forEach((pRange) => { + const pRects = Array.from(pRange.getClientRects()).map(rect => ({ + left: rect.left * zoom, + top: rect.top * zoom, + right: rect.right * zoom, + bottom: rect.bottom * zoom, + width: rect.width * zoom, + height: rect.height * zoom, + })) + rects = rects.concat(pRects) + }) + const el = draw(rects, options) + this.#svg.append(el) + obj.element = el + obj.rects = rects + } + } + hitTest({ x, y }) { + const arr = Array.from(this.#map.entries()) + // loop in reverse to hit more recently added items first + for (let i = arr.length - 1; i >= 0; i--) { + const tolerance = 5 + const [key, obj] = arr[i] + for (const { left, top, right, bottom } of obj.rects) { + if ( + top <= y + tolerance && + left <= x + tolerance && + bottom > y - tolerance && + right > x - tolerance + ) { + return [key, obj.range, { left, top, right, bottom }] + } + } + } + return [] + } + static underline(rects, options = {}) { + const { color = 'red', width: strokeWidth = 2, padding = 0, writingMode } = options + const g = createSVGElement('g') + g.setAttribute('fill', color) + if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr') + for (const { right, top, height } of rects) { + const el = createSVGElement('rect') + el.setAttribute('x', right - strokeWidth / 2 + padding) + el.setAttribute('y', top) + el.setAttribute('height', height) + el.setAttribute('width', strokeWidth) + g.append(el) + } + else for (const { left, bottom, width } of rects) { + const el = createSVGElement('rect') + el.setAttribute('x', left) + el.setAttribute('y', bottom - strokeWidth / 2 + padding) + el.setAttribute('height', strokeWidth) + el.setAttribute('width', width) + g.append(el) + } + return g + } + static strikethrough(rects, options = {}) { + const { color = 'red', width: strokeWidth = 2, writingMode } = options + const g = createSVGElement('g') + g.setAttribute('fill', color) + if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr') + for (const { right, left, top, height } of rects) { + const el = createSVGElement('rect') + el.setAttribute('x', (right + left) / 2) + el.setAttribute('y', top) + el.setAttribute('height', height) + el.setAttribute('width', strokeWidth) + g.append(el) + } + else for (const { left, top, bottom, width } of rects) { + const el = createSVGElement('rect') + el.setAttribute('x', left) + el.setAttribute('y', (top + bottom) / 2) + el.setAttribute('height', strokeWidth) + el.setAttribute('width', width) + g.append(el) + } + return g + } + static squiggly(rects, options = {}) { + const { color = 'red', width: strokeWidth = 2, padding = 0, writingMode } = options + const g = createSVGElement('g') + g.setAttribute('fill', 'none') + g.setAttribute('stroke', color) + g.setAttribute('stroke-width', strokeWidth) + const block = strokeWidth * 1.5 + if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr') + for (const { right, top, height } of rects) { + const el = createSVGElement('path') + const n = Math.round(height / block / 1.5) + const inline = height / n + const ls = Array.from({ length: n }, + (_, i) => `l${i % 2 ? -block : block} ${inline}`).join('') + el.setAttribute('d', `M${right - strokeWidth / 2 + padding} ${top}${ls}`) + g.append(el) + } + else for (const { left, bottom, width } of rects) { + const el = createSVGElement('path') + const n = Math.round(width / block / 1.5) + const inline = width / n + const ls = Array.from({ length: n }, + (_, i) => `l${inline} ${i % 2 ? block : -block}`).join('') + el.setAttribute('d', `M${left} ${bottom + strokeWidth / 2 + padding}${ls}`) + g.append(el) + } + return g + } + static highlight(rects, options = {}) { + const { + color = 'red', + padding = 0, + radius = 4, + radiusPadding = 2, + vertical = false, + } = options + + const g = createSVGElement('g') + g.setAttribute('fill', color) + g.style.opacity = 'var(--overlayer-highlight-opacity, .3)' + g.style.mixBlendMode = 'var(--overlayer-highlight-blend-mode, normal)' + + for (const [index, { left, top, height, width }] of rects.entries()) { + const isFirst = index === 0 + const isLast = index === rects.length - 1 + + let x, y, w, h + + let radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft + + if (vertical) { + x = left - padding + y = top - padding - (isFirst ? radiusPadding : 0) + w = width + padding * 2 + h = height + padding * 2 + (isFirst ? radiusPadding : 0) + (isLast ? radiusPadding : 0) + radiusTopLeft = isFirst ? radius : 0 + radiusTopRight = isFirst ? radius : 0 + radiusBottomRight = isLast ? radius : 0 + radiusBottomLeft = isLast ? radius : 0 + } else { + x = left - padding - (isFirst ? radiusPadding : 0) + y = top - padding + w = width + padding * 2 + (isFirst ? radiusPadding : 0) + (isLast ? radiusPadding : 0) + h = height + padding * 2 + radiusTopLeft = isFirst ? radius : 0 + radiusTopRight = isLast ? radius : 0 + radiusBottomRight = isLast ? radius : 0 + radiusBottomLeft = isFirst ? radius : 0 + } + + const rtl = Math.min(radiusTopLeft, w / 2, h / 2) + const rtr = Math.min(radiusTopRight, w / 2, h / 2) + const rbr = Math.min(radiusBottomRight, w / 2, h / 2) + const rbl = Math.min(radiusBottomLeft, w / 2, h / 2) + + if (rtl === 0 && rtr === 0 && rbr === 0 && rbl === 0) { + const el = createSVGElement('rect') + el.setAttribute('x', x) + el.setAttribute('y', y) + el.setAttribute('height', h) + el.setAttribute('width', w) + g.append(el) + } else { + const el = createSVGElement('path') + const d = ` + M ${x + rtl} ${y} + L ${x + w - rtr} ${y} + ${rtr > 0 ? `Q ${x + w} ${y} ${x + w} ${y + rtr}` : `L ${x + w} ${y}`} + L ${x + w} ${y + h - rbr} + ${rbr > 0 ? `Q ${x + w} ${y + h} ${x + w - rbr} ${y + h}` : `L ${x + w} ${y + h}`} + L ${x + rbl} ${y + h} + ${rbl > 0 ? `Q ${x} ${y + h} ${x} ${y + h - rbl}` : `L ${x} ${y + h}`} + L ${x} ${y + rtl} + ${rtl > 0 ? `Q ${x} ${y} ${x + rtl} ${y}` : `L ${x} ${y}`} + Z + `.trim().replace(/\s+/g, ' ') + el.setAttribute('d', d) + g.append(el) + } + } + return g + } + static outline(rects, options = {}) { + const { color = 'red', width: strokeWidth = 3, padding = 0, radius = 3 } = options + const g = createSVGElement('g') + g.setAttribute('fill', 'none') + g.setAttribute('stroke', color) + g.setAttribute('stroke-width', strokeWidth) + for (const { left, top, height, width } of rects) { + const el = createSVGElement('rect') + el.setAttribute('x', left - padding) + el.setAttribute('y', top - padding) + el.setAttribute('height', height + padding * 2) + el.setAttribute('width', width + padding * 2) + el.setAttribute('rx', radius) + g.append(el) + } + return g + } + static bubble(rects, options = {}) { + const { color = '#fbbf24', writingMode, opacity = 0.85, size = 20, padding = 10 } = options + const isVertical = writingMode === 'vertical-rl' || writingMode === 'vertical-lr' + const g = createSVGElement('g') + g.style.opacity = opacity + if (rects.length === 0) return g + rects.splice(1) + const firstRect = rects[0] + const x = isVertical ? firstRect.right - size + padding : firstRect.right - size + padding + const y = isVertical ? firstRect.bottom - size + padding : firstRect.top - size + padding + firstRect.top = y - padding + firstRect.right = x + size + padding + firstRect.bottom = y + size + padding + firstRect.left = x - padding + const bubble = createSVGElement('path') + const s = size + const r = s * 0.15 + // Speech bubble shape with a small tail + // Main rounded rectangle body + const d = ` + M ${x + r} ${y} + h ${s - 2 * r} + a ${r} ${r} 0 0 1 ${r} ${r} + v ${s * 0.65 - 2 * r} + a ${r} ${r} 0 0 1 ${-r} ${r} + h ${-s * 0.3} + l ${-s * 0.15} ${s * 0.2} + l ${s * 0.05} ${-s * 0.2} + h ${-s * 0.6 + 2 * r} + a ${r} ${r} 0 0 1 ${-r} ${-r} + v ${-s * 0.65 + 2 * r} + a ${r} ${r} 0 0 1 ${r} ${-r} + z + `.replace(/\s+/g, ' ').trim() + + bubble.setAttribute('d', d) + bubble.setAttribute('fill', color) + bubble.setAttribute('stroke', 'rgba(0, 0, 0, 0.2)') + bubble.setAttribute('stroke-width', '1') + // Add horizontal lines inside to represent text + const lineGroup = createSVGElement('g') + lineGroup.setAttribute('stroke', 'rgba(0, 0, 0, 0.3)') + lineGroup.setAttribute('stroke-width', '1.5') + lineGroup.setAttribute('stroke-linecap', 'round') + const lineY1 = y + s * 0.18 + const lineY2 = y + s * 0.33 + const lineY3 = y + s * 0.48 + const lineX1 = x + s * 0.2 + const lineX2 = x + s * 0.8 + const line1 = createSVGElement('line') + line1.setAttribute('x1', lineX1) + line1.setAttribute('y1', lineY1) + line1.setAttribute('x2', lineX2) + line1.setAttribute('y2', lineY1) + const line2 = createSVGElement('line') + line2.setAttribute('x1', lineX1) + line2.setAttribute('y1', lineY2) + line2.setAttribute('x2', lineX2) + line2.setAttribute('y2', lineY2) + const line3 = createSVGElement('line') + line3.setAttribute('x1', lineX1) + line3.setAttribute('y1', lineY3) + line3.setAttribute('x2', x + s * 0.6) + line3.setAttribute('y2', lineY3) + lineGroup.append(line1, line2, line3) + + if (isVertical) { + const centerX = x + s / 2 + const centerY = y + s / 2 + bubble.setAttribute('transform', `rotate(90 ${centerX} ${centerY})`) + lineGroup.setAttribute('transform', `rotate(90 ${centerX} ${centerY})`) + } + + g.append(bubble) + g.append(lineGroup) + return g + } + // make an exact copy of an image in the overlay + // one can then apply filters to the entire element, without affecting them; + // it's a bit silly and probably better to just invert images twice + // (though the color will be off in that case if you do heu-rotate) + static copyImage([rect], options = {}) { + const { src } = options + const image = createSVGElement('image') + const { left, top, height, width } = rect + image.setAttribute('href', src) + image.setAttribute('x', left) + image.setAttribute('y', top) + image.setAttribute('height', height) + image.setAttribute('width', width) + return image + } +} + diff --git a/web/vendor/foliate-js/package.json b/web/vendor/foliate-js/package.json new file mode 100644 index 00000000..dc87561a --- /dev/null +++ b/web/vendor/foliate-js/package.json @@ -0,0 +1,50 @@ +{ + "name": "foliate-js", + "version": "0.0.0", + "description": "Render e-books in the browser", + "repository": { + "type": "git", + "url": "git+https://github.com/johnfactotum/foliate-js.git" + }, + "bugs": { + "url": "https://github.com/johnfactotum/foliate-js/issues" + }, + "homepage": "https://github.com/johnfactotum/foliate-js#readme", + "author": "John Factotum", + "license": "MIT", + "type": "module", + "exports": { + "./*.js": "./*.js" + }, + "devDependencies": { + "@eslint/js": "^9.9.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@zip.js/zip.js": "^2.7.52", + "fflate": "^0.8.2", + "fs-extra": "^11.2.0", + "globals": "^15.9.0", + "pdfjs-dist": "^5.4.530", + "rollup": "^4.22.4" + }, + "scripts": { + "build": "npx rollup -c" + }, + "keywords": [ + "ebook", + "reader", + "epub", + "cfi", + "mobi", + "azw", + "azw3", + "fb2", + "cbz", + "dictd", + "stardict", + "opds" + ], + "dependencies": { + "construct-style-sheets-polyfill": "^3.1.0" + } +} diff --git a/web/vendor/foliate-js/paginator.js b/web/vendor/foliate-js/paginator.js new file mode 100644 index 00000000..fd9b154d --- /dev/null +++ b/web/vendor/foliate-js/paginator.js @@ -0,0 +1,2332 @@ +const wait = ms => new Promise(resolve => setTimeout(resolve, ms)) + +const debounce = (f, wait, immediate) => { + let timeout + return (...args) => { + const later = () => { + timeout = null + if (!immediate) f(...args) + } + const callNow = immediate && !timeout + if (timeout) clearTimeout(timeout) + timeout = setTimeout(later, wait) + if (callNow) f(...args) + } +} + +// Transforms ALL children of the container so multi-view layouts +// animate as a unified whole. Extra elements (e.g. background) are +// also transformed so they slide in sync with the content. +const animateScroll = (element, scrollProp, startValue, endValue, duration, extraElements = []) => new Promise(resolve => { + if (document.hidden) { + element[scrollProp] = endValue + return resolve() + } + + const children = [...element.children] + if (!children.length) { + element[scrollProp] = endValue + return resolve() + } + + const allElements = [...children, ...extraElements] + const isHorizontal = scrollProp === 'scrollLeft' + const delta = endValue - startValue + const transformProp = isHorizontal ? 'translateX' : 'translateY' + + // Prepare all elements for animation + for (const el of allElements) { + el.style.willChange = 'transform' + el.style.transform = `${transformProp}(0px)` + el.style.transition = 'none' + } + + // Force reflow to apply initial state + element.getBoundingClientRect() + + // Start animation on all elements + for (const el of allElements) { + el.style.transition = `transform ${duration}ms cubic-bezier(0.25, 0.46, 0.45, 0.94)` + el.style.transform = `${transformProp}(${-delta}px)` + } + + let resolved = false + const cleanup = () => { + if (resolved) return + resolved = true + + for (const el of allElements) { + el.style.willChange = '' + el.style.transform = '' + el.style.transition = '' + } + + // Apply final scroll position + element[scrollProp] = endValue + resolve() + } + + // Listen for transition end on the first child + const first = children[0] + const onTransitionEnd = (e) => { + if (e.target === first && e.propertyName === 'transform') { + first.removeEventListener('transitionend', onTransitionEnd) + cleanup() + } + } + first.addEventListener('transitionend', onTransitionEnd) + + // Fallback timeout in case transitionend doesn't fire + setTimeout(cleanup, duration + 50) +}) + +// collapsed range doesn't return client rects sometimes (or always?) +// try make get a non-collapsed range or element +const uncollapse = range => { + if (!range?.collapsed) return range + const { endOffset, endContainer } = range + if (endContainer.nodeType === 1) { + const node = endContainer.childNodes[endOffset] + if (node?.nodeType === 1) return node + return endContainer + } + if (endOffset + 1 < endContainer.length) range.setEnd(endContainer, endOffset + 1) + else if (endOffset > 1) range.setStart(endContainer, endOffset - 1) + else return endContainer.parentNode + return range +} + +const makeRange = (doc, node, start, end = start) => { + const range = doc.createRange() + range.setStart(node, start) + range.setEnd(node, end) + return range +} + +// use binary search to find an offset value in a text node +const bisectNode = (doc, node, cb, start = 0, end = node.nodeValue.length) => { + if (end - start === 1) { + const result = cb(makeRange(doc, node, start), makeRange(doc, node, end)) + return result < 0 ? start : end + } + const mid = Math.floor(start + (end - start) / 2) + const result = cb(makeRange(doc, node, start, mid), makeRange(doc, node, mid, end)) + return result < 0 ? bisectNode(doc, node, cb, start, mid) + : result > 0 ? bisectNode(doc, node, cb, mid, end) : mid +} + +const { SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION, + FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP } = NodeFilter + +const filter = SHOW_ELEMENT | SHOW_TEXT | SHOW_CDATA_SECTION + +// needed cause there seems to be a bug in `getBoundingClientRect()` in Firefox +// where it fails to include rects that have zero width and non-zero height +// (CSSOM spec says "rectangles [...] of which the height or width is not zero") +// which makes the visible range include an extra space at column boundaries +const getBoundingClientRect = target => { + let top = Infinity, right = -Infinity, left = Infinity, bottom = -Infinity + for (const rect of target.getClientRects()) { + left = Math.min(left, rect.left) + top = Math.min(top, rect.top) + right = Math.max(right, rect.right) + bottom = Math.max(bottom, rect.bottom) + } + return new DOMRect(left, top, right - left, bottom - top) +} + +const getVisibleRange = (doc, start, end, mapRect) => { + // first get all visible nodes + const acceptNode = node => { + const name = node.localName?.toLowerCase() + // ignore all scripts, styles, and their children + if (name === 'script' || name === 'style') return FILTER_REJECT + if (node.nodeType === 1) { + const { left, right } = mapRect(node.getBoundingClientRect()) + if (left === 0 && right === 0) return FILTER_REJECT + // no need to check child nodes if it's completely out of view + if (right < start || left > end) return FILTER_REJECT + // elements must be completely in view to be considered visible + // because you can't specify offsets for elements + if (left >= start && right <= end) return FILTER_ACCEPT + // TODO: it should probably allow elements that do not contain text + // because they can exceed the whole viewport in both directions + // especially in scrolled mode + } else { + // ignore empty text nodes + if (!node.nodeValue?.trim()) return FILTER_SKIP + // create range to get rect + const range = doc.createRange() + range.selectNodeContents(node) + const { left, right } = mapRect(range.getBoundingClientRect()) + // it's visible if any part of it is in view + if (left === 0 && right === 0) return FILTER_REJECT + if (right >= start && left <= end) return FILTER_ACCEPT + } + return FILTER_SKIP + } + const walker = doc.createTreeWalker(doc.body, filter, { acceptNode }) + const nodes = [] + for (let node = walker.nextNode(); node; node = walker.nextNode()) + nodes.push(node) + + // we're only interested in the first and last visible nodes + const from = nodes[0] ?? doc.body + const to = nodes[nodes.length - 1] ?? from + + // find the offset at which visibility changes + const startOffset = from.nodeType === 1 ? 0 + : bisectNode(doc, from, (a, b) => { + const p = mapRect(getBoundingClientRect(a)) + const q = mapRect(getBoundingClientRect(b)) + if (p.right < start && q.left > start) return 0 + return q.left > start ? -1 : 1 + }) + const endOffset = to.nodeType === 1 ? 0 + : bisectNode(doc, to, (a, b) => { + const p = mapRect(getBoundingClientRect(a)) + const q = mapRect(getBoundingClientRect(b)) + if (p.right < end && q.left > end) return 0 + return q.left > end ? -1 : 1 + }) + + const range = doc.createRange() + range.setStart(from, startOffset) + range.setEnd(to, endOffset) + return range +} + +const selectionIsBackward = sel => { + const range = document.createRange() + range.setStart(sel.anchorNode, sel.anchorOffset) + range.setEnd(sel.focusNode, sel.focusOffset) + return range.collapsed +} + +const setSelectionTo = (target, collapse) => { + let range + if (target.startContainer) range = target.cloneRange() + else if (target.nodeType) { + range = document.createRange() + range.selectNode(target) + } + if (range) { + const sel = range.startContainer.ownerDocument?.defaultView.getSelection() + if (sel) { + sel.removeAllRanges() + if (collapse === -1) range.collapse(true) + else if (collapse === 1) range.collapse() + sel.addRange(range) + } + } +} + +export const getDirection = doc => { + const { defaultView } = doc + let { writingMode, direction } = defaultView.getComputedStyle(doc.body) + // Some EPUBs set writing-mode on the first child of body instead of body itself + if (!writingMode || writingMode === 'horizontal-tb') { + const firstChild = doc.body.querySelector(':scope > :not([cfi-inert])') + if (firstChild) { + const childStyle = defaultView.getComputedStyle(firstChild) + if (childStyle.writingMode === 'vertical-rl' + || childStyle.writingMode === 'vertical-lr') { + writingMode = childStyle.writingMode + } + } + } + const vertical = writingMode === 'vertical-rl' + || writingMode === 'vertical-lr' + const rtl = doc.body.dir === 'rtl' + || direction === 'rtl' + || doc.documentElement.dir === 'rtl' + return { vertical, rtl } +} + +const getBackground = doc => { + const bodyStyle = doc.defaultView.getComputedStyle(doc.body) + return bodyStyle.backgroundColor === 'rgba(0, 0, 0, 0)' + && bodyStyle.backgroundImage === 'none' + ? doc.defaultView.getComputedStyle(doc.documentElement).background + : bodyStyle.background +} + +const makeMarginals = (length, part) => Array.from({ length }, () => { + const div = document.createElement('div') + const child = document.createElement('div') + div.append(child) + child.setAttribute('part', part) + return div +}) + +const setStyles = (el, styles) => { + const { style } = el + for (const [k, v] of Object.entries(styles)) style.setProperty(k, v) +} + +const setStylesImportant = (el, styles) => { + const { style } = el + for (const [k, v] of Object.entries(styles)) style.setProperty(k, v, 'important') +} + +class View { + #observer = new ResizeObserver(() => this.expand()) + #element = document.createElement('div') + #iframe = document.createElement('iframe') + #contentRange = document.createRange() + #overlayer + #vertical = false + #rtl = false + #column = true + #size + #columnCount = 1 + #layout = {} + #contentPages = 0 + #bgImageSize = null + fontReady = Promise.resolve() + constructor({ container, onExpand }) { + this.container = container + this.onExpand = onExpand + this.#iframe.setAttribute('part', 'filter') + this.#element.append(this.#iframe) + Object.assign(this.#element.style, { + boxSizing: 'content-box', + position: 'relative', + overflow: 'hidden', + flex: '0 0 auto', + width: '100%', height: '100%', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center', + }) + Object.assign(this.#iframe.style, { + overflow: 'hidden', + border: '0', + display: 'none', + width: '100%', height: '100%', + }) + // `allow-scripts` is needed for events because of WebKit bug + // https://bugs.webkit.org/show_bug.cgi?id=218086 + this.#iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts') + this.#iframe.setAttribute('scrolling', 'no') + } + get element() { + return this.#element + } + get document() { + return this.#iframe.contentDocument + } + get contentPages() { + return this.#contentPages + } + async load(src, data, afterLoad, beforeRender) { + if (typeof src !== 'string') throw new Error(`${src} is not string`) + return new Promise(resolve => { + this.#iframe.addEventListener('load', () => { + const doc = this.document + afterLoad?.(doc) + + this.#iframe.setAttribute('aria-label', doc.title) + // it needs to be visible for Firefox to get computed style + this.#iframe.style.display = 'block' + const { vertical, rtl } = getDirection(doc) + this.docBackground = getBackground(doc) + doc.body.style.background = 'none' + // Preload background image to get natural dimensions; + // in scrolled mode the view expands to fit the image. + const bgUrl = this.docBackground + ?.match(/url\(["']?([^"')]+)["']?\)/)?.[1] + if (bgUrl && !this.container.noBackground) { + const img = new Image() + img.onload = () => { + this.#bgImageSize = { + width: img.naturalWidth, + height: img.naturalHeight, + } + if (!this.#column) this.expand() + } + img.src = bgUrl + } + this.#iframe.style.display = 'none' + + this.#vertical = vertical + this.#rtl = rtl + + this.#contentRange.selectNodeContents(doc.body) + const layout = beforeRender?.({ vertical, rtl }) + this.#iframe.style.display = 'block' + this.render(layout) + this.#observer.observe(doc.body) + + // the resize observer above doesn't work in Firefox + // (see https://bugzilla.mozilla.org/show_bug.cgi?id=1832939) + // until the bug is fixed we can at least account for font load + this.fontReady = doc.fonts.ready.then(() => this.expand()) + + resolve() + }, { once: true }) + if (data) { + this.#iframe.srcdoc = data + } else { + this.#iframe.src = src + } + }) + } + render(layout) { + if (!layout || !this.document?.documentElement) return + this.#column = layout.flow !== 'scrolled' + this.#layout = layout + if (this.#column) this.columnize(layout) + else this.scrolled(layout) + } + scrolled({ width, height, marginTop, marginRight, marginBottom, marginLeft, gap, columnWidth }) { + const vertical = this.#vertical + const doc = this.document + setStylesImportant(doc.documentElement, { + 'box-sizing': 'border-box', + 'column-width': 'auto', + 'height': 'auto', + 'width': 'auto', + }) + const availableWidth = Math.trunc(width - marginLeft - marginRight) + const availableHeight = Math.trunc(height - marginTop - marginBottom) + const sidePaddingLeft = marginLeft / 2 + gap / 2 + const sidePaddingRight = marginRight / 2 + gap / 2 + setStyles(doc.documentElement, { + 'padding': vertical + ? `${marginTop * 1.5}px 0px ${marginBottom * 1.5}px 0px` + : `0px ${sidePaddingRight}px 0px ${sidePaddingLeft}px`, + '--page-margin-top': `${vertical ? marginTop * 1.5 : marginTop}px`, + '--page-margin-right': `${vertical ? marginRight : sidePaddingRight}px`, + '--page-margin-bottom': `${vertical ? marginBottom * 1.5 : marginBottom}px`, + '--page-margin-left': `${vertical ? marginLeft : sidePaddingLeft}px`, + '--full-width': `${Math.trunc(width)}`, + '--full-height': `${Math.trunc(height)}`, + '--available-width': `${availableWidth}`, + '--available-height': `${availableHeight}`, + }) + setStylesImportant(doc.body, { + [vertical ? 'max-height' : 'max-width']: `${columnWidth}px`, + 'margin': 'auto', + // Prevent position:absolute/fixed on body from coupling its + // size to the iframe, which causes diverging expand() loops + 'position': 'static', + }) + this.setImageSize(availableWidth, availableHeight) + this.expand() + } + columnize({ width, height, marginTop, marginRight, marginBottom, marginLeft, gap, columnWidth, columnCount }) { + const vertical = this.#vertical + this.#size = vertical ? height : width + this.#columnCount = columnCount || 1 + + const doc = this.document + const horizontalColumnGap = columnCount > 1 ? (marginLeft + marginRight) / 4 + gap / 2 : (marginLeft + marginRight) / 2 + gap + const sidePaddingLeft = columnCount > 1 ? marginLeft / 4 + gap / 4 : marginLeft / 2 + gap / 2 + const sidePaddingRight = columnCount > 1 ? marginRight / 4 + gap / 4 : marginRight / 2 + gap / 2 + setStylesImportant(doc.documentElement, { + 'box-sizing': 'border-box', + 'column-width': `${Math.trunc(columnWidth)}px`, + 'column-gap': vertical ? `${(marginTop + marginBottom) * 1.5}px` : `${horizontalColumnGap}px`, + 'column-fill': 'auto', + ...(vertical + ? { 'width': `${width}px` } + : { 'height': `${height}px` }), + 'overflow': 'hidden', + // force wrap long words + 'overflow-wrap': 'break-word', + // reset some potentially problematic props + 'position': 'static', 'border': '0', 'margin': '0', + 'max-height': 'none', 'max-width': 'none', + 'min-height': 'none', 'min-width': 'none', + // fix glyph clipping in WebKit + '-webkit-line-box-contain': 'block glyphs replaced', + }) + const availableWidth = vertical + ? Math.trunc(width - marginLeft / 2 - marginRight / 2 - gap) + : Math.trunc(width / this.#columnCount) + const availableHeight = vertical + ? Math.trunc(height / this.#columnCount) + : Math.trunc(height - marginTop - marginBottom) + setStyles(doc.documentElement, { + 'padding': vertical + ? `${marginTop * 1.5}px ${marginRight}px ${marginBottom * 1.5}px ${marginLeft}px` + : `${marginTop}px ${sidePaddingRight}px ${marginBottom}px ${sidePaddingLeft}px`, + '--page-margin-top': `${vertical ? marginTop * 1.5 : marginTop}px`, + '--page-margin-right': `${vertical ? marginRight : sidePaddingRight}px`, + '--page-margin-bottom': `${vertical ? marginBottom * 1.5 : marginBottom}px`, + '--page-margin-left': `${vertical ? marginLeft : sidePaddingLeft}px`, + '--full-width': `${Math.trunc(availableWidth)}`, + '--full-height': `${Math.trunc(availableHeight)}`, + '--available-width': `${availableWidth}`, + '--available-height': `${availableHeight}`, + }) + setStylesImportant(doc.body, { + 'max-height': 'none', + 'max-width': 'none', + 'margin': '0', + // Prevent position:absolute/fixed on body from coupling its + // size to the iframe, which causes diverging expand() loops + 'position': 'static', + }) + this.setImageSize(availableWidth, availableHeight) + this.expand() + } + setImageSize(availableWidth, availableHeight) { + const { width, height, marginTop, marginRight, marginBottom, marginLeft } = this.#layout + const vertical = this.#vertical + const doc = this.document + const pageFullscreen = doc.documentElement.hasAttribute('data-duokan-page-fullscreen') + for (const el of doc.body.querySelectorAll('img, svg, video')) { + // clear previous inline constraints so we read CSS-authored values, + // not stale pixel values from a previous resize (#3634) + el.style.removeProperty('max-width') + el.style.removeProperty('max-height') + // preserve max size if they are already set in CSS + let { maxHeight, maxWidth } = doc.defaultView.getComputedStyle(el) + if (parseInt(maxWidth) > availableWidth) { + maxWidth = `${availableWidth}px` + } + if (parseInt(maxHeight) > availableHeight) { + maxHeight = `${availableHeight}px` + } + setStylesImportant(el, { + 'max-height': vertical + ? (maxHeight !== 'none' && maxHeight !== '0px' ? maxHeight : '100%') + : `${height - (pageFullscreen ? 0 : (marginTop + marginBottom))}px`, + 'max-width': vertical + ? `${width - (pageFullscreen ? 0 : (marginLeft + marginRight))}px` + : (maxWidth !== 'none' && maxWidth !== '0px' ? maxWidth : '100%'), + 'object-fit': pageFullscreen ? 'cover': 'contain', + 'page-break-inside': 'avoid', + 'break-inside': 'avoid', + 'box-sizing': 'border-box', + }) + if (pageFullscreen) { + setStylesImportant(doc.documentElement, { + position: 'relative', + }) + setStylesImportant(el, { + position: 'absolute', + inset: '0', + width: '100%', + height: '100%', + margin: '0', + }) + let ancestor = el.parentElement + while (ancestor && ancestor !== doc.body) { + setStylesImportant(ancestor, { + width: '100%', + height: '100%', + margin: '0', + padding: '0', + }) + ancestor = ancestor.parentElement + } + if (el.localName === 'svg') { + el.setAttribute('preserveAspectRatio', 'xMidYMid slice') + } + } + } + } + get #zoom() { + // Safari does not zoom the client rects, while Chrome, Edge and Firefox does + if (/^((?!chrome|android).)*AppleWebKit/i.test(navigator.userAgent) && !window.chrome) { + return window.getComputedStyle(this.document.body).zoom || 1.0 + } + return 1.0 + } + expand() { + if (!this.document?.documentElement) return + const { documentElement } = this.document + if (this.#column) { + const side = this.#vertical ? 'height' : 'width' + const otherSide = this.#vertical ? 'width' : 'height' + const contentRect = this.#contentRange.getBoundingClientRect() + const rootRect = documentElement.getBoundingClientRect() + // offset caused by column break at the start of the page + // which seem to be supported only by WebKit and only for horizontal writing + const contentStart = this.#vertical ? 0 + : this.#rtl ? rootRect.right - contentRect.right : contentRect.left - rootRect.left + const contentSize = (contentStart + contentRect[side]) * this.#zoom + // Size content by individual columns, not full spreads. + // This allows adjacent sections to share a spread when a + // section doesn't fill all available columns. + const columnSize = this.#size / this.#columnCount + const pageCount = Math.ceil(contentSize / columnSize) + this.#contentPages = pageCount + const expandedSize = pageCount * columnSize + this.#element.style.padding = '0' + this.#iframe.style[side] = `${expandedSize}px` + this.#element.style[side] = `${expandedSize}px` + this.#iframe.style[otherSide] = '100%' + this.#element.style[otherSide] = '100%' + // One column per "page" — overflow columns extend into adjacent pages + documentElement.style[side] = `${columnSize}px` + if (this.#overlayer) { + this.#overlayer.element.style.margin = '0' + this.#overlayer.element.style.left = '0' + this.#overlayer.element.style.top = '0' + this.#overlayer.element.style[side] = `${expandedSize}px` + this.#overlayer.redraw() + } + } else { + const side = this.#vertical ? 'width' : 'height' + const otherSide = this.#vertical ? 'height' : 'width' + const contentSize = documentElement.getBoundingClientRect()[side] + let expandedSize = contentSize + // If the section has a background image, ensure the view is + // at least as large as the image scaled to fit the cross axis + if (this.#bgImageSize) { + const crossSize = this.#element.getBoundingClientRect()[otherSide] + if (crossSize > 0) { + const { width: imgW, height: imgH } = this.#bgImageSize + const scaledSize = this.#vertical + ? imgW * crossSize / imgH + : imgH * crossSize / imgW + expandedSize = Math.max(expandedSize, scaledSize) + } + } + this.#element.style.padding = '0' + this.#iframe.style[side] = `${expandedSize}px` + this.#element.style[side] = `${expandedSize}px` + this.#iframe.style[otherSide] = '100%' + this.#element.style[otherSide] = '100%' + if (this.#overlayer) { + this.#overlayer.element.style.margin = '0' + this.#overlayer.element.style.left = '0' + this.#overlayer.element.style.top = '0' + this.#overlayer.element.style[side] = `${expandedSize}px` + this.#overlayer.redraw() + } + } + this.onExpand() + } + set overlayer(overlayer) { + this.#overlayer = overlayer + this.#element.append(overlayer.element) + } + get overlayer() { + return this.#overlayer + } + #loupeEl = null + #loupeScaler = null + #loupeCursor = null + // Show a magnifier loupe inside the iframe document. + // winX/winY are in main-window (screen) coordinates. + showLoupe(winX, winY, { isVertical, color, gap, margin, radius, magnification }) { + const doc = this.document + if (!doc) return + + const frameRect = this.#iframe.getBoundingClientRect() + // Cursor in iframe-viewport coordinates. + const vpX = winX - frameRect.left + const vpY = winY - frameRect.top + + // Cursor in document coordinates (accounts for scroll). + const scrollX = doc.scrollingElement?.scrollLeft ?? 0 + const scrollY = doc.scrollingElement?.scrollTop ?? 0 + const docX = vpX + scrollX + const docY = vpY + scrollY + + const MAGNIFICATION = magnification + const MARGIN = margin + + // Capsule dimensions: elongated along the reading direction. + // For horizontal text the capsule is wider; for vertical it is taller. + const shortSide = radius * 2 + const longSide = Math.round(radius * 3.6) + const loupeW = isVertical ? shortSide : longSide + const loupeH = isVertical ? longSide : shortSide + const halfW = loupeW / 2 + const halfH = loupeH / 2 + const borderRadius = shortSide / 2 // fully rounded ends + + // Position loupe above the cursor (or to the left for vertical text). + const GAP = gap + let loupeLeft = isVertical ? vpX - loupeW - GAP : vpX - halfW + let loupeTop = isVertical ? vpY - halfH : vpY - loupeH - GAP + loupeLeft = Math.max(MARGIN, Math.min(loupeLeft, frameRect.width - loupeW - MARGIN)) + loupeTop = Math.max(MARGIN, Math.min(loupeTop, frameRect.height - loupeH - MARGIN)) + + // CSS-transform math: map document point (docX, docY) to loupe centre. + // visual_pos = offset + coord × MAGNIFICATION = halfW (or halfH) + // ⟹ offset = half − coord × MAGNIFICATION + const offsetX = halfW - docX * MAGNIFICATION + const offsetY = halfH - docY * MAGNIFICATION + + // Build loupe DOM structure once; cache it across hide/show cycles so + // the expensive body clone is not repeated on every drag start. + if (!this.#loupeEl || !this.#loupeEl.isConnected) { + this.#loupeEl = doc.createElement('div') + + // Clone the live body once — inside the iframe the epub's CSS + // variables, @font-face fonts, and styles apply automatically. + const bodyClone = doc.body.cloneNode(true) + + // Wrap the clone in a div that replicates documentElement's inline + // styles (column-width, column-gap, padding, height, etc.) so text + // flows with the same column layout as the original document. + const htmlWrapper = doc.createElement('div') + htmlWrapper.style.cssText = doc.documentElement.style.cssText + // expand() constrains documentElement's page-axis dimension to one + // page size (width for horizontal, height for vertical). Override + // with the full scroll dimension so all columns are rendered. + if (this.#vertical) + htmlWrapper.style.height = `${doc.documentElement.scrollHeight}px` + else + htmlWrapper.style.width = `${doc.documentElement.scrollWidth}px` + htmlWrapper.appendChild(bodyClone) + + this.#loupeScaler = doc.createElement('div') + this.#loupeScaler.appendChild(htmlWrapper) + + const cursorLen = Math.round(shortSide * 0.44) + this.#loupeCursor = doc.createElement('div') + this.#loupeCursor.style.cssText = isVertical + ? `position:absolute;left:calc(50% - ${cursorLen / 2}px);top:50%;` + + `margin-top:-1px;width:${cursorLen}px;height:2px;background:${color};pointer-events:none;z-index:1;box-sizing:border-box;` + : `position:absolute;left:50%;top:calc(50% - ${cursorLen / 2}px);` + + `margin-left:-1px;width:2px;height:${cursorLen}px;background:${color};pointer-events:none;z-index:1;box-sizing:border-box;` + + this.#loupeEl.appendChild(this.#loupeScaler) + this.#loupeEl.appendChild(this.#loupeCursor) + doc.documentElement.appendChild(this.#loupeEl) + + // Static loupe shell styles (set once). + this.#loupeEl.style.cssText = ` + position: absolute; + width: ${loupeW}px; + height: ${loupeH}px; + border-radius: ${borderRadius}px; + overflow: hidden; + border: 2.5px solid ${color}; + box-shadow: 0 6px 24px rgba(0,0,0,0.28); + background-color: var(--theme-bg-color); + z-index: 9999; + pointer-events: none; + user-select: none; + box-sizing: border-box; + contain: strict; + ` + + // Static scaler styles (set once; only left/top change per move). + this.#loupeScaler.style.cssText = ` + position: absolute; + transform: scale(${MAGNIFICATION}); + transform-origin: 0 0; + pointer-events: none; + ` + } + + // Ensure visible (hideLoupe hides via CSS instead of removing). + this.#loupeEl.style.display = '' + + // Update only the dynamic position values (fast path on every move). + this.#loupeScaler.style.left = `${offsetX}px` + this.#loupeScaler.style.top = `${offsetY}px` + this.#loupeScaler.style.width = `${doc.documentElement.scrollWidth}px` + this.#loupeScaler.style.height = `${doc.documentElement.scrollHeight}px` + this.#loupeEl.style.left = `${loupeLeft + scrollX}px` + this.#loupeEl.style.top = `${loupeTop + scrollY}px` + + // Cut a capsule-shaped hole in the overlayer so highlights don't paint + // over the loupe. + if (this.#overlayer) { + const overlayerRect = this.#overlayer.element.getBoundingClientRect() + const dx = frameRect.left - overlayerRect.left + const dy = frameRect.top - overlayerRect.top + + const pad = 3 + const cx = loupeLeft + halfW + dx + const cy = loupeTop + halfH + dy + + this.#overlayer.setHole(cx, cy, loupeW + pad * 2, loupeH + pad * 2, borderRadius + pad) + } + } + hideLoupe() { + // Hide via CSS instead of removing — keeps the cached body clone so + // the next showLoupe call skips the expensive cloneNode(true). + if (this.#loupeEl) { + this.#loupeEl.style.display = 'none' + } + if (this.#overlayer) + this.#overlayer.clearHole() + } + destroyLoupe() { + if (this.#loupeEl) { + this.#loupeEl.remove() + this.#loupeEl = null + this.#loupeScaler = null + this.#loupeCursor = null + } + if (this.#overlayer) + this.#overlayer.clearHole() + } + destroy() { + if (this.document?.body) this.#observer.unobserve(this.document.body) + this.destroyLoupe() + } +} + +// NOTE: everything here assumes the so-called "negative scroll type" for RTL +export class Paginator extends HTMLElement { + static observedAttributes = [ + 'flow', 'gap', 'margin-top', 'margin-bottom', 'margin-left', 'margin-right', + 'max-inline-size', 'max-block-size', 'max-column-count', + 'no-preload', 'no-background', 'no-continuous-scroll', + ] + #root = this.attachShadow({ mode: 'open' }) + #observer = new ResizeObserver(() => this.render()) + #top + #background + #container + #header + #footer + #views = new Map() // Map + #primaryIndex = -1 + #vertical = false + #rtl = false + #marginTop = 0 + #marginBottom = 0 + #anchor = 0 // anchor view to a fraction (0-1), Range, or Element + #justAnchored = false + #locked = false // while true, prevent any further navigation + #styles + #styleMap = new WeakMap() + #mediaQuery = matchMedia('(prefers-color-scheme: dark)') + #mediaQueryListener + #scrollBounds + #touchState + #touchScrolled + #lastVisibleRange + #scrollLocked = false + #isAnimating = false + #filling = false // true while #fillVisibleArea is running + #fillPromise = null // tracks in-progress #fillVisibleArea for awaiting + #stabilizing = false // true while #display is stabilizing layout + #rendered = false // true after first #display completes + #lastLayout = null // cached layout from the last #beforeRender call + // Cache of section index → vertical (boolean). Populated as views + // are loaded so we can check direction *before* loading a section. + #directionCache = new Map() + constructor() { + super() + this.#root.innerHTML = ` +
    +
    + +
    + +
    + ` + + this.#top = this.#root.getElementById('top') + this.#background = this.#root.getElementById('background') + this.#container = this.#root.getElementById('container') + this.#header = this.#root.getElementById('header') + this.#footer = this.#root.getElementById('footer') + + this.#observer.observe(this.#container) + const debouncedScroll = debounce(() => { + if (this.scrolled && !this.#isAnimating) { + // Skip entirely while stabilizing — preserve #justAnchored + // so the first post-stabilization fire still sees it. + if (this.#stabilizing) return + if (this.#justAnchored) this.#justAnchored = false + else this.#afterScroll('scroll') + // Load previous section when user scrolls near the top. + // Done in debounced handler (not instant) to avoid cascade + // from rapid DOM insertions breaking scroll anchoring. + if (!this.noPreload && !this.noContinuousScroll && !this.#filling && this.#renderedStart < this.size) { + const sorted = this.#sortedViews + const firstIndex = sorted[0]?.[0] + if (firstIndex != null) { + const prevIdx = this.#adjacentIndex(-1, firstIndex) + if (prevIdx != null && !this.#views.has(prevIdx) && this.#isSameDirection(prevIdx)) { + this.#filling = true + this.#loadAdjacentSection(prevIdx) + .finally(() => { + this.#filling = false + this.dispatchEvent(new Event('stabilized')) + }) + } + } + } + } else if (!this.scrolled) { + this.#afterScroll('container-scroll') + } + }, 250) + this.#container.addEventListener('scroll', () => { + if (!this.#isAnimating) this.dispatchEvent(new Event('scroll')) + // Preload forward when fewer than minPages ahead + if (!this.noPreload && !this.noContinuousScroll && !this.#filling && !this.#stabilizing) { + const minPages = 5 + const pagesAhead = this.size > 0 + ? Math.floor((this.#renderedViewSize - this.#renderedEnd) / this.size) + : 0 + if (pagesAhead < minPages) { + const sorted = this.#sortedViews + const lastIndex = sorted[sorted.length - 1]?.[0] + if (lastIndex != null) { + const nextIdx = this.#adjacentIndex(1, lastIndex) + if (nextIdx != null && !this.#views.has(nextIdx) && this.#isSameDirection(nextIdx)) { + this.#filling = true + this.#loadAdjacentSection(nextIdx) + .finally(() => { + this.#filling = false + this.dispatchEvent(new Event('stabilized')) + }) + } + } + } + } + debouncedScroll() + }) + + const opts = { passive: false } + this.addEventListener('touchstart', this.#onTouchStart.bind(this), opts) + this.addEventListener('touchmove', this.#onTouchMove.bind(this), opts) + this.addEventListener('touchend', this.#onTouchEnd.bind(this)) + this.addEventListener('load', ({ detail: { doc } }) => { + doc.addEventListener('touchstart', this.#onTouchStart.bind(this), opts) + doc.addEventListener('touchmove', this.#onTouchMove.bind(this), opts) + doc.addEventListener('touchend', this.#onTouchEnd.bind(this)) + }) + + this.addEventListener('relocate', ({ detail }) => { + if (detail.reason === 'selection') setSelectionTo(this.#anchor, 0) + else if (detail.reason === 'navigation') { + if (this.#anchor === 1) setSelectionTo(detail.range, 1) + else if (typeof this.#anchor === 'number') + setSelectionTo(detail.range, -1) + else setSelectionTo(this.#anchor, -1) + } + }) + const checkPointerSelection = debounce((range, sel) => { + if (!sel.rangeCount) return + const selRange = sel.getRangeAt(0) + const backward = selectionIsBackward(sel) + if (backward && selRange.compareBoundaryPoints(Range.START_TO_START, range) < 0) + this.prev() + else if (!backward && selRange.compareBoundaryPoints(Range.END_TO_END, range) > 0) + this.next() + }, 700) + this.addEventListener('load', ({ detail: { doc } }) => { + let isPointerSelecting = false + doc.addEventListener('pointerdown', () => isPointerSelecting = true) + doc.addEventListener('pointerup', () => isPointerSelecting = false) + let isKeyboardSelecting = false + doc.addEventListener('keydown', () => isKeyboardSelecting = true) + doc.addEventListener('keyup', () => isKeyboardSelecting = false) + doc.addEventListener('selectionchange', () => { + if (this.scrolled) return + const range = this.#lastVisibleRange + if (!range) return + const sel = doc.getSelection() + if (!sel.rangeCount) return + // FIXME: this won't work on Android WebView, disable for now + if (!isPointerSelecting && isPointerSelecting && sel.type === 'Range') + checkPointerSelection(range, sel) + else if (isKeyboardSelecting) { + const selRange = sel.getRangeAt(0).cloneRange() + const backward = selectionIsBackward(sel) + if (!backward) selRange.collapse() + this.#scrollToAnchor(selRange) + } + }) + doc.addEventListener('focusin', e => { + if (this.scrolled) return null + if (this.#container && this.#container.contains(e.target)) { + // NOTE: `requestAnimationFrame` is needed in WebKit + requestAnimationFrame(() => this.#scrollToAnchor(e.target)) + } + }) + }) + + this.#mediaQueryListener = () => { + const view = this.#primaryView + if (!view) return + this.#replaceBackground() + } + this.#mediaQuery.addEventListener('change', this.#mediaQueryListener) + } + get #primaryView() { + return this.#views.get(this.#primaryIndex) + } + get #sortedViews() { + return [...this.#views.entries()].sort(([a], [b]) => a - b) + } + get primaryIndex() { + return this.#primaryIndex + } + setAttribute(name, value) { + // The scrolled-mode scroll handler is debounced, so #anchor and + // #primaryIndex can lag behind the user's actual viewport by up to + // ~250ms. Toggling out of scrolled mode within that window made + // render() restore the stale anchor — reverting the position to a + // previously visible section. Flush the pending scroll state here, + // before the attribute change so the layout is still in scrolled + // mode and `this.scrolled` (which reads the attribute) is still true. + if (name === 'flow' + && this.scrolled + && String(value) !== 'scrolled' + && this.#views.size > 0) { + this.#flushScrolledState() + } + super.setAttribute(name, value) + } + #flushScrolledState() { + if (this.#views.size > 1) this.#detectPrimaryView() + const result = this.#getVisibleRange() + if (result?.range && !result.range.collapsed) this.#anchor = result.range + } + attributeChangedCallback(name, _, value) { + switch (name) { + case 'flow': + this.render() + break + case 'gap': + case 'margin-top': + case 'margin-bottom': + case 'margin-left': + case 'margin-right': + case 'max-block-size': + case 'max-column-count': + this.#top.style.setProperty('--_' + name, value) + this.render() + break + case 'max-inline-size': + // needs explicit `render()` as it doesn't necessarily resize + this.#top.style.setProperty('--_' + name, value) + this.render() + break + case 'no-continuous-scroll': + if (this.noContinuousScroll) { + for (const [i] of this.#views) { + if (i !== this.#primaryIndex) this.#destroyView(i) + } + } + break + } + } + open(book) { + this.bookDir = book.dir + this.sections = book.sections + book.transformTarget?.addEventListener('data', ({ detail }) => { + if (detail.type !== 'text/css') return + detail.data = Promise.resolve(detail.data).then(data => data + // unprefix as most of the props are (only) supported unprefixed + .replace(/([{\s;])-epub-/gi, '$1') + // `page-break-*` unsupported in columns; replace with `column-break-*` + .replace(/page-break-(after|before|inside)\s*:/gi, (_, x) => + `-webkit-column-break-${x}:`) + .replace(/break-(after|before|inside)\s*:\s*(avoid-)?page/gi, (_, x, y) => + `break-${x}: ${y ?? ''}column`)) + }) + } + #createView(index) { + // Destroy existing view for this index if any + const existing = this.#views.get(index) + if (existing) { + existing.destroy() + this.#container.removeChild(existing.element) + this.#views.delete(index) + } + const view = new View({ + container: this, + onExpand: () => { + // Only the primary view's resize should adjust scroll; + // non-primary views (preloaded/adjacent) must not scroll + if (this.#filling || this.#stabilizing || this.scrolled) return + if (this.#primaryIndex === index) + this.#scrollToAnchor(this.#anchor) + }, + }) + this.#views.set(index, view) + const sorted = this.#sortedViews + const myPos = sorted.findIndex(([i]) => i === index) + const nextEntry = sorted[myPos + 1] + if (nextEntry) this.#container.insertBefore(view.element, nextEntry[1].element) + else this.#container.append(view.element) + this.#syncA11y() + return view + } + // Hide non-primary views from accessibility tree so screen-reader + // swipe-next does not wander into pre-loaded adjacent sections + // (which would land several pages into the next section instead + // of its first paragraph). Uses `inert` (blocks focus/keyboard + // traversal) and `aria-hidden` (removes from accessibility tree). + #syncA11y() { + for (const [index, view] of this.#views) { + if (index === this.#primaryIndex) { + view.element.removeAttribute('inert') + view.element.removeAttribute('aria-hidden') + } else { + view.element.setAttribute('inert', '') + view.element.setAttribute('aria-hidden', 'true') + } + } + } + #destroyView(index) { + const view = this.#views.get(index) + if (!view) return + view.destroy() + this.#container.removeChild(view.element) + this.#views.delete(index) + this.sections[index]?.unload?.() + } + #destroyAllViews() { + for (const [index] of this.#views) this.#destroyView(index) + } + #clearViewsExcept(keepIndices) { + for (const [index] of this.#views) { + if (!keepIndices.has(index)) this.#destroyView(index) + } + } + // Check if a section has the same writing direction as current primary. + // Returns true if same or unknown (not yet cached). + #isSameDirection(index) { + if (!this.#directionCache.has(index)) return true + return this.#directionCache.get(index) === this.#vertical + } + // Update the #background grid so each column shows the correct section's + // background. Pass atPosition to pre-compute for a destination scroll + // position (e.g. before an animation starts). + #replaceBackground(atPosition) { + const doc = this.#primaryView?.document + if (!doc?.documentElement) return + if (this.noBackground) return + const htmlStyle = doc.defaultView.getComputedStyle(doc.documentElement) + const themeBgColor = htmlStyle.getPropertyValue('--theme-bg-color') + const overrideColor = htmlStyle.getPropertyValue('--override-color') === 'true' + const bgTextureId = htmlStyle.getPropertyValue('--bg-texture-id') + const isDarkMode = htmlStyle.getPropertyValue('color-scheme') === 'dark' + const fallbackBg = themeBgColor || '' + + const resolveBackground = (background) => { + if (!background) return fallbackBg + if (themeBgColor) { + const parsed = background.split(/\s(?=(?:url|rgb|hsl|#[0-9a-fA-F]{3,6}))/) + if ((isDarkMode || overrideColor) && (bgTextureId === 'none' || !bgTextureId)) { + parsed[0] = themeBgColor + } + return parsed.join(' ') + } + return background + } + + // Reset any inline backgrounds left over from a previous mode so the + // host's texture isn't occluded after toggling. + this.#background.style.background = '' + for (const [, view] of this.#sortedViews) { + view.element.style.background = '' + } + + if (this.scrolled) { + // In scrolled mode, set background directly on each view element + // so it scrolls with the content. The static #background provides + // the fallback color for margins and gaps between views. + const hasTexture = !!bgTextureId && bgTextureId !== 'none' + this.#background.innerHTML = '' + this.#background.style.display = '' + this.#background.style.background = hasTexture ? '' : fallbackBg + for (const [, view] of this.#sortedViews) { + const resolved = resolveBackground(view.docBackground) + const isTransparent = !resolved + || /^\s*(transparent|rgba\(0,\s*0,\s*0,\s*0\))/.test(resolved) + view.element.style.background = hasTexture && isTransparent ? '' : resolved + } + return + } + + const cc = this.columnCount + const columnSize = this.size / cc + const sorted = this.#sortedViews + + this.#background.innerHTML = '' + this.#background.style.display = 'grid' + this.#background.style.gridTemplateColumns = `repeat(${cc}, 1fr)` + + const scrollPos = atPosition ?? this.#renderedStart + for (let i = 0; i < cc; i++) { + const columnMid = Math.abs(scrollPos) + (i + 0.5) * columnSize + let bg = fallbackBg + + // Find which view's content area contains this column + let offset = 0 + for (const [, view] of sorted) { + const viewSize = view.element.getBoundingClientRect()[this.sideProp] + if (columnMid < offset + viewSize) { + const contentStart = offset + const contentEnd = contentStart + view.contentPages * columnSize + if (columnMid >= contentStart && columnMid < contentEnd) { + bg = resolveBackground(view.docBackground) + } + break + } + offset += viewSize + } + + const col = document.createElement('div') + col.style.background = bg + col.style.backgroundAttachment = 'initial' + col.style.width = '100%' + col.style.height = '100%' + this.#background.appendChild(col) + } + } + #beforeRender({ vertical, rtl }) { + // If writing-mode is about to change, destroy all non-primary + // views BEFORE updating global state. This prevents stale views + // with the wrong direction from remaining in the container while + // flex-direction / scrollProp / sideProp flip. + if (this.#rendered && vertical !== this.#vertical) { + for (const [i] of this.#views) { + if (i !== this.#primaryIndex) this.#destroyView(i) + } + } + this.#vertical = vertical + this.#rtl = rtl + this.#top.classList.toggle('vertical', vertical) + this.#container.classList.toggle('vertical', vertical) + + const style = getComputedStyle(this.#top) + const maxInlineSize = parseFloat(style.getPropertyValue('--_max-inline-size')) + const maxColumnCount = parseInt(style.getPropertyValue('--_max-column-count-spread')) + const marginTop = parseFloat(style.getPropertyValue('--_margin-top')) + const marginRight = parseFloat(style.getPropertyValue('--_margin-right')) + const marginBottom = parseFloat(style.getPropertyValue('--_margin-bottom')) + const marginLeft = parseFloat(style.getPropertyValue('--_margin-left')) + this.#marginTop = marginTop + this.#marginBottom = marginBottom + + // Compute the column count from the host (Paginator) size rather than + // the #container size. The container width depends on --_column-count + // via the grid template (the outer 1fr tracks have a non-zero min for + // multi-column spreads), so deriving the column count from container + // size at threshold widths creates a feedback loop where the layout + // oscillates between 1 and 2 columns on resize. + const flow = this.getAttribute('flow') + const hostRect = this.getBoundingClientRect() + const hostSize = vertical ? hostRect.height : hostRect.width + const divisor = flow === 'scrolled' + ? 1 + : Math.min( + maxColumnCount + (vertical ? 1 : 0), + Math.ceil(Math.floor(hostSize) / Math.floor(maxInlineSize)), + ) + // Set --_column-count BEFORE measuring the container so the read + // below reflects the grid template that will actually be used. + this.#top.style.setProperty('--_column-count', divisor) + + const { width, height } = this.#container.getBoundingClientRect() + const size = vertical ? height : width + + const g = parseFloat(style.getPropertyValue('--_gap')) / 100 + // The gap will be a percentage of the #container, not the whole view. + // This means the outer padding will be bigger than the column gap. Let + // `a` be the gap percentage. The actual percentage for the column gap + // will be (1 - a) * a. Let us call this `b`. + // + // To make them the same, we start by shrinking the outer padding + // setting to `b`, but keep the column gap setting the same at `a`. Then + // the actual size for the column gap will be (1 - b) * a. Repeating the + // process again and again, we get the sequence + // x₁ = (1 - b) * a + // x₂ = (1 - x₁) * a + // ... + // which converges to x = (1 - x) * a. Solving for x, x = a / (1 + a). + // So to make the spacing even, we must shrink the outer padding with + // f(x) = x / (1 + x). + // But we want to keep the outer padding, and make the inner gap bigger. + // So we apply the inverse, f⁻¹ = -x / (x - 1) to the column gap. + const gap = -g / (g - 1) * size + + if (flow === 'scrolled') { + // FIXME: vertical-rl only, not -lr + this.setAttribute('dir', vertical ? 'rtl' : 'ltr') + this.#top.style.padding = '0' + const columnWidth = maxInlineSize + + this.heads = null + this.feet = null + this.#header.replaceChildren() + this.#footer.replaceChildren() + + this.columnCount = 1 + this.#replaceBackground() + + const layout = { width, height, flow, marginTop, marginRight, marginBottom, marginLeft, gap, columnWidth, columnCount: 1 } + this.#lastLayout = layout + return layout + } + + const columnWidth = vertical + ? (size / divisor - marginTop * 1.5 - marginBottom * 1.5) + : (size / divisor - gap - marginRight / 2 - marginLeft / 2) + this.setAttribute('dir', rtl ? 'rtl' : 'ltr') + + // set background to `doc` background + // this is needed because the iframe does not fill the whole element + this.columnCount = divisor + this.#replaceBackground() + + const marginalDivisor = vertical + ? Math.min(2, Math.ceil(Math.floor(width) / Math.floor(maxInlineSize))) + : divisor + const marginalStyle = { + gridTemplateColumns: `repeat(${marginalDivisor}, 1fr)`, + gap: `${gap}px`, + direction: this.bookDir === 'rtl' ? 'rtl' : 'ltr', + } + Object.assign(this.#header.style, marginalStyle) + Object.assign(this.#footer.style, marginalStyle) + const heads = makeMarginals(marginalDivisor, 'head') + const feet = makeMarginals(marginalDivisor, 'foot') + this.heads = heads.map(el => el.children[0]) + this.feet = feet.map(el => el.children[0]) + this.#header.replaceChildren(...heads) + this.#footer.replaceChildren(...feet) + + const layout = { width, height, marginTop, marginRight, marginBottom, marginLeft, gap, columnWidth, columnCount: divisor } + this.#lastLayout = layout + return layout + } + render() { + if (this.#views.size === 0) return + const primaryView = this.#primaryView + if (!primaryView) return + this.#stabilizing = true + const layout = this.#beforeRender({ + vertical: this.#vertical, + rtl: this.#rtl, + }) + for (const [, view] of this.#views) { + if (view.document) view.render(layout) + } + // Scroll synchronously to prevent visible layout shift during resize. + // RAF deferral is only needed for initial display and mode switches + // (handled by #display), not for resize re-renders. + this.#scrollToAnchor(this.#anchor) + this.#stabilizing = false + this.dispatchEvent(new Event('stabilized')) + } + get scrolled() { + return this.getAttribute('flow') === 'scrolled' + } + get noPreload() { + return this.hasAttribute('no-preload') + } + get noBackground() { + return this.hasAttribute('no-background') + } + get noContinuousScroll() { + return this.scrolled && this.hasAttribute('no-continuous-scroll') + } + get scrollProp() { + const { scrolled } = this + return this.#vertical ? (scrolled ? 'scrollLeft' : 'scrollTop') + : scrolled ? 'scrollTop' : 'scrollLeft' + } + get sideProp() { + const { scrolled } = this + return this.#vertical ? (scrolled ? 'width' : 'height') + : scrolled ? 'height' : 'width' + } + get size() { + return this.#container.getBoundingClientRect()[this.sideProp] + } + get viewSize() { + const primaryView = this.#primaryView + if (!primaryView) return 0 + return primaryView.element.getBoundingClientRect()[this.sideProp] + } + get start() { + return this.#renderedStart - this.#getViewOffset(this.#primaryIndex) + } + get end() { + return this.#renderedEnd - this.#getViewOffset(this.#primaryIndex) + } + get page() { + return Math.floor(((this.start + this.end) / 2) / this.size) + } + get pages() { + const primaryView = this.#primaryView + if (!primaryView) return 0 + const viewSize = primaryView.element.getBoundingClientRect()[this.sideProp] + return Math.round(viewSize / this.size) + } + get containerPosition() { + return this.#container[this.scrollProp] + } + get isOverflowX() { + return false + } + get isOverflowY() { + return false + } + get #renderedViewSize() { + if (this.#views.size === 0) return 0 + let total = 0 + for (const [, view] of this.#views) + total += view.element.getBoundingClientRect()[this.sideProp] + return total + } + get #renderedStart() { + return Math.abs(this.#container[this.scrollProp]) + } + get #renderedEnd() { + return this.#renderedStart + this.size + } + get #renderedPage() { + return Math.floor(((this.#renderedStart + this.#renderedEnd) / 2) / this.size) + } + get #renderedPages() { + return Math.round(this.#renderedViewSize / this.size) + } + set containerPosition(newVal) { + this.#container[this.scrollProp] = newVal + } + set scrollLocked(value) { + this.#scrollLocked = value + } + + scrollBy(dx, dy) { + const delta = this.#vertical ? dy : dx + const [offset, a, b] = this.#scrollBounds + const rtl = this.#rtl + const min = rtl ? offset - b : offset - a + const max = rtl ? offset + a : offset + b + this.containerPosition = Math.max(min, Math.min(max, + this.containerPosition + delta)) + } + + // vx, vy: velocity at the end of the swipe (pixels per ms) + // dx, dy: total distance swiped + // dt: total time of the swipe (ms) + snap(vx, vy, dx, dy, dt) { + const velocity = this.#vertical ? vy : vx + const avgVelocity = this.#vertical ? dy / dt : dx / dt + const horizontal = Math.abs(vx) * 2 > Math.abs(vy) + const orthogonal = this.#vertical ? !horizontal : horizontal + const [offset, a, b] = this.#scrollBounds + const size = this.size + const start = this.#renderedStart + const end = this.#renderedEnd + const pages = this.#renderedPages + const min = Math.abs(offset) - a + const max = Math.abs(offset) + b + const snapping = this.hasAttribute('animated') && !this.hasAttribute('eink') + const v = snapping ? velocity : avgVelocity + const d = v * (this.#rtl ? -size : size) * (orthogonal ? 1 : 0) + const snapOffset = (isNaN(d) ? 0 : snapping ? d * 2 : d * 10) + const page = Math.floor(Math.max(min, Math.min(max, (start + end) / 2 + snapOffset)) / size) + const dir = page < 0 ? -1 : page >= pages ? 1 : null + const doGoTo = () => { + if (!dir) return + const sorted = this.#sortedViews + const edgeIndex = dir < 0 + ? sorted[0]?.[0] ?? this.#primaryIndex + : sorted[sorted.length - 1]?.[0] ?? this.#primaryIndex + return this.#goTo({ + index: this.#adjacentIndex(dir, edgeIndex), + anchor: dir < 0 ? () => 1 : () => 0, + }) + } + // Out of range — skip animation, go straight to adjacent section + if (dir) return doGoTo() + this.#scrollToPage(page, 'snap') + } + #onTouchStart(e) { + const touch = e.changedTouches[0] + this.#touchState = { + x: touch?.screenX, y: touch?.screenY, + t: e.timeStamp, + vx: 0, xy: 0, + dx: 0, dy: 0, + dt: 0, + } + // Hint to browser that scrolling will occur for better GPU layer management + const pv = this.#primaryView + if (pv?.element) { + pv.element.style.willChange = 'transform' + } + } + #onTouchMove(e) { + const state = this.#touchState + if (state.pinched) return + state.pinched = globalThis.visualViewport.scale > 1 + if (this.scrolled || state.pinched) return + if (e.touches.length > 1) { + if (this.#touchScrolled) e.preventDefault() + return + } + const doc = this.#primaryView?.document + const selection = doc?.getSelection() + if (selection && selection.rangeCount > 0 && !selection.isCollapsed) { + return + } + const touch = e.changedTouches[0] + const isStylus = touch.touchType === 'stylus' + if (!isStylus) e.preventDefault() + if (this.#scrollLocked) return + const x = touch.screenX, y = touch.screenY + const dx = state.x - x, dy = state.y - y + const dt = e.timeStamp - state.t + state.x = x + state.y = y + state.t = e.timeStamp + state.vx = dx / dt + state.vy = dy / dt + state.dx += dx + state.dy += dy + state.dt += dt + this.#touchScrolled = true + if (!this.hasAttribute('animated') || this.hasAttribute('eink')) return + if (!this.#vertical && Math.abs(state.dx) >= Math.abs(state.dy) && !this.hasAttribute('eink') && (!isStylus || Math.abs(dx) > 1)) { + this.scrollBy(dx, 0) + } else if (this.#vertical && Math.abs(state.dx) < Math.abs(state.dy) && !this.hasAttribute('eink') && (!isStylus || Math.abs(dy) > 1)) { + this.scrollBy(0, dy) + } + } + #onTouchEnd() { + // Remove will-change hint to free GPU resources + // if (this.#view?.element) { + // this.#view.element.style.willChange = 'auto' + // } + + if (!this.#touchScrolled) return + this.#touchScrolled = false + if (this.scrolled) return + + // XXX: Firefox seems to report scale as 1... sometimes...? + // at this point I'm basically throwing `requestAnimationFrame` at + // anything that doesn't work + requestAnimationFrame(() => { + if (globalThis.visualViewport.scale === 1) { + const { vx, vy, dx, dy, dt } = this.#touchState + this.snap(vx, vy, dx, dy, dt) + } + }) + } + // allows one to process rects as if they were LTR and horizontal + #getRectMapper(view) { + if (this.scrolled) { + const size = view ? view.element.getBoundingClientRect()[this.sideProp] : this.#renderedViewSize + const marginTop = this.#marginTop + const marginBottom = this.#marginBottom + return this.#vertical + ? ({ left, right }) => + ({ left: size - right - marginTop, right: size - left - marginBottom }) + : ({ top, bottom }) => ({ left: top - marginTop, right: bottom - marginBottom }) + } + const pxSize = this.#renderedPages * this.size + return this.#rtl + ? ({ left, right }) => + ({ left: pxSize - right, right: pxSize - left }) + : this.#vertical + ? ({ top, bottom }) => ({ left: top, right: bottom }) + : f => f + } + async #scrollToRect(rect, reason) { + if (this.scrolled) { + // rect is in iframe-local coordinates; add view offset + // to convert to container scroll coordinates + const localOffset = this.#getRectMapper()(rect).left - 3 + const viewOffset = this.#getViewOffset(this.#primaryIndex) + return this.#scrollTo(viewOffset + localOffset, reason) + } + // rect is in iframe-local coordinates. Convert to container + // coordinates by adding the primary view's offset. + const localOffset = this.#getRectMapper()(rect).left + const viewOffset = this.#getViewOffset(this.#primaryIndex) + const containerOffset = viewOffset + localOffset + return this.#scrollToPage(Math.floor(containerOffset / this.size + 0.01), reason) + } + async #scrollTo(offset, reason, smooth) { + const { size } = this + if (this.containerPosition === offset) { + this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size] + this.#afterScroll(reason) + return + } + // FIXME: vertical-rl only, not -lr + if (this.scrolled && this.#vertical) offset = -offset + if ((reason === 'snap' || smooth) && this.hasAttribute('animated') && !this.hasAttribute('eink')) { + const startPosition = this.containerPosition + // Pre-set background for the destination so it's already + // correct when the slide animation reveals the new page + if (!this.scrolled) this.#replaceBackground(offset) + // Use GPU-accelerated scroll animation for smoother experience on high refresh rate screens + this.#isAnimating = true + return animateScroll( + this.#container, + this.scrollProp, + startPosition, + offset, + 300, + ).then(() => { + this.#isAnimating = false + this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size] + this.#afterScroll(reason) + }) + } else { + this.containerPosition = offset + this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size] + this.#afterScroll(reason) + } + } + async #scrollToPage(page, reason, smooth) { + const offset = this.size * (this.#rtl ? -page : page) + return this.#scrollTo(offset, reason, smooth) + } + async scrollToAnchor(anchor, select, smooth) { + return this.#scrollToAnchor(anchor, select ? 'selection' : 'navigation', smooth) + } + async #scrollToAnchor(anchor, reason = 'anchor', smooth = false) { + this.#anchor = anchor + const rects = uncollapse(anchor)?.getClientRects?.() + // if anchor is an element or a range + if (rects) { + // when the start of the range is immediately after a hyphen in the + // previous column, there is an extra zero width rect in that column + const rect = Array.from(rects) + .find(r => r.width > 0 && r.height > 0 && r.x >= 0 && r.y >= 0) || rects[0] + if (!rect) return + await this.#scrollToRect(rect, reason) + // focus the element when navigating with keyboard or screen reader + if (reason === 'navigation') { + let node = anchor.focus ? anchor : undefined + if (!node && anchor.startContainer) { + node = anchor.startContainer + if (node.nodeType === Node.TEXT_NODE) { + node = node.parentElement + } + } + if (node && node.focus) { + node.tabIndex = -1 + node.style.outline = 'none' + node.focus({ preventScroll: true }) + } + } + return + } + // if anchor is a fraction + if (this.scrolled) { + // In scrolled mode with multi-view, offset to the primary view's position + const primaryOffset = this.#getViewOffset(this.#primaryIndex) + const primaryView = this.#primaryView + const primarySize = primaryView + ? primaryView.element.getBoundingClientRect()[this.sideProp] : this.#renderedViewSize + await this.#scrollTo(primaryOffset + anchor * primarySize, reason, smooth) + return + } + // In paginated mode, account for pages before the primary section + const primaryView = this.#primaryView + if (!primaryView) return + const pagesBeforePrimary = this.#getPagesBeforeView(this.#primaryIndex) + const textPages = primaryView.contentPages + if (!textPages) return + // textPages is in column units; convert to spread page for scrolling + const newColumn = Math.round(anchor * (textPages - 1)) + const newSpreadPage = Math.floor(newColumn / this.columnCount) + await this.#scrollToPage(pagesBeforePrimary + newSpreadPage, reason, smooth) + } + // Get the pixel offset of a view within the container + #getViewOffset(index) { + let offset = 0 + for (const [i, view] of this.#sortedViews) { + if (i === index) return offset + offset += view.element.getBoundingClientRect()[this.sideProp] + } + return offset + } + // Get number of full pages (spreads) before a given view. + // Uses floor so the view's first column is always on or after + // the returned page — never rounded past it. The 0.01 tolerance + // absorbs sub-pixel drift on fractional-DPR devices where + // getBoundingClientRect() accumulates ~0.0001px errors. + #getPagesBeforeView(index) { + return Math.floor(this.#getViewOffset(index) / this.size + 0.01) + } + #getVisibleRange() { + const targetView = this.#primaryView + if (!targetView?.document) return + const viewOffset = this.#getViewOffset(this.#primaryIndex) + if (this.scrolled) { + // In scrolled mode, the primary view may be scrolled out of + // the viewport at a section boundary. Try all visible views + // and return the first valid (non-collapsed) range. + for (const [index, v] of this.#sortedViews) { + if (!v.document) continue + const off = this.#getViewOffset(index) + const vSize = v.element.getBoundingClientRect()[this.sideProp] + // Skip views entirely outside the viewport + if (off + vSize <= this.#renderedStart || off >= this.#renderedEnd) continue + const range = getVisibleRange(v.document, + this.#renderedStart - off, this.#renderedEnd - off, + this.#getRectMapper(v)) + if (range && !range.collapsed) return { range, index } + } + return + } + const range = getVisibleRange(targetView.document, + this.#renderedStart - viewOffset, + this.#renderedEnd - viewOffset, + this.#getRectMapper(targetView)) + return range ? { range, index: this.#primaryIndex } : undefined + } + // Determine which view is primary based on scroll position + #detectPrimaryView() { + if (this.#views.size <= 1) return + const visibleStart = this.#renderedStart + let offset = 0 + for (const [index, view] of this.#sortedViews) { + const viewSize = view.element.getBoundingClientRect()[this.sideProp] + if (visibleStart < offset + viewSize - 1) { + if (index !== this.#primaryIndex) { + this.#primaryIndex = index + this.#syncA11y() + this.#trimDistantViews() + this.#replaceBackground() + this.#fillPromise = this.#preloadNext() + } + return + } + offset += viewSize + } + } + // Pre-load adjacent sections from the current primary so the + // next/prev sections are ready when the user paginates. + // Does NOT re-scroll to avoid fighting with the user's current + // scroll position. + async #preloadNext() { + if (this.noPreload || this.noContinuousScroll) return + this.#filling = true + try { + const { size } = this + const minPages = 5 + const maxSections = 8 + // Load forward sections until we have enough pages ahead + let iterations = 0 + while (this.#views.size < maxSections && iterations < maxSections) { + iterations++ + const pagesAhead = size > 0 + ? Math.floor((this.#renderedViewSize - this.#renderedEnd) / size) + : 0 + if (pagesAhead >= minPages) break + const sorted = this.#sortedViews + const lastIndex = sorted[sorted.length - 1]?.[0] + if (lastIndex == null) break + const nextIdx = this.#adjacentIndex(1, lastIndex) + if (nextIdx == null) break + // Stop preloading at writing-mode boundaries + if (!this.#isSameDirection(nextIdx)) break + await this.#loadAdjacentSection(nextIdx) + if (!this.#views.has(nextIdx)) break + } + // Wait a frame so ResizeObserver callbacks fire while + // #filling is still true, preventing onExpand from + // re-scrolling to a stale anchor position. + await new Promise(r => requestAnimationFrame(r)) + } finally { + this.#filling = false + this.dispatchEvent(new Event('stabilized')) + } + } + #afterScroll(reason) { + // In multi-view, detect which section is primary + if (this.#views.size > 1 && reason !== 'anchor' && reason !== 'navigation') { + this.#detectPrimaryView() + } + const { range, index: visibleIndex } = this.#getVisibleRange() || {} + if (!range) return + this.#lastVisibleRange = range + // don't set new anchor if relocation was to scroll to anchor + if (reason !== 'selection' && reason !== 'navigation' && reason !== 'anchor') + this.#anchor = range + else this.#justAnchored = true + + const index = visibleIndex ?? this.#primaryIndex + const primaryView = this.#primaryView + const detail = { reason, range, index } + if (this.scrolled) { + const primaryOffset = this.#getViewOffset(index) + const primarySize = primaryView + ? primaryView.element.getBoundingClientRect()[this.sideProp] : this.#renderedViewSize + detail.fraction = primarySize > 0 + ? Math.max(0, Math.min(1, (this.#renderedStart - primaryOffset) / primarySize)) : 0 + } else if (this.#renderedPages > 0 && primaryView) { + const page = this.#renderedPage + const pagesBeforePrimary = this.#getPagesBeforeView(index) + const textPages = primaryView.contentPages + this.#header.style.visibility = page > 0 ? 'visible' : 'hidden' + // page is in spread units, textPages is in column units + const localPage = page - pagesBeforePrimary + const localColumn = localPage * this.columnCount + detail.fraction = textPages > 0 ? Math.max(0, Math.min(1, localColumn / textPages)) : 0 + detail.size = textPages > 0 ? this.columnCount / textPages : 1 + if (reason === 'container-scroll' && localPage === 0) return + } + // Update per-column backgrounds for the current scroll position + if (!this.scrolled) this.#replaceBackground() + this.dispatchEvent(new CustomEvent('relocate', { detail })) + } + async #display(promise) { + this.#stabilizing = true + this.#container.style.opacity = '0' + const { index, src, data, anchor, onLoad, select } = await promise + this.#primaryIndex = index + this.#syncA11y() + const hasFocus = this.#primaryView?.document?.hasFocus() + if (src) { + const view = this.#createView(index) + const afterLoad = doc => { + if (doc.head) { + const $styleBefore = doc.createElement('style') + doc.head.prepend($styleBefore) + const $style = doc.createElement('style') + doc.head.append($style) + this.sections[index].spineProperties?.forEach( + prop => doc.documentElement.setAttribute('data-' + prop, '')) + this.#styleMap.set(doc, [$styleBefore, $style]) + } + onLoad?.({ doc, index }) + } + const beforeRender = this.#beforeRender.bind(this) + await view.load(src, data, afterLoad, beforeRender) + // Cache direction for future preload boundary checks + if (view.document) { + const dir = getDirection(view.document) + this.#directionCache.set(index, dir.vertical) + } + this.dispatchEvent(new CustomEvent('create-overlayer', { + detail: { + doc: view.document, index, + attach: overlayer => view.overlayer = overlayer, + }, + })) + } + // Pre-load previous section when needed: + // - Short primary alignment (section shorter than one spread) + // - Scrolled mode with anchor in top half — so the user can + // scroll backward into the previous section immediately + const primaryView = this.#primaryView + if (!this.noPreload && !this.noContinuousScroll && primaryView) { + const needsPrev = (primaryView.contentPages > 0 && primaryView.contentPages < this.columnCount) + if (needsPrev || this.scrolled) { + const sorted = this.#sortedViews + const firstIndex = sorted[0]?.[0] + if (firstIndex != null) { + const prevIdx = this.#adjacentIndex(-1, firstIndex) + if (prevIdx != null && this.#isSameDirection(prevIdx)) { + await this.#loadAdjacentSection(prevIdx) + } + } + } + } + const resolvedAnchor = (typeof anchor === 'function' + ? anchor(primaryView.document) : anchor) ?? 0 + await this.scrollToAnchor(resolvedAnchor, select) + if (hasFocus) this.focusView() + // Reveal content now that primary section is positioned + this.#container.style.opacity = '1' + this.#rendered = true + // Emit stabilized so listeners can react, but keep #stabilizing + // true until fill completes to prevent the debounced scroll + // handler from loading backward sections during rapid DOM changes. + this.dispatchEvent(new Event('stabilized')) + // Load remaining adjacent sections progressively (non-blocking). + // In scrolled mode, skip reanchor — browser scroll anchoring + // preserves position when content is added above/below. + this.#fillPromise = this.#fillVisibleArea( + { reanchor: !this.scrolled }) + this.#fillPromise.then(() => { this.#stabilizing = false }) + } + // Load an adjacent section without changing primary index + async #loadAdjacentSection(index) { + if (this.#views.has(index) || !this.#canGoToIndex(index)) return + const section = this.sections[index] + if (!section || section.linear === 'no') return + try { + const src = await section.load() + const data = await section.loadContent?.() + const view = this.#createView(index) + const afterLoad = doc => { + if (doc.head) { + const $styleBefore = doc.createElement('style') + doc.head.prepend($styleBefore) + const $style = doc.createElement('style') + doc.head.append($style) + section.spineProperties?.forEach( + prop => doc.documentElement.setAttribute('data-' + prop, '')) + this.#styleMap.set(doc, [$styleBefore, $style]) + } + this.setStyles(this.#styles) + this.dispatchEvent(new CustomEvent('load', { detail: { doc, index } })) + } + // Adjacent sections reuse the primary view's cached layout + // — they must NOT call #beforeRender, which would modify + // global state (direction, CSS classes, dir attribute, etc.). + const cachedLayout = this.#lastLayout + const beforeRender = () => cachedLayout + await view.load(src, data, afterLoad, beforeRender) + // Cache direction for future preload boundary checks + if (view.document) { + const dir = getDirection(view.document) + this.#directionCache.set(index, dir.vertical) + // Destroy views with a different writing-mode immediately. + // Mixed-direction views corrupt scroll/page calculations. + if (dir.vertical !== this.#vertical) { + this.#destroyView(index) + return + } + } + this.dispatchEvent(new CustomEvent('create-overlayer', { + detail: { + doc: view.document, index, + attach: overlayer => view.overlayer = overlayer, + }, + })) + } catch (e) { + console.warn(e) + console.warn(new Error(`Failed to load adjacent section ${index}`)) + } + } + // Fill adjacent sections until at least `minPages` pages exist + // beyond the current viewport in each direction (forward always, + // backward only when the primary section is short). + // When reanchor is false (background pre-loading), skip re-scrolling + // to avoid fighting with the user's current scroll position. + async #fillVisibleArea({ reanchor = true } = {}) { + if (this.noPreload || this.noContinuousScroll || this.#filling) return + this.#filling = true + try { + const { size } = this + if (!size) return + const minPages = 5 + const maxSections = 8 + + // If the primary section is shorter than one spread and + // there's no section already loaded before it, load the + // previous section to fill the leading columns + const primaryView = this.#primaryView + if (primaryView && primaryView.contentPages > 0 + && primaryView.contentPages < this.columnCount) { + const sorted = this.#sortedViews + const firstIndex = sorted[0]?.[0] + if (firstIndex != null && firstIndex >= this.#primaryIndex) { + const prevIdx = this.#adjacentIndex(-1, firstIndex) + if (prevIdx != null && this.#isSameDirection(prevIdx)) { + await this.#loadAdjacentSection(prevIdx) + } + } + } + + // Load forward sections until we have enough pages ahead + let iterations = 0 + while (this.#views.size < maxSections && iterations < maxSections) { + iterations++ + const pagesAhead = Math.floor( + (this.#renderedViewSize - this.#renderedEnd) / size) + if (pagesAhead >= minPages) break + const sorted = this.#sortedViews + const lastIndex = sorted[sorted.length - 1]?.[0] + if (lastIndex == null) break + const nextIdx = this.#adjacentIndex(1, lastIndex) + if (nextIdx == null) break + // Stop at writing-mode boundaries + if (!this.#isSameDirection(nextIdx)) break + await this.#loadAdjacentSection(nextIdx) + if (!this.#views.has(nextIdx)) break + } + if (reanchor) this.#scrollToAnchor(this.#anchor) + } finally { + this.#filling = false + // Emit stabilized so post-layout processing (e.g. warichu) + // runs for newly loaded adjacent sections. + this.dispatchEvent(new Event('stabilized')) + } + } + // Trim views whose content is entirely more than 10 pages away + // from the current viewport. Only removes views AFTER the primary + // — removing views before would shift scroll position. + #trimDistantViews() { + const { size } = this + if (!size) return + const maxDistance = size * 10 + const viewportEnd = this.#renderedEnd + for (const [index, view] of this.#sortedViews) { + if (index <= this.#primaryIndex) continue + const offset = this.#getViewOffset(index) + if (offset - viewportEnd > maxDistance) { + this.#destroyView(index) + } + } + } + #canGoToIndex(index) { + return index >= 0 && index <= this.sections.length - 1 + } + async #goTo({ index, anchor, select }) { + // Check if the target section has a different writing-mode. + // If direction changes, we must destroy all views and do a full + // rebuild via #display — mixed-direction views cannot coexist. + let directionChanged = false + if (this.#views.has(index)) { + const view = this.#views.get(index) + if (view?.document) { + const { vertical } = getDirection(view.document) + directionChanged = vertical !== this.#vertical + } + } else if (this.#directionCache.has(index)) { + directionChanged = this.#directionCache.get(index) !== this.#vertical + } + // When direction is unknown (not cached), #beforeRender will + // detect and clean up stale views if a change actually occurs. + + if (this.#views.has(index) && !directionChanged) { + // View already loaded — reuse it without + // clearing/reloading. Just change primary and scroll. + this.#stabilizing = true + this.#container.style.opacity = '0' + const hasFocus = this.#primaryView?.document?.hasFocus() + this.#primaryIndex = index + this.#syncA11y() + this.#trimDistantViews() + // Handle short section alignment + const primaryView = this.#primaryView + if (!this.noPreload && !this.noContinuousScroll && primaryView + && primaryView.contentPages > 0 + && primaryView.contentPages < this.columnCount) { + const sorted = this.#sortedViews + const firstIndex = sorted[0]?.[0] + if (firstIndex != null) { + const prevIdx = this.#adjacentIndex(-1, firstIndex) + if (prevIdx != null) { + await this.#loadAdjacentSection(prevIdx) + } + } + } + // In noContinuousScroll mode, destroy all non-primary views + if (this.noContinuousScroll) { + for (const [i] of this.#views) { + if (i !== index) this.#destroyView(i) + } + } + await this.scrollToAnchor((typeof anchor === 'function' + ? anchor(primaryView.document) : anchor) ?? 0, select) + this.#container.style.opacity = '1' + if (hasFocus) this.focusView() + // Load remaining adjacent sections progressively; + // keep #stabilizing true until fill completes + this.#fillPromise = this.#fillVisibleArea() + this.#fillPromise.then(() => { this.#stabilizing = false }) + } else { + // When direction changes, clear ALL views — no reuse possible + // across writing-mode boundaries. When direction is unknown + // (not yet cached), keep nearby views; #beforeRender will + // clean up if the loaded section turns out to differ. + if (directionChanged) { + this.#destroyAllViews() + } else { + const keep = new Set([index]) + if (!this.noContinuousScroll) { + for (const [i] of this.#views) { + if (Math.abs(i - index) <= 2) keep.add(i) + } + } + this.#clearViewsExcept(keep) + } + const oldIndex = this.#primaryIndex + const onLoad = detail => { + if (oldIndex >= 0 && !this.#views.has(oldIndex)) + this.sections[oldIndex]?.unload?.() + this.setStyles(this.#styles) + this.dispatchEvent(new CustomEvent('load', { detail })) + } + await this.#display(Promise.resolve(this.sections[index].load()) + .then(async src => { + const data = await this.sections[index].loadContent?.() + return { index, src, data, anchor, onLoad, select } + }).catch(e => { + console.warn(e) + console.warn(new Error(`Failed to load section ${index}`)) + return {} + })) + } + } + async goTo(target) { + if (this.#locked) return + const resolved = await target + if (this.#canGoToIndex(resolved.index)) return this.#goTo(resolved) + } + #scrollPrev(distance) { + if (this.#views.size === 0) return true + if (this.scrolled) { + if (this.#renderedStart > 0) return this.#scrollTo( + Math.max(0, this.#renderedStart - (distance ?? this.size)), null, true) + return !this.atStart + } + if (this.atStart) return + const page = this.#renderedPage - 1 + // Out of range — skip animation, go straight to previous section + if (page < 0) return true + return this.#scrollToPage(page, 'page', true) + } + #scrollNext(distance) { + if (this.#views.size === 0) return true + if (this.scrolled) { + if (this.#renderedViewSize - this.#renderedEnd > 2) return this.#scrollTo( + Math.min(this.#renderedViewSize, distance ? this.#renderedStart + distance : this.#renderedEnd), null, true) + return !this.atEnd + } + if (this.atEnd) return + const page = this.#renderedPage + 1 + const pages = this.#renderedPages + // Out of range — skip animation, go straight to next section + if (page >= pages) return true + return this.#scrollToPage(page, 'page', true) + } + get atStart() { + const sorted = this.#sortedViews + const firstIndex = sorted[0]?.[0] ?? this.#primaryIndex + if (this.scrolled) return this.#adjacentIndex(-1, firstIndex) == null && this.#renderedStart <= 0 + return this.#adjacentIndex(-1, firstIndex) == null && this.#renderedPage <= 0 + } + get atEnd() { + const sorted = this.#sortedViews + const lastIndex = sorted[sorted.length - 1]?.[0] ?? this.#primaryIndex + if (this.scrolled) return this.#adjacentIndex(1, lastIndex) == null && this.#renderedViewSize - this.#renderedEnd <= 2 + return this.#adjacentIndex(1, lastIndex) == null && this.#renderedPage >= this.#renderedPages - 1 + } + #adjacentIndex(dir, fromIndex) { + if (fromIndex === undefined) fromIndex = this.#primaryIndex + for (let index = fromIndex + dir; this.#canGoToIndex(index); index += dir) + if (this.sections[index]?.linear !== 'no') return index + } + async #turnPage(dir, distance) { + if (this.#locked) return + this.#locked = true + const prev = dir === -1 + const shouldGo = await (prev ? this.#scrollPrev(distance) : this.#scrollNext(distance)) + if (shouldGo) { + // Wait for any in-progress background pre-loading to complete — + // it may already be loading the section we need, so awaiting + // it lets #goTo reuse the view instead of loading from scratch + if (this.#fillPromise) await this.#fillPromise + const sorted = this.#sortedViews + const edgeIndex = prev + ? sorted[0]?.[0] ?? this.#primaryIndex + : sorted[sorted.length - 1]?.[0] ?? this.#primaryIndex + await this.#goTo({ + index: this.#adjacentIndex(dir, edgeIndex), + anchor: prev ? () => 1 : () => 0, + }) + } + if (shouldGo || !this.hasAttribute('animated')) await wait(100) + this.#locked = false + } + async prev(distance) { + return await this.#turnPage(-1, distance) + } + async next(distance) { + return await this.#turnPage(1, distance) + } + async pan(dx, dy) { + if (this.#locked) return + this.#locked = true + this.scrollBy(dx, dy) + this.#locked = false + } + prevSection() { + return this.goTo({ index: this.#adjacentIndex(-1) }) + } + nextSection() { + return this.goTo({ index: this.#adjacentIndex(1) }) + } + firstSection() { + const index = this.sections.findIndex(section => section.linear !== 'no') + return this.goTo({ index }) + } + lastSection() { + const index = this.sections.findLastIndex(section => section.linear !== 'no') + return this.goTo({ index }) + } + getContents() { + const contents = [] + for (const [index, view] of this.#sortedViews) { + if (view.document) contents.push({ + index, + overlayer: view.overlayer, + doc: view.document, + }) + } + return contents + } + setStyles(styles) { + this.#styles = styles + for (const [, view] of this.#views) { + const $$styles = this.#styleMap.get(view.document) + if (!$$styles) continue + const [$beforeStyle, $style] = $$styles + if (Array.isArray(styles)) { + const [beforeStyle, style] = styles + $beforeStyle.textContent = beforeStyle + $style.textContent = style + } else $style.textContent = styles + + // needed because the resize observer doesn't work in Firefox + view.document?.fonts?.ready?.then(() => view.expand()) + } + + // NOTE: needs `requestAnimationFrame` in Chromium + const primaryView = this.#primaryView + if (primaryView) { + requestAnimationFrame(() => this.#replaceBackground()) + } + } + focusView() { + this.#primaryView?.document?.defaultView?.focus() + } + showLoupe(winX, winY, { isVertical, color, gap, margin, radius, magnification }) { + this.#primaryView?.showLoupe(winX, winY, { isVertical, color, gap, margin, radius, magnification }) + } + hideLoupe() { + this.#primaryView?.hideLoupe() + } + destroyLoupe() { + this.#primaryView?.destroyLoupe() + } + destroy() { + this.#observer.unobserve(this) + this.#destroyAllViews() + this.#mediaQuery.removeEventListener('change', this.#mediaQueryListener) + } +} + +customElements.define('foliate-paginator', Paginator) diff --git a/web/vendor/foliate-js/pdf.js b/web/vendor/foliate-js/pdf.js new file mode 100644 index 00000000..c4d0df9c --- /dev/null +++ b/web/vendor/foliate-js/pdf.js @@ -0,0 +1,513 @@ +const pdfjsPath = path => `/vendor/pdfjs/${path}` + +import '@pdfjs/pdf.min.mjs' +const pdfjsLib = globalThis.pdfjsLib +pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsPath('pdf.worker.min.mjs') + +const fetchText = async url => await (await fetch(url)).text() + +let textLayerBuilderCSS = null +let annotationLayerBuilderCSS = null + +// Track active render tasks per iframe document to cancel superseded renders +const activeRenderTasks = new WeakMap() +// Generation counter per document to detect stale renders after async gaps +const renderGenerations = new WeakMap() + +// Set up panning and selection event handlers once per iframe document +const setupPanningEvents = (doc) => { + if (doc._readestEventsInitialized) return + doc._readestEventsInitialized = true + + const container = doc.querySelector('.textLayer') + if (!container) return + + let isPanning = false + let startX = 0 + let startY = 0 + let scrollLeft = 0 + let scrollTop = 0 + let scrollParent = null + + const findScrollableParent = (element) => { + let current = element + while (current) { + if (current !== document.body && current.nodeType === 1) { + const style = window.getComputedStyle(current) + const overflow = style.overflow + style.overflowY + style.overflowX + if (/(auto|scroll)/.test(overflow)) { + if (current.scrollHeight > current.clientHeight || + current.scrollWidth > current.clientWidth) { + return current + } + } + } + if (current.parentElement) { + current = current.parentElement + } else if (current.parentNode && current.parentNode.host) { + current = current.parentNode.host + } else { + break + } + } + return window + } + + container.onpointerdown = (e) => { + const selection = doc.getSelection() + const hasTextSelection = selection && selection.toString().length > 0 + + const elementUnderCursor = doc.elementFromPoint(e.clientX, e.clientY) + const hasTextUnderneath = elementUnderCursor && + (elementUnderCursor.tagName === 'SPAN' || elementUnderCursor.tagName === 'P') && + elementUnderCursor.textContent.trim().length > 0 + + if (!hasTextUnderneath && !hasTextSelection) { + isPanning = true + startX = e.screenX + startY = e.screenY + + const iframe = doc.defaultView?.frameElement + if (iframe) { + scrollParent = findScrollableParent(iframe) + if (scrollParent === window) { + scrollLeft = window.scrollX || window.pageXOffset + scrollTop = window.scrollY || window.pageYOffset + } else { + scrollLeft = scrollParent.scrollLeft + scrollTop = scrollParent.scrollTop + } + container.style.cursor = 'grabbing' + } + } else { + container.classList.add('selecting') + } + } + + container.onpointermove = (e) => { + if (isPanning && scrollParent) { + e.preventDefault() + + const dx = e.screenX - startX + const dy = e.screenY - startY + + if (scrollParent === window) { + window.scrollTo(scrollLeft - dx, scrollTop - dy) + } else { + scrollParent.scrollLeft = scrollLeft - dx + scrollParent.scrollTop = scrollTop - dy + } + } + } + + container.onpointerup = () => { + if (isPanning) { + isPanning = false + scrollParent = null + container.style.cursor = 'grab' + } else { + container.classList.remove('selecting') + } + } + + container.onpointerleave = () => { + if (isPanning) { + isPanning = false + scrollParent = null + container.style.cursor = 'grab' + } + } + + doc.addEventListener('selectionchange', () => { + const selection = doc.getSelection() + if (selection && selection.toString().length > 0) { + container.style.cursor = 'text' + } else if (!isPanning) { + container.style.cursor = 'grab' + } + }) + + container.style.cursor = 'grab' +} + +const render = async (page, doc, zoom, pageColors) => { + if (!doc) return + + // Increment generation to invalidate any in-progress render for this doc + const generation = (renderGenerations.get(doc) || 0) + 1 + renderGenerations.set(doc, generation) + + // Cancel any in-progress render task for this document + const existingTask = activeRenderTasks.get(doc) + if (existingTask) { + existingTask.cancel() + activeRenderTasks.delete(doc) + } + + const scale = zoom * devicePixelRatio + doc.documentElement.style.transform = `scale(${1 / devicePixelRatio})` + doc.documentElement.style.transformOrigin = 'top left' + doc.documentElement.style.setProperty('--total-scale-factor', scale) + doc.documentElement.style.setProperty('--user-unit', '1') + doc.documentElement.style.setProperty('--scale-round-x', '1px') + doc.documentElement.style.setProperty('--scale-round-y', '1px') + const viewport = page.getViewport({ scale }) + + // the canvas must be in the `PDFDocument`'s `ownerDocument` + // (`globalThis.document` by default); that's where the fonts are loaded + const canvas = document.createElement('canvas') + canvas.height = viewport.height + canvas.width = viewport.width + const canvasContext = canvas.getContext('2d') + const renderTask = page.render({ canvasContext, viewport, pageColors }) + activeRenderTasks.set(doc, renderTask) + + try { + await renderTask.promise + } catch { + // Render was cancelled or failed — release canvas bitmap memory + canvas.width = 0 + canvas.height = 0 + return + } finally { + if (activeRenderTasks.get(doc) === renderTask) { + activeRenderTasks.delete(doc) + } + } + + // Bail out if a newer render has started or iframe was removed + if (renderGenerations.get(doc) !== generation || !doc.defaultView) { + canvas.width = 0 + canvas.height = 0 + return + } + + const canvasElement = doc.querySelector('#canvas') + if (!canvasElement) { + canvas.width = 0 + canvas.height = 0 + return + } + + // Release old canvas bitmap memory before replacing + const oldCanvas = canvasElement.querySelector('canvas') + if (oldCanvas) { + oldCanvas.width = 0 + oldCanvas.height = 0 + } + canvasElement.replaceChildren(doc.adoptNode(canvas)) + + // Clear text layer before re-rendering to prevent DOM accumulation + const container = doc.querySelector('.textLayer') + container.replaceChildren() + const textLayer = new pdfjsLib.TextLayer({ + textContentSource: await page.streamTextContent(), + container, viewport, + }) + await textLayer.render() + + // Bail out if superseded after async text layer render + if (renderGenerations.get(doc) !== generation) return + + // hide "offscreen" canvases appended to document when rendering text layer + // https://github.com/mozilla/pdf.js/blob/642b9a5ae67ef642b9a8808fd9efd447e8c350e2/web/pdf_viewer.css#L51-L58 + for (const hiddenCanvas of document.querySelectorAll('.hiddenCanvasElement')) + Object.assign(hiddenCanvas.style, { + position: 'absolute', + top: '0', + left: '0', + width: '0', + height: '0', + display: 'none', + }) + + // fix text selection + // https://github.com/mozilla/pdf.js/blob/642b9a5ae67ef642b9a8808fd9efd447e8c350e2/web/text_layer_builder.js#L105-L107 + const endOfContent = document.createElement('div') + endOfContent.className = 'endOfContent' + container.append(endOfContent) + + // Set up panning/selection event handlers once per document + setupPanningEvents(doc) + + // Clear annotation layer before re-rendering to prevent DOM accumulation + const div = doc.querySelector('.annotationLayer') + div.replaceChildren() + const linkService = { + goToDestination: () => {}, + getDestinationHash: dest => JSON.stringify(dest), + addLinkAttributes: (link, url) => link.href = url, + } + await new pdfjsLib.AnnotationLayer({ page, viewport, div, linkService }).render({ + annotations: await page.getAnnotations(), + }) +} + +const renderPage = async (page, getImageBlob) => { + const viewport = page.getViewport({ scale: 1 }) + if (getImageBlob) { + const canvas = document.createElement('canvas') + canvas.height = viewport.height + canvas.width = viewport.width + const canvasContext = canvas.getContext('2d') + await page.render({ canvasContext, viewport }).promise + return new Promise(resolve => canvas.toBlob(blob => { + // Release canvas bitmap memory after extracting the blob + canvas.width = 0 + canvas.height = 0 + resolve(blob) + })) + } + // https://github.com/mozilla/pdf.js/blob/642b9a5ae67ef642b9a8808fd9efd447e8c350e2/web/text_layer_builder.css + if (textLayerBuilderCSS == null) { + textLayerBuilderCSS = await fetchText(pdfjsPath('text_layer_builder.css')) + } + // https://github.com/mozilla/pdf.js/blob/642b9a5ae67ef642b9a8808fd9efd447e8c350e2/web/annotation_layer_builder.css + if (annotationLayerBuilderCSS == null) { + annotationLayerBuilderCSS = await fetchText(pdfjsPath('annotation_layer_builder.css')) + } + const data = ` + + + + + +
    +
    +
    + ` + const src = URL.createObjectURL(new Blob([data], { type: 'text/html' })) + const onZoom = ({ doc, scale, pageColors }) => render(page, doc, scale, pageColors) + return { src, data, onZoom } +} + +const makeTOCItem = async (item, pdf) => { + let pageIndex = undefined + + if (item.dest) { + try { + const dest = typeof item.dest === 'string' + ? await pdf.getDestination(item.dest) + : item.dest + if (dest?.[0]) { + pageIndex = await pdf.getPageIndex(dest[0]) + } + } catch (e) { + console.warn('Failed to get page index for TOC item:', item.title, e) + } + } + + return { + label: item.title, + href: item.dest ? JSON.stringify(item.dest) : '', + index: pageIndex, + subitems: item.items?.length + ? await Promise.all(item.items.map(i => makeTOCItem(i, pdf))) + : null, + } +} + +const MAX_CACHED_PAGES = 8 + +const CALIBRE_NS = 'http://calibre-ebook.com/xmp-namespace' +const CALIBRE_SI_NS = 'http://calibre-ebook.com/xmp-namespace-series-index' +const RDF_NS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' + +// Calibre writes series metadata into the XMP packet as +// +// Name +// 1.00 +// +const parseCalibreSeriesFromXMP = raw => { + if (!raw || typeof raw !== 'string') return null + let doc + try { + doc = new DOMParser().parseFromString(raw, 'application/xml') + } catch { + return null + } + if (!doc || doc.getElementsByTagName('parsererror').length) return null + const seriesEls = doc.getElementsByTagNameNS(CALIBRE_NS, 'series') + const seriesEl = seriesEls.item(0) + if (!seriesEl) return null + const valueEl = seriesEl.getElementsByTagNameNS(RDF_NS, 'value').item(0) + const name = valueEl?.textContent?.trim() + if (!name) return null + const indexEl = seriesEl.getElementsByTagNameNS(CALIBRE_SI_NS, 'series_index').item(0) + const position = indexEl?.textContent?.trim() + return position ? { name, position } : { name } +} + +export const makePDF = async file => { + const transport = new pdfjsLib.PDFDataRangeTransport(file.size, []) + transport.requestDataRange = (begin, end) => { + file.slice(begin, end).arrayBuffer().then(chunk => { + transport.onDataRange(begin, chunk) + }) + } + const pdf = await pdfjsLib.getDocument({ + range: transport, + wasmUrl: pdfjsPath(''), + cMapUrl: pdfjsPath('cmaps/'), + standardFontDataUrl: pdfjsPath('standard_fonts/'), + isEvalSupported: false, + }).promise + + // Get viewport dimensions from first page for fixed-layout rendering + const firstPage = await pdf.getPage(1) + const firstViewport = firstPage.getViewport({ scale: 1 }) + const book = { rendition: { + layout: 'pre-paginated', + viewport: { width: firstViewport.width, height: firstViewport.height }, + } } + + const { metadata, info } = await pdf.getMetadata() ?? {} + // TODO: for better results, parse `metadata.getRaw()` + book.metadata = { + title: metadata?.get('dc:title') ?? info?.Title, + author: metadata?.get('dc:creator') ?? info?.Author, + contributor: metadata?.get('dc:contributor'), + description: metadata?.get('dc:description') ?? info?.Subject, + language: metadata?.get('dc:language'), + publisher: metadata?.get('dc:publisher'), + subject: metadata?.get('dc:subject'), + identifier: metadata?.get('dc:identifier'), + source: metadata?.get('dc:source'), + rights: metadata?.get('dc:rights'), + } + + const calibreSeries = parseCalibreSeriesFromXMP(metadata?.getRaw?.()) + if (calibreSeries) book.metadata.belongsTo = { series: calibreSeries } + + const outline = await pdf.getOutline() + book.toc = outline ? await Promise.all(outline.map(item => makeTOCItem(item, pdf))) : null + + const cache = new Map() + const pageCache = new Map() + const getPage = async (i) => { + const cached = pageCache.get(i) + if (cached) { + // Move to end for LRU ordering + pageCache.delete(i) + pageCache.set(i, cached) + return cached + } + const page = await pdf.getPage(i + 1) + pageCache.set(i, page) + + // Evict oldest pages when over limit, freeing internal page data + while (pageCache.size > MAX_CACHED_PAGES) { + const oldestKey = pageCache.keys().next().value + const oldPage = pageCache.get(oldestKey) + pageCache.delete(oldestKey) + oldPage?.cleanup() + } + + return page + } + book.sections = Array.from({ length: pdf.numPages }).map((_, i) => ({ + id: i, + load: async () => { + const cached = cache.get(i) + if (cached) { + // Move to end for LRU ordering + cache.delete(i) + cache.set(i, cached) + return cached + } + const url = await renderPage(await getPage(i)) + cache.set(i, url) + + // Evict oldest render results when over limit + while (cache.size > MAX_CACHED_PAGES) { + const oldestKey = cache.keys().next().value + const oldEntry = cache.get(oldestKey) + cache.delete(oldestKey) + if (oldEntry?.src) URL.revokeObjectURL(oldEntry.src) + } + + return url + }, + createDocument: async () => { + const page = await getPage(i) + const doc = document.implementation.createHTMLDocument('') + + const canvas = doc.createElement('div') + canvas.id = 'canvas' + doc.body.appendChild(canvas) + + const textLayer = doc.createElement('div') + textLayer.className = 'textLayer' + doc.body.appendChild(textLayer) + + const annotationLayer = doc.createElement('div') + annotationLayer.className = 'annotationLayer' + doc.body.appendChild(annotationLayer) + + // TextLayer requires canvas 2d context for font metrics; + // fall back to manual span construction when unavailable + const probe = doc.createElement('canvas') + if (probe.getContext?.('2d')) { + const textLayerInstance = new pdfjsLib.TextLayer({ + textContentSource: await page.streamTextContent(), + container: textLayer, viewport: page.getViewport({ scale: 1 }), + }) + await textLayerInstance.render() + } else { + const content = await page.getTextContent() + for (const item of content.items) { + if (item.str) { + const span = doc.createElement('span') + span.textContent = item.str + textLayer.appendChild(span) + } + } + } + return doc + }, + size: 1000, + })) + book.isExternal = uri => /^\w+:/i.test(uri) + book.resolveHref = async href => { + const parsed = JSON.parse(href) + const dest = typeof parsed === 'string' + ? await pdf.getDestination(parsed) : parsed + const index = await pdf.getPageIndex(dest[0]) + return { index } + } + book.splitTOCHref = async href => { + if (!href) return [null, null] + const parsed = JSON.parse(href) + const dest = typeof parsed === 'string' + ? await pdf.getDestination(parsed) : parsed + try { + const index = await pdf.getPageIndex(dest[0]) + return [index, null] + } catch (e) { + console.warn('Error getting page index for href', href, e) + return [null, null] + } + } + book.getTOCFragment = doc => doc.documentElement + book.getCover = async () => renderPage(await pdf.getPage(1), true) + book.destroy = () => { + // Clean up all cached canvases and revoke blob URLs + for (const [, entry] of cache) { + if (entry?.src) URL.revokeObjectURL(entry.src) + } + cache.clear() + for (const [, page] of pageCache) { + page?.cleanup() + } + pageCache.clear() + pdf.destroy() + } + return book +} diff --git a/web/vendor/foliate-js/progress.js b/web/vendor/foliate-js/progress.js new file mode 100644 index 00000000..ab0edc19 --- /dev/null +++ b/web/vendor/foliate-js/progress.js @@ -0,0 +1,224 @@ +// assign a unique ID for each TOC item +const assignIDs = toc => { + let id = 0 + const assignID = item => { + item.id = id++ + if (item.subitems) for (const subitem of item.subitems) assignID(subitem) + } + for (const item of toc) assignID(item) + return toc +} + +const flatten = items => items + .map(item => item.subitems?.length + ? [item, flatten(item.subitems)].flat() + : item) + .flat() + +export class TOCProgress { + async init({ toc, ids, splitHref, getFragment }) { + assignIDs(toc) + const items = flatten(toc) + const grouped = new Map() + for (const [i, item] of items.entries()) { + const [id, fragment] = await splitHref(item?.href) ?? [] + const value = { fragment, item } + if (grouped.has(id)) grouped.get(id).items.push(value) + else grouped.set(id, { prev: items[i - 1], items: [value] }) + } + const map = new Map() + for (const [i, id] of ids.entries()) { + if (grouped.has(id)) map.set(id, grouped.get(id)) + else map.set(id, map.get(ids[i - 1])) + } + this.ids = ids + this.map = map + this.getFragment = getFragment + } + getProgress(index, range) { + if (!this.ids) return + const id = this.ids[index] + const obj = this.map.get(id) + if (!obj) return null + const { prev, items } = obj + if (!items) return prev + if (!range || items.length === 1 && !items[0].fragment) return items[0].item + + const doc = range.startContainer.getRootNode() + for (const [i, { fragment }] of items.entries()) { + const el = this.getFragment(doc, fragment) + if (!el) continue + if (range.comparePoint(el, 0) > 0) + return (items[i - 1]?.item ?? prev) + } + return items[items.length - 1].item + } +} + +export class PageProgress { + #book + #cache = new Map() + #resolveNavigation + + constructor(book, resolveNavigation) { + this.#book = book + this.#resolveNavigation = resolveNavigation + } + + async #getCache(index) { + let cached = this.#cache.get(index) + if (cached) return cached + + const section = this.#book.sections[index] + if (!section?.createDocument) return null + + const doc = await section.createDocument() + const root = doc.body ?? doc.documentElement + const walker = doc.createTreeWalker(root, NodeFilter.SHOW_TEXT) + const nodes = [] + const offsets = [] + let total = 0 + for (let node = walker.nextNode(); node; node = walker.nextNode()) { + const len = node.nodeValue?.length ?? 0 + nodes.push(node) + offsets.push(total) + total += len + } + + cached = { doc, nodes, offsets, total } + this.#cache.set(index, cached) + return cached + } + + async getProgress(cfi) { + try { + const nav = this.#resolveNavigation(cfi) + if (!nav) return null + + const { index, anchor } = nav + if (index == null || !anchor) return null + + const cached = await this.#getCache(index) + if (!cached) return null + + const { doc, nodes, offsets, total } = cached + const frag = anchor(doc) + if (!frag) return null + + const isRange = frag instanceof Range + const range = isRange ? frag : doc.createRange() + if (!isRange) range.selectNodeContents(frag) + + const offset = this.#findOffset(range, nodes, offsets, total) + return { + fraction: total > 0 ? offset / total : 0, + index, + } + } catch (e) { + console.error(e) + return null + } + } + + #findOffset(range, nodes, offsets, total) { + if (!nodes.length) return 0 + const container = range.startContainer + // fast path: startContainer is a text node in the index + if (container.nodeType === Node.TEXT_NODE) { + const i = this.#bsearchNode(container, nodes) + if (i >= 0) return offsets[i] + range.startOffset + } + // element container: collapse to start and binary search + const collapsed = range.cloneRange() + collapsed.collapse(true) + const i = this.#bsearchCollapsed(collapsed, nodes) + return i >= 0 ? offsets[i] : total + } + + // binary search for an exact text node by document position + #bsearchNode(target, nodes) { + let low = 0, high = nodes.length - 1 + while (low <= high) { + const mid = (low + high) >> 1 + const node = nodes[mid] + if (node === target) return mid + const pos = node.compareDocumentPosition(target) + if (pos & Node.DOCUMENT_POSITION_FOLLOWING) low = mid + 1 + else high = mid - 1 + } + return -1 + } + + // binary search for the first text node at or after a collapsed range point + // collapsed.comparePoint returns: -1 = node is before, 1 = node is at/after + #bsearchCollapsed(collapsed, nodes) { + let low = 0, high = nodes.length - 1, result = -1 + while (low <= high) { + const mid = (low + high) >> 1 + if (collapsed.comparePoint(nodes[mid], 0) > 0) { + result = mid + high = mid - 1 + } else { + low = mid + 1 + } + } + return result + } +} + +export class SectionProgress { + constructor(sections, sizePerLoc, sizePerTimeUnit) { + this.sizes = sections.map(s => s.linear != 'no' && s.size > 0 ? s.size : 0) + this.sizePerLoc = sizePerLoc + this.sizePerTimeUnit = sizePerTimeUnit + this.sizeTotal = this.sizes.reduce((a, b) => a + b, 0) + this.sectionFractions = this.#getSectionFractions() + } + #getSectionFractions() { + const { sizeTotal } = this + const results = [0] + let sum = 0 + for (const size of this.sizes) results.push((sum += size) / sizeTotal) + return results + } + // get progress given index of and fractions within a section + getProgress(index, fractionInSection, pageFraction = 0) { + const { sizes, sizePerLoc, sizePerTimeUnit, sizeTotal } = this + const sizeInSection = sizes[index] ?? 0 + const sizeBefore = sizes.slice(0, index).reduce((a, b) => a + b, 0) + const size = sizeBefore + fractionInSection * sizeInSection + const nextSize = size + pageFraction * sizeInSection + const remainingTotal = sizeTotal - size + const remainingSection = (1 - fractionInSection) * sizeInSection + return { + fraction: nextSize / sizeTotal, + section: { + current: index, + total: sizes.length, + }, + location: { + current: Math.floor(size / sizePerLoc), + next: Math.floor(nextSize / sizePerLoc), + total: Math.ceil(sizeTotal / sizePerLoc), + }, + time: { + section: remainingSection / sizePerTimeUnit, + total: remainingTotal / sizePerTimeUnit, + }, + } + } + // the inverse of `getProgress` + // get index of and fraction in section based on total fraction + getSection(fraction) { + if (fraction <= 0) return [0, 0] + if (fraction >= 1) return [this.sizes.length - 1, 1] + fraction = fraction + Number.EPSILON + const { sizeTotal } = this + let index = this.sectionFractions.findIndex(x => x > fraction) - 1 + if (index < 0) return [0, 0] + while (!this.sizes[index]) index++ + const fractionInSection = (fraction - this.sectionFractions[index]) + / (this.sizes[index] / sizeTotal) + return [index, fractionInSection] + } +} diff --git a/web/vendor/foliate-js/quote-image.js b/web/vendor/foliate-js/quote-image.js new file mode 100644 index 00000000..1336c59e --- /dev/null +++ b/web/vendor/foliate-js/quote-image.js @@ -0,0 +1,86 @@ +const SVG_NS = 'http://www.w3.org/2000/svg' + +// bisect +const fit = (el, a = 1, b = 50) => { + const c = Math.floor(a + (b - a) / 2) + el.style.fontSize = `${c}px` + if (b - a === 1) return + if (el.scrollHeight > el.clientHeight + || el.scrollWidth > el.clientWidth) fit(el, a, c) + else fit(el, c, b) +} + +const width = 540 +const height = 540 +const pixelRatio = 2 + +const html = ` +
    + +
    “
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
     
    +
    ` + +// TODO: lang, vertical writing +customElements.define('foliate-quoteimage', class extends HTMLElement { + #root = this.attachShadow({ mode: 'closed' }) + constructor() { + super() + this.#root.innerHTML = html + } + async getBlob({ title, author, text }) { + this.#root.querySelector('#title').textContent = title + this.#root.querySelector('#author').textContent = author + this.#root.querySelector('#text').innerText = text + + fit(this.#root.querySelector('main')) + + const img = document.createElement('img') + return new Promise(resolve => { + img.onload = () => { + const canvas = document.createElement('canvas') + canvas.width = pixelRatio * width + canvas.height = pixelRatio * height + const ctx = canvas.getContext('2d') + ctx.drawImage(img, 0, 0, canvas.width, canvas.height) + canvas.toBlob(resolve) + } + const doc = document.implementation.createDocument(SVG_NS, 'svg') + doc.documentElement.setAttribute('viewBox', `0 0 ${width} ${height}`) + const obj = doc.createElementNS(SVG_NS, 'foreignObject') + obj.setAttribute('width', width) + obj.setAttribute('height', height) + obj.append(doc.importNode(this.#root.querySelector('main'), true)) + doc.documentElement.append(obj) + img.src = 'data:image/svg+xml;charset=utf-8,' + + new XMLSerializer().serializeToString(doc) + }) + } +}) diff --git a/web/vendor/foliate-js/reader.js b/web/vendor/foliate-js/reader.js new file mode 100644 index 00000000..f62102c4 --- /dev/null +++ b/web/vendor/foliate-js/reader.js @@ -0,0 +1,239 @@ +import './view.js' +import { createTOCView } from './ui/tree.js' +import { createMenu } from './ui/menu.js' +import { Overlayer } from './overlayer.js' + +const getCSS = ({ spacing, justify, hyphenate }) => ` + @namespace epub "http://www.idpf.org/2007/ops"; + html { + color-scheme: light dark; + } + /* https://github.com/whatwg/html/issues/5426 */ + @media (prefers-color-scheme: dark) { + a:link { + color: lightblue; + } + } + p, li, blockquote, dd { + line-height: ${spacing}; + text-align: ${justify ? 'justify' : 'start'}; + -webkit-hyphens: ${hyphenate ? 'auto' : 'manual'}; + hyphens: ${hyphenate ? 'auto' : 'manual'}; + -webkit-hyphenate-limit-before: 3; + -webkit-hyphenate-limit-after: 2; + -webkit-hyphenate-limit-lines: 2; + hanging-punctuation: allow-end last; + widows: 2; + } + /* prevent the above from overriding the align attribute */ + [align="left"] { text-align: left; } + [align="right"] { text-align: right; } + [align="center"] { text-align: center; } + [align="justify"] { text-align: justify; } + + pre { + white-space: pre-wrap !important; + } + aside[epub|type~="endnote"], + aside[epub|type~="footnote"], + aside[epub|type~="note"], + aside[epub|type~="rearnote"] { + display: none; + } +` + +const $ = document.querySelector.bind(document) + +const locales = 'en' +const percentFormat = new Intl.NumberFormat(locales, { style: 'percent' }) +const listFormat = new Intl.ListFormat(locales, { style: 'short', type: 'conjunction' }) + +const formatLanguageMap = x => { + if (!x) return '' + if (typeof x === 'string') return x + const keys = Object.keys(x) + return x[keys[0]] +} + +const formatOneContributor = contributor => typeof contributor === 'string' + ? contributor : formatLanguageMap(contributor?.name) + +const formatContributor = contributor => Array.isArray(contributor) + ? listFormat.format(contributor.map(formatOneContributor)) + : formatOneContributor(contributor) + +class Reader { + #tocView + style = { + spacing: 1.4, + justify: true, + hyphenate: true, + } + annotations = new Map() + annotationsByValue = new Map() + closeSideBar() { + $('#dimming-overlay').classList.remove('show') + $('#side-bar').classList.remove('show') + } + constructor() { + $('#side-bar-button').addEventListener('click', () => { + $('#dimming-overlay').classList.add('show') + $('#side-bar').classList.add('show') + }) + $('#dimming-overlay').addEventListener('click', () => this.closeSideBar()) + + const menu = createMenu([ + { + name: 'layout', + label: 'Layout', + type: 'radio', + items: [ + ['Paginated', 'paginated'], + ['Scrolled', 'scrolled'], + ], + onclick: value => { + this.view?.renderer.setAttribute('flow', value) + }, + }, + ]) + menu.element.classList.add('menu') + + $('#menu-button').append(menu.element) + $('#menu-button > button').addEventListener('click', () => + menu.element.classList.toggle('show')) + menu.groups.layout.select('paginated') + } + async open(file) { + this.view = document.createElement('foliate-view') + document.body.append(this.view) + await this.view.open(file) + this.view.addEventListener('load', this.#onLoad.bind(this)) + this.view.addEventListener('relocate', this.#onRelocate.bind(this)) + + const { book } = this.view + book.transformTarget?.addEventListener('data', ({ detail }) => { + detail.data = Promise.resolve(detail.data).catch(e => { + console.error(new Error(`Failed to load ${detail.name}`, { cause: e })) + return '' + }) + }) + this.view.renderer.setStyles?.(getCSS(this.style)) + this.view.renderer.next() + + $('#header-bar').style.visibility = 'visible' + $('#nav-bar').style.visibility = 'visible' + $('#left-button').addEventListener('click', () => this.view.goLeft()) + $('#right-button').addEventListener('click', () => this.view.goRight()) + + const slider = $('#progress-slider') + slider.dir = book.dir + slider.addEventListener('input', e => + this.view.goToFraction(parseFloat(e.target.value))) + for (const fraction of this.view.getSectionFractions()) { + const option = document.createElement('option') + option.value = fraction + $('#tick-marks').append(option) + } + + document.addEventListener('keydown', this.#handleKeydown.bind(this)) + + const title = formatLanguageMap(book.metadata?.title) || 'Untitled Book' + document.title = title + $('#side-bar-title').innerText = title + $('#side-bar-author').innerText = formatContributor(book.metadata?.author) + Promise.resolve(book.getCover?.())?.then(blob => + blob ? $('#side-bar-cover').src = URL.createObjectURL(blob) : null) + + const toc = book.toc + if (toc) { + this.#tocView = createTOCView(toc, href => { + this.view.goTo(href).catch(e => console.error(e)) + this.closeSideBar() + }) + $('#toc-view').append(this.#tocView.element) + } + + // load and show highlights embedded in the file by Calibre + const bookmarks = await book.getCalibreBookmarks?.() + if (bookmarks) { + const { fromCalibreHighlight } = await import('./epubcfi.js') + for (const obj of bookmarks) { + if (obj.type === 'highlight') { + const value = fromCalibreHighlight(obj) + const color = obj.style.which + const note = obj.notes + const annotation = { value, color, note } + const list = this.annotations.get(obj.spine_index) + if (list) list.push(annotation) + else this.annotations.set(obj.spine_index, [annotation]) + this.annotationsByValue.set(value, annotation) + } + } + this.view.addEventListener('create-overlay', e => { + const { index } = e.detail + const list = this.annotations.get(index) + if (list) for (const annotation of list) + this.view.addAnnotation(annotation) + }) + this.view.addEventListener('draw-annotation', e => { + const { draw, annotation } = e.detail + const { color } = annotation + draw(Overlayer.highlight, { color }) + }) + this.view.addEventListener('show-annotation', e => { + const annotation = this.annotationsByValue.get(e.detail.value) + if (annotation.note) alert(annotation.note) + }) + } + } + #handleKeydown(event) { + const k = event.key + if (k === 'ArrowLeft' || k === 'h') this.view.goLeft() + else if(k === 'ArrowRight' || k === 'l') this.view.goRight() + } + #onLoad({ detail: { doc } }) { + doc.addEventListener('keydown', this.#handleKeydown.bind(this)) + } + #onRelocate({ detail }) { + const { fraction, location, tocItem, pageItem } = detail + const percent = percentFormat.format(fraction) + const loc = pageItem + ? `Page ${pageItem.label}` + : `Loc ${location.current}` + const slider = $('#progress-slider') + slider.style.visibility = 'visible' + slider.value = fraction + slider.title = `${percent} · ${loc}` + if (tocItem?.href) this.#tocView?.setCurrentHref?.(tocItem.href) + } +} + +const open = async file => { + document.body.removeChild($('#drop-target')) + const reader = new Reader() + globalThis.reader = reader + await reader.open(file) +} + +const dragOverHandler = e => e.preventDefault() +const dropHandler = e => { + e.preventDefault() + const item = Array.from(e.dataTransfer.items) + .find(item => item.kind === 'file') + if (item) { + const entry = item.webkitGetAsEntry() + open(entry.isFile ? item.getAsFile() : entry).catch(e => console.error(e)) + } +} +const dropTarget = $('#drop-target') +dropTarget.addEventListener('drop', dropHandler) +dropTarget.addEventListener('dragover', dragOverHandler) + +$('#file-input').addEventListener('change', e => + open(e.target.files[0]).catch(e => console.error(e))) +$('#file-button').addEventListener('click', () => $('#file-input').click()) + +const params = new URLSearchParams(location.search) +const url = params.get('url') +if (url) open(url).catch(e => console.error(e)) +else dropTarget.style.visibility = 'visible' diff --git a/web/vendor/foliate-js/search.js b/web/vendor/foliate-js/search.js new file mode 100644 index 00000000..a6f176ff --- /dev/null +++ b/web/vendor/foliate-js/search.js @@ -0,0 +1,130 @@ +// length for context in excerpts +const CONTEXT_LENGTH = 50 + +const normalizeWhitespace = str => str.replace(/\s+/g, ' ') + +const makeExcerpt = (strs, { startIndex, startOffset, endIndex, endOffset }) => { + const start = strs[startIndex] + const end = strs[endIndex] + const match = start === end + ? start.slice(startOffset, endOffset) + : start.slice(startOffset) + + strs.slice(start + 1, end).join('') + + end.slice(0, endOffset) + const trimmedStart = normalizeWhitespace(start.slice(0, startOffset)).trimStart() + const trimmedEnd = normalizeWhitespace(end.slice(endOffset)).trimEnd() + const ellipsisPre = trimmedStart.length < CONTEXT_LENGTH ? '' : '…' + const ellipsisPost = trimmedEnd.length < CONTEXT_LENGTH ? '' : '…' + const pre = `${ellipsisPre}${trimmedStart.slice(-CONTEXT_LENGTH)}` + const post = `${trimmedEnd.slice(0, CONTEXT_LENGTH)}${ellipsisPost}` + return { pre, match, post } +} + +const simpleSearch = function* (strs, query, options = {}) { + const { locales = 'en', sensitivity } = options + const matchCase = sensitivity === 'variant' + const haystack = strs.join('') + const lowerHaystack = matchCase ? haystack : haystack.toLocaleLowerCase(locales) + const needle = matchCase ? query : query.toLocaleLowerCase(locales) + const needleLength = needle.length + let index = -1 + let strIndex = -1 + let sum = 0 + do { + index = lowerHaystack.indexOf(needle, index + 1) + if (index > -1) { + while (sum <= index) sum += strs[++strIndex].length + const startIndex = strIndex + const startOffset = index - (sum - strs[strIndex].length) + const end = index + needleLength + while (sum <= end) sum += strs[++strIndex].length + const endIndex = strIndex + const endOffset = end - (sum - strs[strIndex].length) + const range = { startIndex, startOffset, endIndex, endOffset } + yield { range, excerpt: makeExcerpt(strs, range) } + } + } while (index > -1) +} + +const segmenterSearch = function* (strs, query, options = {}) { + const { locales = 'en', granularity = 'word', sensitivity = 'base' } = options + let segmenter, collator + try { + segmenter = new Intl.Segmenter(locales, { usage: 'search', granularity }) + collator = new Intl.Collator(locales, { sensitivity }) + } catch (e) { + console.warn(e) + segmenter = new Intl.Segmenter('en', { usage: 'search', granularity }) + collator = new Intl.Collator('en', { sensitivity }) + } + const queryLength = Array.from(segmenter.segment(query)).length + + const substrArr = [] + let strIndex = 0 + let segments = segmenter.segment(strs[strIndex])[Symbol.iterator]() + main: while (strIndex < strs.length) { + while (substrArr.length < queryLength) { + const { done, value } = segments.next() + if (done) { + // the current string is exhausted + // move on to the next string + strIndex++ + if (strIndex < strs.length) { + segments = segmenter.segment(strs[strIndex])[Symbol.iterator]() + continue + } else break main + } + const { index, segment } = value + // ignore formatting characters + if (!/[^\p{Format}]/u.test(segment)) continue + // normalize whitespace + if (/\s/u.test(segment)) { + if (!/\s/u.test(substrArr[substrArr.length - 1]?.segment)) + substrArr.push({ strIndex, index, segment: ' ' }) + continue + } + value.strIndex = strIndex + substrArr.push(value) + } + const substr = substrArr.map(x => x.segment).join('') + if (collator.compare(query, substr) === 0) { + const endIndex = strIndex + const lastSeg = substrArr[substrArr.length - 1] + const endOffset = lastSeg.index + lastSeg.segment.length + const startIndex = substrArr[0].strIndex + const startOffset = substrArr[0].index + const range = { startIndex, startOffset, endIndex, endOffset } + yield { range, excerpt: makeExcerpt(strs, range) } + } + substrArr.shift() + } +} + +export const search = (strs, query, options) => { + const { granularity = 'grapheme', sensitivity = 'base' } = options + if (!Intl?.Segmenter || granularity === 'grapheme' + && (sensitivity === 'variant' || sensitivity === 'accent')) + return simpleSearch(strs, query, options) + return segmenterSearch(strs, query, options) +} + +export const searchMatcher = (textWalker, opts) => { + const { defaultLocale, matchCase, matchDiacritics, matchWholeWords, acceptNode } = opts + return function* (doc, query) { + const iter = textWalker(doc, function* (strs, makeRange) { + for (const result of search(strs, query, { + locales: doc.body.lang || doc.documentElement.lang || defaultLocale || 'en', + granularity: matchWholeWords ? 'word' : 'grapheme', + sensitivity: matchDiacritics && matchCase ? 'variant' + : matchDiacritics && !matchCase ? 'accent' + : !matchDiacritics && matchCase ? 'case' + : 'base', + })) { + const { startIndex, startOffset, endIndex, endOffset } = result.range + result.range = makeRange(startIndex, startOffset, endIndex, endOffset) + yield result + } + }, acceptNode) + for (const result of iter) yield result + } +} diff --git a/web/vendor/foliate-js/text-walker.js b/web/vendor/foliate-js/text-walker.js new file mode 100644 index 00000000..c1249b79 --- /dev/null +++ b/web/vendor/foliate-js/text-walker.js @@ -0,0 +1,43 @@ +const walkRange = (range, walker) => { + const nodes = [] + for (let node = walker.currentNode; node; node = walker.nextNode()) { + const compare = range.comparePoint(node, 0) + if (compare === 0) nodes.push(node) + else if (compare > 0) break + } + return nodes +} + +const walkDocument = (_, walker) => { + const nodes = [] + for (let node = walker.nextNode(); node; node = walker.nextNode()) + nodes.push(node) + return nodes +} + +const filter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT + | NodeFilter.SHOW_CDATA_SECTION + +const acceptNode = node => { + if (node.nodeType === 1) { + const name = node.tagName.toLowerCase() + if (name === 'script' || name === 'style') return NodeFilter.FILTER_REJECT + return NodeFilter.FILTER_SKIP + } + return NodeFilter.FILTER_ACCEPT +} + +export const textWalker = function* (x, func, filterFunc) { + const root = x.commonAncestorContainer ?? x.body ?? x + const walker = document.createTreeWalker(root, filter, { acceptNode: filterFunc || acceptNode }) + const walk = x.commonAncestorContainer ? walkRange : walkDocument + const nodes = walk(x, walker) + const strs = nodes.map(node => node.nodeValue ?? '') + const makeRange = (startIndex, startOffset, endIndex, endOffset) => { + const range = document.createRange() + range.setStart(nodes[startIndex], startOffset) + range.setEnd(nodes[endIndex], endOffset) + return range + } + for (const match of func(strs, makeRange)) yield match +} diff --git a/web/vendor/foliate-js/tts.js b/web/vendor/foliate-js/tts.js new file mode 100644 index 00000000..76e10493 --- /dev/null +++ b/web/vendor/foliate-js/tts.js @@ -0,0 +1,450 @@ +const NS = { + XML: 'http://www.w3.org/XML/1998/namespace', + SSML: 'http://www.w3.org/2001/10/synthesis', +} + +const blockTags = new Set([ + 'article', 'aside', 'audio', 'blockquote', 'caption', + 'details', 'dialog', 'div', 'dl', 'dt', 'dd', + 'figure', 'footer', 'form', 'figcaption', + 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'li', + 'main', 'math', 'nav', 'ol', 'p', 'pre', 'section', 'tr', +]) + +const getLang = el => { + const x = el.lang || el?.getAttributeNS?.(NS.XML, 'lang') + return x ? x : el.parentElement ? getLang(el.parentElement) : null +} + +const getAlphabet = el => { + const x = el?.getAttributeNS?.(NS.XML, 'lang') + return x ? x : el.parentElement ? getAlphabet(el.parentElement) : null +} + +const getSegmenter = (lang, granularity = 'word') => { + const segmenter = new Intl.Segmenter(lang || undefined, { granularity }) + const granularityIsWord = granularity === 'word' + return function* (strs, makeRange) { + const str = strs.join('').replace(/\r\n/g, ' ').replace(/\r/g, ' ').replace(/\n/g, ' ') + let name = 0 + let strIndex = -1 + let sum = 0 + const rawSegments = Array.from(segmenter.segment(str)) + const mergedSegments = [] + for (let i = 0, j = 0; i < rawSegments.length; i++) { + const current = rawSegments[i] + const segment = ' ' + current.segment + const endsWithAbbr = /\s([A-Z]{1,2}[a-z]{0,5}|[a-z]{1,3})\.\s*$/.test(segment) + if (!endsWithAbbr || i >= (rawSegments.length-1)) { + const mergedSegment = { + index: rawSegments[j].index, + segment: '', + isWordLike: (i == j) ? current.isWordLike : true, + } + while (j <= i) { + mergedSegment.segment += rawSegments[j++].segment + } + mergedSegments.push(mergedSegment) + } + } + + for (const { index, segment, isWordLike } of mergedSegments) { + if (granularityIsWord && !isWordLike) continue + while (sum <= index) sum += strs[++strIndex].length + const startIndex = strIndex + const startOffset = index - (sum - strs[strIndex].length) + const end = index + segment.length - 1 + if (end < str.length) while (sum <= end) sum += strs[++strIndex].length + const endIndex = strIndex + const endOffset = end - (sum - strs[strIndex].length) + 1 + yield [(name++).toString(), + makeRange(startIndex, startOffset, endIndex, endOffset)] + } + } +} + +const fragmentToSSML = (fragment, nodeFilter, inherited) => { + const ssml = document.implementation.createDocument(NS.SSML, 'speak') + const { lang } = inherited + if (lang) ssml.documentElement.setAttributeNS(NS.XML, 'lang', lang) + + const convert = (node, parent, inheritedAlphabet) => { + if (!node) return + if (node.nodeType === 3) return ssml.createTextNode(node.textContent) + if (node.nodeType === 4) return ssml.createCDATASection(node.textContent) + if (node.nodeType !== 1 && node.nodeType !== 11) return + if (nodeFilter && nodeFilter(node) === NodeFilter.FILTER_REJECT) return + + let el + const nodeName = node.nodeName.toLowerCase() + if (nodeName === 'foliate-mark') { + el = ssml.createElementNS(NS.SSML, 'mark') + el.setAttribute('name', node.dataset.name) + } + else if (nodeName === 'br') + el = ssml.createElementNS(NS.SSML, 'break') + else if (nodeName === 'em' || nodeName === 'strong') + el = ssml.createElementNS(NS.SSML, 'emphasis') + + const lang = node.lang || node.getAttributeNS?.(NS.XML, 'lang') + if (lang) { + if (!el) el = ssml.createElementNS(NS.SSML, 'lang') + el.setAttributeNS(NS.XML, 'lang', lang) + } + + const alphabet = node.getAttributeNS?.(NS.SSML, 'alphabet') || inheritedAlphabet + if (!el) { + const ph = node.getAttributeNS?.(NS.SSML, 'ph') + if (ph) { + el = ssml.createElementNS(NS.SSML, 'phoneme') + if (alphabet) el.setAttribute('alphabet', alphabet) + el.setAttribute('ph', ph) + } + } + + if (!el) el = parent + + let child = node.firstChild + while (child) { + const childEl = convert(child, el, alphabet) + if (childEl && el !== childEl) el.append(childEl) + child = child.nextSibling + } + return el + } + convert(fragment, ssml.documentElement, inherited.alphabet) + return ssml +} + +const getFragmentWithMarks = (range, textWalker, nodeFilter, granularity) => { + const lang = getLang(range.commonAncestorContainer) + const alphabet = getAlphabet(range.commonAncestorContainer) + + const segmenter = getSegmenter(lang, granularity) + const fragment = range.cloneContents() + + // we need ranges on both the original document (for highlighting) + // and the document fragment (for inserting marks) + // so unfortunately need to do it twice, as you can't copy the ranges + const entries = [...textWalker(range, segmenter, nodeFilter)] + const fragmentEntries = [...textWalker(fragment, segmenter, nodeFilter)] + + for (const [name, range] of fragmentEntries) { + const mark = document.createElement('foliate-mark') + mark.dataset.name = name + range.insertNode(mark) + } + const ssml = fragmentToSSML(fragment, nodeFilter, { lang, alphabet }) + return { entries, ssml } +} + +const rangeIsEmpty = range => !range.toString().trim() + +// For PDF text layers, split content into sentence-level blocks so TTS +// reads one sentence at a time instead of the whole page in one block. +// Text nodes are split at sentence boundaries so that every block range +// aligns with node edges — this prevents the text walker from including +// text outside the sentence in word marks. +function* getPDFSentenceBlocks(doc, textLayer) { + const collectNodes = () => { + const w = doc.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT) + const res = [] + for (let n = w.nextNode(); n; n = w.nextNode()) res.push(n) + return res + } + + let nodes = collectNodes() + if (!nodes.length) return + + const fullText = nodes.map(n => n.nodeValue).join('') + if (!fullText.trim()) return + + // Find sentence boundary positions + const lang = getLang(textLayer) || undefined + const segmenter = new Intl.Segmenter(lang, { granularity: 'sentence' }) + const boundaries = new Set() + for (const { index } of segmenter.segment(fullText)) + if (index > 0) boundaries.add(index) + + // Split text nodes at sentence boundaries so ranges align with node edges. + // Process in reverse order to preserve earlier character positions. + let cum = 0 + const nodeStarts = nodes.map(n => { const s = cum; cum += n.nodeValue.length; return s }) + + for (const pos of [...boundaries].sort((a, b) => b - a)) { + for (let i = 0; i < nodes.length; i++) { + const start = nodeStarts[i] + const end = start + nodes[i].nodeValue.length + if (pos > start && pos < end) { + nodes[i].splitText(pos - start) + break + } + } + } + + // Re-collect nodes after splits and group into sentence blocks + nodes = collectNodes() + cum = 0 + let groupStart = 0 + let blockCount = 0 + + for (let i = 0; i < nodes.length; i++) { + cum += nodes[i].nodeValue.length + const isEnd = i === nodes.length - 1 || boundaries.has(cum) + if (isEnd) { + const range = doc.createRange() + range.setStart(nodes[groupStart], 0) + range.setEnd(nodes[i], nodes[i].nodeValue.length) + if (!rangeIsEmpty(range)) { + blockCount++ + yield range + } + groupStart = i + 1 + } + } +} + +function* getBlocks(doc) { + const root = doc.body + ?? doc.querySelector('body') + ?? doc.documentElement + + // For PDF text layers, yield sentence-level blocks + const textLayer = root.querySelector?.('.textLayer') + if (textLayer) { + yield* getPDFSentenceBlocks(doc, textLayer) + return + } + + let last + const walker = doc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT) + for (let node = walker.nextNode(); node; node = walker.nextNode()) { + const name = node.tagName.toLowerCase() + if (blockTags.has(name)) { + if (last) { + last.setEndBefore(node) + if (!rangeIsEmpty(last)) yield last + } + last = doc.createRange() + last.setStart(node, 0) + } + } + if (!last) { + last = doc.createRange() + last.setStart(root.firstChild ?? root, 0) + } + last.setEndAfter(root.lastChild ?? root) + if (!rangeIsEmpty(last)) yield last +} + +class ListIterator { + #arr = [] + #iter + #index = -1 + #f + constructor(iter, f = x => x) { + this.#iter = iter + this.#f = f + } + current() { + if (this.#arr[this.#index]) return this.#f(this.#arr[this.#index]) + } + first() { + const newIndex = 0 + if (this.#arr[newIndex]) { + this.#index = newIndex + return this.#f(this.#arr[newIndex]) + } + } + prev() { + const newIndex = this.#index - 1 + if (this.#arr[newIndex]) { + this.#index = newIndex + return this.#f(this.#arr[newIndex]) + } + } + next() { + const newIndex = this.#index + 1 + if (this.#arr[newIndex]) { + this.#index = newIndex + return this.#f(this.#arr[newIndex]) + } + while (true) { + const { done, value } = this.#iter.next() + if (done) break + this.#arr.push(value) + if (this.#arr[newIndex]) { + this.#index = newIndex + return this.#f(this.#arr[newIndex]) + } + } + } + find(f) { + const index = this.#arr.findIndex(x => f(x)) + if (index > -1) { + this.#index = index + return this.#f(this.#arr[index]) + } + while (true) { + const { done, value } = this.#iter.next() + if (done) break + this.#arr.push(value) + if (f(value)) { + this.#index = this.#arr.length - 1 + return this.#f(value) + } + } + } +} + +export class TTS { + #list + #ranges + #lastMark + #serializer = new XMLSerializer() + constructor(doc, textWalker, nodeFilter, highlight, granularity) { + this.doc = doc + this.highlight = highlight + this.#list = new ListIterator(getBlocks(doc), range => { + const { entries, ssml } = getFragmentWithMarks(range, textWalker, nodeFilter, granularity) + this.#ranges = new Map(entries) + return [ssml, range] + }) + } + #getMarkElement(doc, mark) { + if (!mark) return null + return doc.querySelector(`mark[name="${CSS.escape(mark)}"`) + } + #speak(doc, getNode) { + if (!doc) return + if (!getNode) return this.#serializer.serializeToString(doc) + const ssml = document.implementation.createDocument(NS.SSML, 'speak') + ssml.documentElement.replaceWith(ssml.importNode(doc.documentElement, true)) + let node = getNode(ssml)?.previousSibling + while (node) { + const next = node.previousSibling ?? node.parentNode?.previousSibling + node.parentNode.removeChild(node) + node = next + } + const ssmlStr = this.#serializer.serializeToString(ssml) + return ssmlStr + } + start() { + this.#lastMark = null + const [doc] = this.#list.first() ?? [] + if (!doc) return this.next() + return this.#speak(doc, ssml => this.#getMarkElement(ssml, this.#lastMark)) + } + resume() { + const [doc] = this.#list.current() ?? [] + if (!doc) return this.next() + return this.#speak(doc, ssml => this.#getMarkElement(ssml, this.#lastMark)) + } + prev(paused) { + this.#lastMark = null + const [doc, range] = this.#list.prev() ?? [] + if (paused && range) this.highlight(range.cloneRange()) + return this.#speak(doc) + } + next(paused) { + this.#lastMark = null + const [doc, range] = this.#list.next() ?? [] + if (paused && range) this.highlight(range.cloneRange()) + return this.#speak(doc) + } + prevMark(paused) { + const marks = Array.from(this.#ranges.keys()) + if (marks.length === 0) return + + const currentIndex = this.#lastMark ? marks.indexOf(this.#lastMark) : -1 + if (currentIndex > 0) { + const prevMarkName = marks[currentIndex - 1] + const range = this.#ranges.get(prevMarkName) + if (range) { + this.#lastMark = prevMarkName + if (paused) this.highlight(range.cloneRange()) + + const [doc] = this.#list.current() ?? [] + return this.#speak(doc, ssml => this.#getMarkElement(ssml, prevMarkName)) + } + } else { + const [doc, range] = this.#list.prev() ?? [] + if (doc && range) { + const prevMarks = Array.from(this.#ranges.keys()) + if (prevMarks.length > 0) { + const lastMarkName = prevMarks[prevMarks.length - 1] + const lastMarkRange = this.#ranges.get(lastMarkName) + if (lastMarkRange) { + this.#lastMark = lastMarkName + if (paused) this.highlight(lastMarkRange.cloneRange()) + return this.#speak(doc, ssml => this.#getMarkElement(ssml, lastMarkName)) + } + } else { + this.#lastMark = null + if (paused) this.highlight(range.cloneRange()) + return this.#speak(doc) + } + } + } + } + nextMark(paused) { + const marks = Array.from(this.#ranges.keys()) + if (marks.length === 0) return + + const currentIndex = this.#lastMark ? marks.indexOf(this.#lastMark) : -1 + if (currentIndex >= 0 && currentIndex < marks.length - 1) { + const nextMarkName = marks[currentIndex + 1] + const range = this.#ranges.get(nextMarkName) + if (range) { + this.#lastMark = nextMarkName + if (paused) this.highlight(range.cloneRange()) + const [doc] = this.#list.current() ?? [] + return this.#speak(doc, ssml => this.#getMarkElement(ssml, nextMarkName)) + } + } else { + const [doc, range] = this.#list.next() ?? [] + if (doc && range) { + const nextMarks = Array.from(this.#ranges.keys()) + if (nextMarks.length > 0) { + const firstMarkName = nextMarks[0] + const firstMarkRange = this.#ranges.get(firstMarkName) + if (firstMarkRange) { + this.#lastMark = firstMarkName + if (paused) this.highlight(firstMarkRange.cloneRange()) + return this.#speak(doc, ssml => this.#getMarkElement(ssml, firstMarkName)) + } + } else { + this.#lastMark = null + if (paused) this.highlight(range.cloneRange()) + return this.#speak(doc) + } + } + } + } + from(range) { + this.#lastMark = null + const [doc] = this.#list.find(range_ => + range.compareBoundaryPoints(Range.END_TO_START, range_) <= 0) + let mark + for (const [name, range_] of this.#ranges.entries()) + if (range.compareBoundaryPoints(Range.START_TO_START, range_) <= 0) { + mark = name + break + } + return this.#speak(doc, ssml => this.#getMarkElement(ssml, mark)) + } + getLastRange() { + if (this.#lastMark) { + const range = this.#ranges.get(this.#lastMark) + if (range) return range.cloneRange() + } + } + setMark(mark) { + const range = this.#ranges.get(mark) + if (range) { + this.#lastMark = mark + this.highlight(range.cloneRange()) + return range + } + } +} diff --git a/web/vendor/foliate-js/uri-template.js b/web/vendor/foliate-js/uri-template.js new file mode 100644 index 00000000..d66bbf7f --- /dev/null +++ b/web/vendor/foliate-js/uri-template.js @@ -0,0 +1,52 @@ +// URI Template: https://datatracker.ietf.org/doc/html/rfc6570 + +const regex = /{([+#./;?&])?([^}]+?)}/g +const varspecRegex = /(.+?)(\*|:[1-9]\d{0,3})?$/ + +const table = { + undefined: { first: '', sep: ',' }, + '+': { first: '', sep: ',', allowReserved: true }, + '.': { first: '.', sep: '.' }, + '/': { first: '/', sep: '/' }, + ';': { first: ';', sep: ';', named: true, ifemp: '' }, + '?': { first: '?', sep: '&', named: true, ifemp: '=' }, + '&': { first: '&', sep: '&', named: true, ifemp: '=' }, + '#': { first: '&', sep: '&', allowReserved: true }, +} + +// 2.4.1 Prefix Values, "Note that this numbering is in characters, not octets" +const prefix = (maxLength, str) => { + let result = '' + for (const char of str) { + const newResult = char + if (newResult.length > maxLength) return result + else result = newResult + } + return result +} + +export const replace = (str, map) => str.replace(regex, (_, operator, variableList) => { + const { first, sep, named, ifemp, allowReserved } = table[operator] + // TODO: this isn't spec compliant + const encode = allowReserved ? encodeURI : encodeURIComponent + const values = variableList.split(',').map(varspec => { + const match = varspec.match(varspecRegex) + if (!match) return + const [, name, modifier] = match + let value = map.get(name) + if (modifier?.startsWith(':')) { + const maxLength = parseInt(modifier.slice(1)) + value = prefix(maxLength, value) + } + return [name, value ? encode(value) : null] + }) + if (!values.filter(([, value]) => value).length) return '' + return first + values + .map(([name, value]) => value + ? (named ? name + (value ? '=' + value : ifemp) : value) : '') + .filter(x => x).join(sep) +}) + +export const getVariables = str => new Set(Array.from(str.matchAll(regex), + ([,, variableList]) => variableList.split(',') + .map(varspec => varspec.match(varspecRegex)?.[1])).flat()) diff --git a/web/vendor/foliate-js/vendor/fflate.js b/web/vendor/foliate-js/vendor/fflate.js new file mode 100644 index 00000000..f275976a --- /dev/null +++ b/web/vendor/foliate-js/vendor/fflate.js @@ -0,0 +1 @@ +var r=Uint8Array,a=Uint16Array,e=Int32Array,n=new r([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new r([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),t=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),f=function(r,n){for(var i=new a(31),t=0;t<31;++t)i[t]=n+=1<>1|(21845&d)<<1;w=(61680&(w=(52428&w)>>2|(13107&w)<<2))>>4|(3855&w)<<4,c[d]=((65280&w)>>8|(255&w)<<8)>>1}var b=function(r,e,n){for(var i=r.length,t=0,f=new a(e);t>l]=u}else for(o=new a(i),t=0;t>15-r[t]);return o},s=new r(288);for(d=0;d<144;++d)s[d]=8;for(d=144;d<256;++d)s[d]=9;for(d=256;d<280;++d)s[d]=7;for(d=280;d<288;++d)s[d]=8;var h=new r(32);for(d=0;d<32;++d)h[d]=5;var y=b(s,9,1),g=b(h,5,1),p=function(r){for(var a=r[0],e=1;ea&&(a=r[e]);return a},k=function(r,a,e){var n=a/8|0;return(r[n]|r[n+1]<<8)>>(7&a)&e},m=function(r,a){var e=a/8|0;return(r[e]|r[e+1]<<8|r[e+2]<<16)>>(7&a)},x=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],T=function(r,a,e){var n=new Error(a||x[r]);if(n.code=r,Error.captureStackTrace&&Error.captureStackTrace(n,T),!e)throw n;return n},E=function(a,e,f,o){var l=a.length,c=o?o.length:0;if(!l||e.f&&!e.l)return f||new r(0);var d=!f,w=d||2!=e.i,s=e.i;d&&(f=new r(3*l));var h=function(a){var e=f.length;if(a>e){var n=new r(Math.max(2*e,a));n.set(f),f=n}},x=e.f||0,E=e.p||0,z=e.b||0,A=e.l,U=e.d,D=e.m,F=e.n,M=8*l;do{if(!A){x=k(a,E,1);var S=k(a,E+1,3);if(E+=3,!S){var I=a[(N=4+((E+7)/8|0))-4]|a[N-3]<<8,O=N+I;if(O>l){s&&T(0);break}w&&h(z+I),f.set(a.subarray(N,O),z),e.b=z+=I,e.p=E=8*O,e.f=x;continue}if(1==S)A=y,U=g,D=9,F=5;else if(2==S){var j=k(a,E,31)+257,q=k(a,E+10,15)+4,B=j+k(a,E+5,31)+1;E+=14;for(var C=new r(B),G=new r(19),H=0;H>4)<16)C[H++]=N;else{var Q=0,R=0;for(16==N?(R=3+k(a,E,3),E+=2,Q=C[H-1]):17==N?(R=3+k(a,E,7),E+=3):18==N&&(R=11+k(a,E,127),E+=7);R--;)C[H++]=Q}}var V=C.subarray(0,j),W=C.subarray(j);D=p(V),F=p(W),A=b(V,D,1),U=b(W,F,1)}else T(1);if(E>M){s&&T(0);break}}w&&h(z+131072);for(var X=(1<>4;if((E+=15&Q)>M){s&&T(0);break}if(Q||T(2),$<256)f[z++]=$;else{if(256==$){Z=E,A=null;break}var _=$-254;if($>264){var rr=n[H=$-257];_=k(a,E,(1<>4;ar||T(3),E+=15&ar;W=u[er];if(er>3){rr=i[er];W+=m(a,E)&(1<M){s&&T(0);break}w&&h(z+131072);var nr=z+_;if(za.length)&&(n=a.length),new r(a.subarray(e,n))}(f,0,z):f.subarray(0,z)},z=new r(0);function A(r,a){return E(r.subarray((e=r,n=a&&a.dictionary,(8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31)&&T(6,"invalid zlib data"),(e[1]>>5&1)==+!n&&T(6,"invalid zlib data: "+(32&e[1]?"need":"unexpected")+" dictionary"),2+(e[1]>>3&4)),-4),{i:2},a&&a.out,a&&a.dictionary);var e,n}var U="undefined"!=typeof TextDecoder&&new TextDecoder;try{U.decode(z,{stream:!0})}catch(r){}export{A as unzlibSync}; diff --git a/web/vendor/foliate-js/vendor/zip.js b/web/vendor/foliate-js/vendor/zip.js new file mode 100644 index 00000000..a65fd86f --- /dev/null +++ b/web/vendor/foliate-js/vendor/zip.js @@ -0,0 +1 @@ +const e=-2,t=-3,n=-5,i=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],r=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],a=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],s=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],o=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],c=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],u=15;function d(){let e,i,r,a,d,f;function h(e,i,s,o,l,c,h,w,_,b,p){let m,g,y,x,k,v,S,z,A,U,D,E,T,F,O;U=0,k=s;do{r[e[i+U]]++,U++,k--}while(0!==k);if(r[0]==s)return h[0]=-1,w[0]=0,0;for(z=w[0],v=1;v<=u&&0===r[v];v++);for(S=v,zk&&(z=k),w[0]=z,F=1<E+z;){if(x++,E+=z,O=y-E,O=O>z?z:O,(g=1<<(v=S-E))>m+1&&(g-=m+1,T=S,v1440)return t;d[x]=D=b[0],b[0]+=O,0!==x?(f[x]=k,a[0]=v,a[1]=z,v=k>>>E-z,a[2]=D-d[x-1]-v,_.set(a,3*(d[x-1]+v))):h[0]=D}for(a[1]=S-E,U>=s?a[0]=192:p[U]>>E;v>>=1)k^=v;for(k^=v,A=(1<257?(g==t?m.msg="oversubscribed distance tree":g==n?(m.msg="incomplete distance tree",g=t):-4!=g&&(m.msg="empty distance tree with lengths",g=t),g):0)}}d.inflate_trees_fixed=function(e,t,n,i){return e[0]=9,t[0]=5,n[0]=r,i[0]=a,0};function f(){const n=this;let r,a,s,o,l=0,c=0,u=0,d=0,f=0,h=0,w=0,_=0,b=0,p=0;function m(e,n,r,a,s,o,l,c){let u,d,f,h,w,_,b,p,m,g,y,x,k,v,S,z;b=c.next_in_index,p=c.avail_in,w=l.bitb,_=l.bitk,m=l.write,g=m>=d[z+1],_-=d[z+1],16&h){for(h&=15,k=d[z+2]+(w&i[h]),w>>=h,_-=h;_<15;)p--,w|=(255&c.read_byte(b++))<<_,_+=8;for(u=w&x,d=s,f=o,z=3*(f+u),h=d[z];;){if(w>>=d[z+1],_-=d[z+1],16&h){for(h&=15;_>=h,_-=h,g-=k,m>=v)S=m-v,m-S>0&&2>m-S?(l.win[m++]=l.win[S++],l.win[m++]=l.win[S++],k-=2):(l.win.set(l.win.subarray(S,S+2),m),m+=2,S+=2,k-=2);else{S=m-v;do{S+=l.end}while(S<0);if(h=l.end-S,k>h){if(k-=h,m-S>0&&h>m-S)do{l.win[m++]=l.win[S++]}while(0!=--h);else l.win.set(l.win.subarray(S,S+h),m),m+=h,S+=h,h=0;S=0}}if(m-S>0&&k>m-S)do{l.win[m++]=l.win[S++]}while(0!=--k);else l.win.set(l.win.subarray(S,S+k),m),m+=k,S+=k,k=0;break}if(64&h)return c.msg="invalid distance code",k=c.avail_in-p,k=_>>3>3:k,p+=k,b-=k,_-=k<<3,l.bitb=w,l.bitk=_,c.avail_in=p,c.total_in+=b-c.next_in_index,c.next_in_index=b,l.write=m,t;u+=d[z+2],u+=w&i[h],z=3*(f+u),h=d[z]}break}if(64&h)return 32&h?(k=c.avail_in-p,k=_>>3>3:k,p+=k,b-=k,_-=k<<3,l.bitb=w,l.bitk=_,c.avail_in=p,c.total_in+=b-c.next_in_index,c.next_in_index=b,l.write=m,1):(c.msg="invalid literal/length code",k=c.avail_in-p,k=_>>3>3:k,p+=k,b-=k,_-=k<<3,l.bitb=w,l.bitk=_,c.avail_in=p,c.total_in+=b-c.next_in_index,c.next_in_index=b,l.write=m,t);if(u+=d[z+2],u+=w&i[h],z=3*(f+u),0===(h=d[z])){w>>=d[z+1],_-=d[z+1],l.win[m++]=d[z+2],g--;break}}else w>>=d[z+1],_-=d[z+1],l.win[m++]=d[z+2],g--}while(g>=258&&p>=10);return k=c.avail_in-p,k=_>>3>3:k,p+=k,b-=k,_-=k<<3,l.bitb=w,l.bitk=_,c.avail_in=p,c.total_in+=b-c.next_in_index,c.next_in_index=b,l.write=m,0}n.init=function(e,t,n,i,l,c){r=0,w=e,_=t,s=n,b=i,o=l,p=c,a=null},n.proc=function(n,g,y){let x,k,v,S,z,A,U,D=0,E=0,T=0;for(T=g.next_in_index,S=g.avail_in,D=n.bitb,E=n.bitk,z=n.write,A=z=258&&S>=10&&(n.bitb=D,n.bitk=E,g.avail_in=S,g.total_in+=T-g.next_in_index,g.next_in_index=T,n.write=z,y=m(w,_,s,b,o,p,n,g),T=g.next_in_index,S=g.avail_in,D=n.bitb,E=n.bitk,z=n.write,A=z>>=a[k+1],E-=a[k+1],v=a[k],0===v){d=a[k+2],r=6;break}if(16&v){f=15&v,l=a[k+2],r=2;break}if(!(64&v)){u=v,c=k/3+a[k+2];break}if(32&v){r=7;break}return r=9,g.msg="invalid literal/length code",y=t,n.bitb=D,n.bitk=E,g.avail_in=S,g.total_in+=T-g.next_in_index,g.next_in_index=T,n.write=z,n.inflate_flush(g,y);case 2:for(x=f;E>=x,E-=x,u=_,a=o,c=p,r=3;case 3:for(x=u;E>=a[k+1],E-=a[k+1],v=a[k],16&v){f=15&v,h=a[k+2],r=4;break}if(!(64&v)){u=v,c=k/3+a[k+2];break}return r=9,g.msg="invalid distance code",y=t,n.bitb=D,n.bitk=E,g.avail_in=S,g.total_in+=T-g.next_in_index,g.next_in_index=T,n.write=z,n.inflate_flush(g,y);case 4:for(x=f;E>=x,E-=x,r=5;case 5:for(U=z-h;U<0;)U+=n.end;for(;0!==l;){if(0===A&&(z==n.end&&0!==n.read&&(z=0,A=z7&&(E-=8,S++,T--),n.write=z,y=n.inflate_flush(g,y),z=n.write,A=ze.avail_out&&(i=e.avail_out),0!==i&&t==n&&(t=0),e.avail_out-=i,e.total_out+=i,e.next_out.set(s.win.subarray(a,a+i),r),r+=i,a+=i,a==s.end&&(a=0,s.write==s.end&&(s.write=0),i=s.write-a,i>e.avail_out&&(i=e.avail_out),0!==i&&t==n&&(t=0),e.avail_out-=i,e.total_out+=i,e.next_out.set(s.win.subarray(a,a+i),r),r+=i,a+=i),e.next_out_index=r,s.read=a,t},s.proc=function(n,r){let a,f,x,k,v,S,z,A;for(k=n.next_in_index,v=n.avail_in,f=s.bitb,x=s.bitk,S=s.write,z=S>>1){case 0:f>>>=3,x-=3,a=7&x,f>>>=a,x-=a,l=1;break;case 1:U=[],D=[],E=[[]],T=[[]],d.inflate_trees_fixed(U,D,E,T),p.init(U[0],D[0],E[0],0,T[0],0),f>>>=3,x-=3,l=6;break;case 2:f>>>=3,x-=3,l=3;break;case 3:return f>>>=3,x-=3,l=9,n.msg="invalid block type",r=t,s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r)}break;case 1:for(;x<32;){if(0===v)return s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);r=0,v--,f|=(255&n.read_byte(k++))<>>16&65535)!=(65535&f))return l=9,n.msg="invalid stored block lengths",r=t,s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);c=65535&f,f=x=0,l=0!==c?2:0!==m?7:0;break;case 2:if(0===v)return s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);if(0===z&&(S==s.end&&0!==s.read&&(S=0,z=Sv&&(a=v),a>z&&(a=z),s.win.set(n.read_buf(k,a),S),k+=a,v-=a,S+=a,z-=a,0!=(c-=a))break;l=0!==m?7:0;break;case 3:for(;x<14;){if(0===v)return s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);r=0,v--,f|=(255&n.read_byte(k++))<29||(a>>5&31)>29)return l=9,n.msg="too many length or distance symbols",r=t,s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);if(a=258+(31&a)+(a>>5&31),!o||o.length>>=14,x-=14,w=0,l=4;case 4:for(;w<4+(u>>>10);){for(;x<3;){if(0===v)return s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);r=0,v--,f|=(255&n.read_byte(k++))<>>=3,x-=3}for(;w<19;)o[h[w++]]=0;if(_[0]=7,a=y.inflate_trees_bits(o,_,b,g,n),0!=a)return(r=a)==t&&(o=null,l=9),s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);w=0,l=5;case 5:for(;a=u,!(w>=258+(31&a)+(a>>5&31));){let e,c;for(a=_[0];x>>=a,x-=a,o[w++]=c;else{for(A=18==c?7:c-14,e=18==c?11:3;x>>=a,x-=a,e+=f&i[A],f>>>=A,x-=A,A=w,a=u,A+e>258+(31&a)+(a>>5&31)||16==c&&A<1)return o=null,l=9,n.msg="invalid bit length repeat",r=t,s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);c=16==c?o[A-1]:0;do{o[A++]=c}while(0!=--e);w=A}}if(b[0]=-1,F=[],O=[],C=[],W=[],F[0]=9,O[0]=6,a=u,a=y.inflate_trees_dynamic(257+(31&a),1+(a>>5&31),o,F,O,C,W,g,n),0!=a)return a==t&&(o=null,l=9),r=a,s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,s.inflate_flush(n,r);p.init(F[0],O[0],g,C[0],g,W[0]),l=6;case 6:if(s.bitb=f,s.bitk=x,n.avail_in=v,n.total_in+=k-n.next_in_index,n.next_in_index=k,s.write=S,1!=(r=p.proc(s,n,r)))return s.inflate_flush(n,r);if(r=0,p.free(n),k=n.next_in_index,v=n.avail_in,f=s.bitb,x=s.bitk,S=s.write,z=S15?(i.inflateEnd(t),e):(i.wbits=n,t.istate.blocks=new w(t,1<>4)>o.wbits){o.mode=_,i.msg="invalid win size",o.marker=5;break}o.mode=1;case 1:if(0===i.avail_in)return a;if(a=r,i.avail_in--,i.total_in++,s=255&i.read_byte(i.next_in_index++),((o.method<<8)+s)%31!=0){o.mode=_,i.msg="incorrect header check",o.marker=5;break}if(!(32&s)){o.mode=7;break}o.mode=2;case 2:if(0===i.avail_in)return a;a=r,i.avail_in--,i.total_in++,o.need=(255&i.read_byte(i.next_in_index++))<<24&4278190080,o.mode=3;case 3:if(0===i.avail_in)return a;a=r,i.avail_in--,i.total_in++,o.need+=(255&i.read_byte(i.next_in_index++))<<16&16711680,o.mode=4;case 4:if(0===i.avail_in)return a;a=r,i.avail_in--,i.total_in++,o.need+=(255&i.read_byte(i.next_in_index++))<<8&65280,o.mode=5;case 5:return 0===i.avail_in?a:(a=r,i.avail_in--,i.total_in++,o.need+=255&i.read_byte(i.next_in_index++),o.mode=6,2);case 6:return o.mode=_,i.msg="need dictionary",o.marker=0,e;case 7:if(a=o.blocks.proc(i,a),a==t){o.mode=_,o.marker=0;break}if(0==a&&(a=r),1!=a)return a;a=r,o.blocks.reset(i,o.was),o.mode=12;case 12:return i.avail_in=0,1;case _:return t;default:return e}},i.inflateSetDictionary=function(t,n,i){let r=0,a=i;if(!t||!t.istate||6!=t.istate.mode)return e;const s=t.istate;return a>=1<>>1^3988292384:t>>>=1;C[e]=t}class W{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,i=0|e.length;n>>8^C[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class j extends TransformStream{constructor(){let e;const t=new W;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new Uint8Array(4);new DataView(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const M={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],i=M.getPartial(n);return 32===i?e.concat(t):M._shiftRight(t,i,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+M.getPartial(n)},clamp(e,t){if(32*e.length0&&t&&(e[n-1]=M.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>Math.round(e/1099511627776)||32,_shiftRight(e,t,n,i){for(void 0===i&&(i=[]);t>=32;t-=32)i.push(n),n=0;if(0===t)return i.concat(e);for(let r=0;r>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=M.getPartial(r);return i.push(M.partial(t+a&31,t+a>32?n:i.pop(),1)),i}},L={bytes:{fromBits(e){const t=M.bitLength(e)/8,n=new Uint8Array(t);let i;for(let r=0;r>>24,i<<=8;return n},toBits(e){const t=[];let n,i=0;for(n=0;n9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const a=new Uint32Array(n);let s=0;for(let e=t.blockSize+i-(t.blockSize+i&t.blockSize-1);e<=r;e+=t.blockSize)t._block(a.subarray(16*s,16*(s+1))),s+=1;return n.splice(0,16*s),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=M.concat(t,[M.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(Math.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,i){return e<=19?t&n|~t&i:e<=39?t^n^i:e<=59?t&n|t&i|n&i:e<=79?t^n^i:void 0}_S(e,t){return t<>>32-e}_block(e){const t=this,n=t._h,i=Array(80);for(let t=0;t<16;t++)i[t]=e[t];let r=n[0],a=n[1],s=n[2],o=n[3],l=n[4];for(let e=0;e<=79;e++){e>=16&&(i[e]=t._S(1,i[e-3]^i[e-8]^i[e-14]^i[e-16]));const n=t._S(5,r)+t._f(e,a,s,o)+l+i[e]+t._key[Math.floor(e/20)]|0;l=o,o=s,s=t._S(30,a),a=r,r=n}n[0]=n[0]+r|0,n[1]=n[1]+a|0,n[2]=n[2]+s|0,n[3]=n[3]+o|0,n[4]=n[4]+l|0}}},R={aes:class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],i=t._tables[1],r=e.length;let a,s,o,l=1;if(4!==r&&6!==r&&8!==r)throw new Error("invalid aes key size");for(t._key=[s=e.slice(0),o=[]],a=r;a<4*r+28;a++){let e=s[a-1];(a%r==0||8===r&&a%r==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],a%r==0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),s[a]=s[a-r]^e}for(let e=0;a;e++,a--){const t=s[3&e?a:a-4];o[e]=a<=4||e<4?t:i[0][n[t>>>24]]^i[1][n[t>>16&255]]^i[2][n[t>>8&255]]^i[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],i=t[4],r=[],a=[];let s,o,l,c;for(let e=0;e<256;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let u=s=0;!n[u];u^=o||1,s=a[s]||1){let a=s^s<<1^s<<2^s<<3^s<<4;a=a>>8^255&a^99,n[u]=a,i[a]=u,c=r[l=r[o=r[u]]];let d=16843009*c^65537*l^257*o^16843008*u,f=257*r[a]^16843008*a;for(let n=0;n<4;n++)e[n][u]=f=f<<24^f>>>8,t[n][a]=d=d<<24^d>>>8}for(let n=0;n<5;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new Error("invalid aes block size");const n=this._key[t],i=n.length/4-2,r=[0,0,0,0],a=this._tables[t],s=a[0],o=a[1],l=a[2],c=a[3],u=a[4];let d,f,h,w=e[0]^n[0],_=e[t?3:1]^n[1],b=e[2]^n[2],p=e[t?1:3]^n[3],m=4;for(let e=0;e>>24]^o[_>>16&255]^l[b>>8&255]^c[255&p]^n[m],f=s[_>>>24]^o[b>>16&255]^l[p>>8&255]^c[255&w]^n[m+1],h=s[b>>>24]^o[p>>16&255]^l[w>>8&255]^c[255&_]^n[m+2],p=s[p>>>24]^o[w>>16&255]^l[_>>8&255]^c[255&b]^n[m+3],m+=4,w=d,_=f,b=h;for(let e=0;e<4;e++)r[t?3&-e:e]=u[w>>>24]<<24^u[_>>16&255]<<16^u[b>>8&255]<<8^u[255&p]^n[m++],d=w,w=_,_=b,b=p,p=d;return r}}},B={getRandomValues(e){const t=new Uint32Array(e.buffer),n=e=>{let t=987654321;const n=4294967295;return function(){t=36969*(65535&t)+(t>>16)&n;return(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let i,r=0;r>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,i=255&e;255===t?(t=0,255===n?(n=0,255===i?i=0:++i):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=i}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let i;if(!(i=t.length))return[];const r=M.bitLength(t);for(let r=0;rnew N.hmacSha1(L.bytes.toBits(e)),pbkdf2(e,t,n,i){if(n=n||1e4,i<0||n<0)throw new Error("invalid params to pbkdf2");const r=1+(i>>5)<<2;let a,s,o,l,c;const u=new ArrayBuffer(r),d=new DataView(u);let f=0;const h=M;for(t=L.bytes.toBits(t),c=1;f<(r||1);c++){for(a=s=e.encrypt(h.concat(t,[c])),o=1;or&&(e=(new n).update(e).finalize());for(let t=0;tthis.resolveReady=e)),password:be(e,t),signed:n,strength:i-1,pending:new Uint8Array})},async transform(e,t){const n=this,{password:i,strength:a,resolveReady:s,ready:o}=n;i?(await async function(e,t,n,i){const r=await _e(e,t,n,me(i,0,$[t])),a=me(i,$[t]);if(r[0]!=a[0]||r[1]!=a[1])throw new Error(q)}(n,a,i,me(e,0,$[a]+2)),e=me(e,$[a]+2),r?t.error(new Error(K)):s()):await o;const l=new Uint8Array(e.length-te-(e.length-te)%G);t.enqueue(we(n,e,l,0,te,!0))},async flush(e){const{signed:t,ctr:n,hmac:i,pending:r,ready:a}=this;if(i&&n){await a;const s=me(r,0,r.length-te),o=me(r,r.length-te);let l=new Uint8Array;if(s.length){const e=ye(se,s);i.update(e);const t=n.update(e);l=ge(se,t)}if(t){const e=me(ge(se,i.digest()),0,te);for(let t=0;tthis.resolveReady=e)),password:be(e,t),strength:n-1,pending:new Uint8Array})},async transform(e,t){const n=this,{password:i,strength:r,resolveReady:a,ready:s}=n;let o=new Uint8Array;i?(o=await async function(e,t,n){const i=Z(new Uint8Array($[t])),r=await _e(e,t,n,i);return pe(i,r)}(n,r,i),a()):await s;const l=new Uint8Array(o.length+e.length-e.length%G);l.set(o,0),t.enqueue(we(n,e,l,o.length,0))},async flush(e){const{ctr:t,hmac:n,pending:r,ready:a}=this;if(n&&t){await a;let s=new Uint8Array;if(r.length){const e=t.update(ye(se,r));n.update(e),s=ge(se,e)}i.signature=ge(se,n.digest()).slice(0,te),e.enqueue(pe(s,i.signature))}}}),i=this}}function we(e,t,n,i,r,a){const{ctr:s,hmac:o,pending:l}=e,c=t.length-r;let u;for(l.length&&(t=pe(l,t),n=function(e,t){if(t&&t>e.length){const n=e;(e=new Uint8Array(t)).set(n,0)}return e}(n,c-c%G)),u=0;u<=c-G;u+=G){const e=ye(se,me(t,u,u+G));a&&o.update(e);const r=s.update(e);a||o.update(r),n.set(ge(se,r),u+i)}return e.pending=me(t,u),n}async function _e(e,t,n,i){e.password=null;const r=await async function(e,t,n,i,r){if(!ue)return N.importKey(t);try{return await re.importKey(e,t,n,i,r)}catch(e){return ue=!1,N.importKey(t)}}("raw",n,Q,!1,Y),a=await async function(e,t,n){if(!de)return N.pbkdf2(t,e.salt,X.iterations,n);try{return await re.deriveBits(e,t,n)}catch(i){return de=!1,N.pbkdf2(t,e.salt,X.iterations,n)}}(Object.assign({salt:i},X),r,8*(2*ee[t]+2)),s=new Uint8Array(a),o=ye(se,me(s,0,ee[t])),l=ye(se,me(s,ee[t],2*ee[t])),c=me(s,2*ee[t]);return Object.assign(e,{keys:{key:o,authentication:l,passwordVerification:c},ctr:new le(new oe(o),Array.from(ne)),hmac:new ce(l)}),c}function be(e,t){return t===S?function(e){if(typeof TextEncoder==z){e=unescape(encodeURIComponent(e));const t=new Uint8Array(e.length);for(let n=0;n>>24]),r=~e.crcKey2.get(),e.keys=[n,i,r]}function De(e){const t=2|e.keys[2];return Ee(Math.imul(t,1^t)>>>8)}function Ee(e){return 255&e}function Te(e){return 4294967295&e}const Fe="deflate-raw";class Oe extends TransformStream{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:i}){super({});const{compressed:r,encrypted:a,useCompressionStream:s,zipCrypto:o,signed:l,level:c}=e,u=this;let d,f,h=We(super.readable);a&&!o||!l||(d=new j,h=Le(h,d)),r&&(h=Me(h,s,{level:c,chunkSize:t},i,n)),a&&(o?h=Le(h,new ve(e)):(f=new he(e),h=Le(h,f))),je(u,h,(()=>{let e;a&&!o&&(e=f.signature),a&&!o||!l||(e=new DataView(d.value.buffer).getUint32(0)),u.signature=e}))}}class Ce extends TransformStream{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:i}){super({});const{zipCrypto:r,encrypted:a,signed:s,signature:o,compressed:l,useCompressionStream:c}=e;let u,d,f=We(super.readable);a&&(r?f=Le(f,new ke(e)):(d=new fe(e),f=Le(f,d))),l&&(f=Me(f,c,{chunkSize:t},i,n)),a&&!r||!s||(u=new j,f=Le(f,u)),je(this,f,(()=>{if((!a||r)&&s){const e=new DataView(u.value.buffer);if(o!=e.getUint32(0,!1))throw new Error(H)}}))}}function We(e){return Le(e,new TransformStream({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function je(e,t,n){t=Le(t,new TransformStream({flush:n})),Object.defineProperty(e,"readable",{get:()=>t})}function Me(e,t,n,i,r){try{e=Le(e,new(t&&i?i:r)(Fe,n))}catch(i){if(!t)return e;try{e=Le(e,new r(Fe,n))}catch(t){return e}}return e}function Le(e,t){return e.pipeThrough(t)}const Pe="message",Re="start",Be="pull",Ie="data",Ne="close",Ve="inflate";class qe extends TransformStream{constructor(e,t){super({});const n=this,{codecType:i}=e;let r;i.startsWith("deflate")?r=Oe:i.startsWith(Ve)&&(r=Ce);let a=0,s=0;const o=new r(e,t),l=super.readable,c=new TransformStream({transform(e,t){e&&e.length&&(s+=e.length,t.enqueue(e))},flush(){Object.assign(n,{inputSize:s})}}),u=new TransformStream({transform(e,t){e&&e.length&&(a+=e.length,t.enqueue(e))},flush(){const{signature:e}=o;Object.assign(n,{signature:e,outputSize:a,inputSize:s})}});Object.defineProperty(n,"readable",{get:()=>l.pipeThrough(c).pipeThrough(o).pipeThrough(u)})}}class He extends TransformStream{constructor(e){let t;super({transform:function n(i,r){if(t){const e=new Uint8Array(t.length+i.length);e.set(t),e.set(i,t.length),i=e,t=null}i.length>e?(r.enqueue(i.slice(0,e)),n(i.slice(e),r)):t=i},flush(e){t&&t.length&&e.enqueue(t)}})}}let Ke=typeof Worker!=z;class Ze{constructor(e,{readable:t,writable:n},{options:i,config:r,streamOptions:a,useWebWorkers:s,transferStreams:o,scripts:l},c){const{signal:u}=a;return Object.assign(e,{busy:!0,readable:t.pipeThrough(new He(r.chunkSize)).pipeThrough(new Ge(t,a),{signal:u}),writable:n,options:Object.assign({},i),scripts:l,transferStreams:o,terminate:()=>new Promise((t=>{const{worker:n,busy:i}=e;n?(i?e.resolveTerminated=t:(n.terminate(),t()),e.interface=null):t()})),onTaskFinished(){const{resolveTerminated:t}=e;t&&(e.resolveTerminated=null,e.terminated=!0,e.worker.terminate(),t()),e.busy=!1,c(e)}}),(s&&Ke?Xe:Qe)(e,r)}}class Ge extends TransformStream{constructor(e,{onstart:t,onprogress:n,size:i,onend:r}){let a=0;super({async start(){t&&await Je(t,i)},async transform(e,t){a+=e.length,n&&await Je(n,a,i),t.enqueue(e)},async flush(){e.size=a,r&&await Je(r,a)}})}}async function Je(e,...t){try{await e(...t)}catch(e){}}function Qe(e,t){return{run:()=>async function({options:e,readable:t,writable:n,onTaskFinished:i},r){try{const i=new qe(e,r);await t.pipeThrough(i).pipeTo(n,{preventClose:!0,preventAbort:!0});const{signature:a,inputSize:s,outputSize:o}=i;return{signature:a,inputSize:s,outputSize:o}}finally{i()}}(e,t)}}function Xe(e,t){const{baseURL:n,chunkSize:i}=t;if(!e.interface){let r;try{r=function(e,t,n){const i={type:"module"};let r,a;typeof e==A&&(e=e());try{r=new URL(e,t)}catch(t){r=e}if(Ye)try{a=new Worker(r)}catch(e){Ye=!1,a=new Worker(r,i)}else a=new Worker(r,i);return a.addEventListener(Pe,(e=>async function({data:e},t){const{type:n,value:i,messageId:r,result:a,error:s}=e,{reader:o,writer:l,resolveResult:c,rejectResult:u,onTaskFinished:d}=t;try{if(s){const{message:e,stack:t,code:n,name:i}=s,r=new Error(e);Object.assign(r,{stack:t,code:n,name:i}),f(r)}else{if(n==Be){const{value:e,done:n}=await o.read();et({type:Ie,value:e,done:n,messageId:r},t)}n==Ie&&(await l.ready,await l.write(new Uint8Array(i)),et({type:"ack",messageId:r},t)),n==Ne&&f(null,a)}}catch(s){et({type:Ne,messageId:r},t),f(s)}function f(e,t){e?u(e):c(t),l&&l.releaseLock(),d()}}(e,n))),a}(e.scripts[0],n,e)}catch(n){return Ke=!1,Qe(e,t)}Object.assign(e,{worker:r,interface:{run:()=>async function(e,t){let n,i;const r=new Promise(((e,t)=>{n=e,i=t}));Object.assign(e,{reader:null,writer:null,resolveResult:n,rejectResult:i,result:r});const{readable:a,options:s,scripts:o}=e,{writable:l,closed:c}=function(e){let t;const n=new Promise((e=>t=e)),i=new WritableStream({async write(t){const n=e.getWriter();await n.ready,await n.write(t),n.releaseLock()},close(){t()},abort:t=>e.getWriter().abort(t)});return{writable:i,closed:n}}(e.writable),u=et({type:Re,scripts:o.slice(1),options:s,config:t,readable:a,writable:l},e);u||Object.assign(e,{reader:a.getReader(),writer:l.getWriter()});const d=await r;u||await l.getWriter().close();return await c,d}(e,{chunkSize:i})}})}return e.interface}let Ye=!0,$e=!0;function et(e,{worker:t,writer:n,onTaskFinished:i,transferStreams:r}){try{let{value:n,readable:i,writable:a}=e;const s=[];if(n&&(n.byteLength!e.busy));if(n)return at(n),new Ze(n,e,t,w);if(tt.lengthnt.push({resolve:n,stream:e,workerOptions:t})))}()).run();function w(e){if(nt.length){const[{resolve:t,stream:n,workerOptions:i}]=nt.splice(0,1);t(new Ze(e,n,i,w))}else e.worker?(at(e),function(e,t){const{config:n}=t,{terminateWorkerTimeout:i}=n;Number.isFinite(i)&&i>=0&&(e.terminated?e.terminated=!1:e.terminateTimeout=setTimeout((async()=>{tt=tt.filter((t=>t!=e));try{await e.terminate()}catch(e){}}),i))}(e,t)):tt=tt.filter((t=>t!=e))}}function at(e){const{terminateTimeout:t}=e;t&&(clearTimeout(t),e.terminateTimeout=null)}const st=65536,ot="writable";class lt{constructor(){this.size=0}init(){this.initialized=!0}}class ct extends lt{get readable(){const e=this,{chunkSize:t=st}=e,n=new ReadableStream({start(){this.chunkOffset=0},async pull(i){const{offset:r=0,size:a,diskNumberStart:s}=n,{chunkOffset:o}=this;i.enqueue(await pt(e,r+o,Math.min(t,a-o),s)),o+t>a?i.close():this.chunkOffset+=t}});return n}}class ut extends ct{constructor(e){super(),Object.assign(this,{blob:e,size:e.size})}async readUint8Array(e,t){const n=this,i=e+t,r=e||it&&(a=a.slice(e,i)),new Uint8Array(a)}}class dt extends lt{constructor(e){super();const t=new TransformStream,n=[];e&&n.push(["Content-Type",e]),Object.defineProperty(this,ot,{get:()=>t.writable}),this.blob=new Response(t.readable,{headers:n}).blob()}getData(){return this.blob}}class ft extends dt{constructor(e){super(e),Object.assign(this,{encoding:e,utf8:!e||"utf-8"==e.toLowerCase()})}async getData(){const{encoding:e,utf8:t}=this,n=await super.getData();if(n.text&&t)return n.text();{const t=new FileReader;return new Promise(((i,r)=>{Object.assign(t,{onload:({target:e})=>i(e.result),onerror:()=>r(t.error)}),t.readAsText(n,e)}))}}}class ht extends ct{constructor(e){super(),this.readers=e}async init(){const e=this,{readers:t}=e;e.lastDiskNumber=0,e.lastDiskOffset=0,await Promise.all(t.map((async(n,i)=>{await n.init(),i!=t.length-1&&(e.lastDiskOffset+=n.size),e.size+=n.size}))),super.init()}async readUint8Array(e,t,n=0){const i=this,{readers:r}=this;let a,s=n;-1==s&&(s=r.length-1);let o=e;for(;o>=r[s].size;)o-=r[s].size,s++;const l=r[s],c=l.size;if(o+t<=c)a=await pt(l,o,t);else{const r=c-o;a=new Uint8Array(t),a.set(await pt(l,o,r)),a.set(await i.readUint8Array(e+r,t-r,n),r)}return i.lastDiskNumber=Math.max(s,i.lastDiskNumber),a}}class wt extends lt{constructor(e,t=4294967295){super();const n=this;let i,r,a;Object.assign(n,{diskNumber:0,diskOffset:0,size:0,maxSize:t,availableSize:t});const s=new WritableStream({async write(t){const{availableSize:s}=n;if(a)t.length>=s?(await o(t.slice(0,s)),await l(),n.diskOffset+=i.size,n.diskNumber++,a=null,await this.write(t.slice(s))):await o(t);else{const{value:s,done:o}=await e.next();if(o&&!s)throw new Error("Writer iterator completed too soon");i=s,i.size=0,i.maxSize&&(n.maxSize=i.maxSize),n.availableSize=n.maxSize,await _t(i),r=s.writable,a=r.getWriter(),await this.write(t)}},async close(){await a.ready,await l()}});async function o(e){const t=e.length;t&&(await a.ready,await a.write(e),i.size+=t,n.size+=t,n.availableSize-=t)}async function l(){r.size=i.size,await a.close()}Object.defineProperty(n,ot,{get:()=>s})}}async function _t(e,t){if(!e.init||e.initialized)return Promise.resolve();await e.init(t)}function bt(e){return Array.isArray(e)&&(e=new ht(e)),e instanceof ReadableStream&&(e={readable:e}),e}function pt(e,t,n,i){return e.readUint8Array(t,n,i)}const mt="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),gt=256==mt.length;function yt(e,t){return t&&"cp437"==t.trim().toLowerCase()?function(e){if(gt){let t="";for(let n=0;nthis[t]=e[t]))}}const Lt="File format is not recognized",Pt="Zip64 extra field not found",Rt="Compression method not supported",Bt="Split zip file",It="utf-8",Nt="cp437",Vt=[[zt,g],[At,g],[Ut,g],[Dt,y]],qt={[y]:{getValue:tn,bytes:4},[g]:{getValue:nn,bytes:8}};class Ht{constructor(e,t={}){Object.assign(this,{reader:bt(e),options:t,config:T})}async*getEntriesGenerator(e={}){const t=this;let{reader:n}=t;const{config:i}=t;if(await _t(n),n.size!==S&&n.readUint8Array||(n=new ut(await new Response(n.readable).blob()),await _t(n)),n.size=0;e--)if(s[e]==a[0]&&s[e+1]==a[1]&&s[e+2]==a[2]&&s[e+3]==a[3])return{offset:r+e,buffer:s.slice(e,e+i).buffer}}}(n,101010256,n.size,v,1048560);if(!r){throw 134695760==tn(rn(await pt(n,0,4)))?new Error(Bt):new Error("End of central directory not found")}const a=rn(r);let s=tn(a,12),o=tn(a,16);const l=r.offset,c=en(a,20),u=l+v+c;let d=en(a,4);const f=n.lastDiskNumber||0;let h=en(a,6),w=en(a,8),_=0,b=0;if(o==g||s==g||w==y||h==y){const e=rn(await pt(n,r.offset-20,20));if(117853008==tn(e,0)){o=nn(e,8);let t=await pt(n,o,56,-1),i=rn(t);const a=r.offset-20-56;if(tn(i,0)!=k&&o!=a){const e=o;o=a,_=o-e,t=await pt(n,o,56,-1),i=rn(t)}if(tn(i,0)!=k)throw new Error("End of Zip64 central directory locator not found");d==y&&(d=tn(i,16)),h==y&&(h=tn(i,20)),w==y&&(w=nn(i,32)),s==g&&(s=nn(i,40)),o-=s}}if(o>=n.size&&(_=n.size-o-s-v,o=n.size-s-v),f!=d)throw new Error(Bt);if(o<0)throw new Error(Lt);let p=0,m=await pt(n,o,s,h),z=rn(m);if(s){const e=r.offset-s;if(tn(z,p)!=x&&o!=e){const t=o;o=e,_+=o-t,m=await pt(n,o,s,h),z=rn(m)}}const A=r.offset-o-(n.lastDiskOffset||0);if(s!=A&&A>=0&&(s=A,m=await pt(n,o,s,h),z=rn(m)),o<0||o>=n.size)throw new Error(Lt);const U=Qt(t,e,"filenameEncoding"),D=Qt(t,e,"commentEncoding");for(let r=0;ra.getData(e,j,t),p=g;const{onprogress:M}=e;if(M)try{await M(r+1,w,new Mt(a))}catch(e){}yield j}const E=Qt(t,e,"extractPrependedData"),T=Qt(t,e,"extractAppendedData");return E&&(t.prependedData=b>0?await pt(n,0,b):new Uint8Array),t.comment=c?await pt(n,l+v,c):new Uint8Array,T&&(t.appendedData=u>>8&255:d>>>24&255),signature:d,compressed:0!=l&&!g,encrypted:i.encrypted&&!g,useWebWorkers:Qt(i,n,"useWebWorkers"),useCompressionStream:Qt(i,n,"useCompressionStream"),transferStreams:Qt(i,n,"transferStreams"),checkPasswordOnly:D},config:c,streamOptions:{signal:U,size:v,onstart:T,onprogress:F,onend:O}};let W=0;try{({outputSize:W}=await rt({readable:z,writable:E},C))}catch(e){if(!D||e.message!=K)throw e}finally{const e=Qt(i,n,"preventClose");E.size+=W,e||E.locked||await E.getWriter().close()}return D?S:e.getData?e.getData():E}}function Zt(e,t,n){const i=e.rawBitFlag=en(t,n+2),r=!(1&~i),a=tn(t,n+6);Object.assign(e,{encrypted:r,version:en(t,n),bitFlag:{level:(6&i)>>1,dataDescriptor:!(8&~i),languageEncodingFlag:!(2048&~i)},rawLastModDate:a,lastModDate:Xt(a),filenameLength:en(t,n+22),extraFieldLength:en(t,n+24)})}async function Gt(e,t,n,i,r){const{rawExtraField:a}=t,s=t.extraField=new Map,o=rn(new Uint8Array(a));let l=0;try{for(;lt[e]==n));for(let r=0,a=0;r=5&&(a.push(Et),s.push(Tt));let o=1;a.forEach(((n,r)=>{if(e.data.length>=o+4){const a=tn(i,o);t[n]=e[n]=new Date(1e3*a);const l=s[r];e[l]=a}o+=4}))}(_,t,r),t.extraFieldExtendedTimestamp=_);const b=s.get(6534);b&&(t.extraFieldUSDZ=b)}async function Jt(e,t,n,i,r){const a=rn(e.data),s=new W;s.append(r[n]);const o=rn(new Uint8Array(4));o.setUint32(0,s.get(),!0);const l=tn(a,1);Object.assign(e,{version:$t(a,0),[t]:yt(e.data.subarray(5)),valid:!r.bitFlag.languageEncodingFlag&&l==tn(o,0)}),e.valid&&(i[t]=e[t],i[t+"UTF8"]=!0)}function Qt(e,t,n){return t[n]===S?e.options[n]:t[n]}function Xt(e){const t=(4294901760&e)>>16,n=65535&e;try{return new Date(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&n)>>11,(2016&n)>>5,2*(31&n),0)}catch(e){}}function Yt(e){return new Date(Number(e/BigInt(1e4)-BigInt(116444736e5)))}function $t(e,t){return e.getUint8(t)}function en(e,t){return e.getUint16(t,!0)}function tn(e,t){return e.getUint32(t,!0)}function nn(e,t){return Number(e.getBigUint64(t,!0))}function rn(e){return new DataView(e.buffer)}F({Inflate:function(e){const t=new m,i=e&&e.chunkSize?Math.floor(2*e.chunkSize):131072,r=new Uint8Array(i);let a=!1;t.inflateInit(),t.next_out=r,this.append=function(e,s){const o=[];let l,c,u=0,d=0,f=0;if(0!==e.length){t.next_in_index=0,t.next_in=e,t.avail_in=e.length;do{if(t.next_out_index=0,t.avail_out=i,0!==t.avail_in||a||(t.next_in_index=0,a=!0),l=t.inflate(0),a&&l===n){if(0!==t.avail_in)throw new Error("inflating: bad input")}else if(0!==l&&1!==l)throw new Error("inflating: "+t.msg);if((a||1===l)&&t.avail_in===e.length)throw new Error("inflating: bad input");t.next_out_index&&(t.next_out_index===i?o.push(new Uint8Array(r)):o.push(r.subarray(0,t.next_out_index))),f+=t.next_out_index,s&&t.next_in_index>0&&t.next_in_index!=u&&(s(t.next_in_index),u=t.next_in_index)}while(t.avail_in>0||0===t.avail_out);return o.length>1?(c=new Uint8Array(f),o.forEach((function(e){c.set(e,d),d+=e.length}))):c=o[0]?new Uint8Array(o[0]):new Uint8Array,c}},this.flush=function(){t.inflateEnd()}}});export{ut as BlobReader,dt as BlobWriter,ft as TextWriter,Ht as ZipReader,F as configure}; diff --git a/web/vendor/foliate-js/view.js b/web/vendor/foliate-js/view.js new file mode 100644 index 00000000..5fd2b7c3 --- /dev/null +++ b/web/vendor/foliate-js/view.js @@ -0,0 +1,680 @@ +import * as CFI from './epubcfi.js' +import { TOCProgress, SectionProgress, PageProgress } from './progress.js' +import { Overlayer } from './overlayer.js' +import { textWalker } from './text-walker.js' + +const SEARCH_PREFIX = 'foliate-search:' + +const NOTE_PREFIX = 'foliate-note:' + +const isZip = async file => { + const arr = new Uint8Array(await file.slice(0, 4).arrayBuffer()) + return arr[0] === 0x50 && arr[1] === 0x4b && arr[2] === 0x03 && arr[3] === 0x04 +} + +const isPDF = async file => { + const arr = new Uint8Array(await file.slice(0, 5).arrayBuffer()) + return arr[0] === 0x25 + && arr[1] === 0x50 && arr[2] === 0x44 && arr[3] === 0x46 + && arr[4] === 0x2d +} + +const isCBZ = ({ name, type }) => + type === 'application/vnd.comicbook+zip' || name.endsWith('.cbz') + +const isFB2 = ({ name, type }) => + type === 'application/x-fictionbook+xml' || name.endsWith('.fb2') + +const isFBZ = ({ name, type }) => + type === 'application/x-zip-compressed-fb2' + || name.endsWith('.fb2.zip') || name.endsWith('.fbz') + +const makeZipLoader = async file => { + const { configure, ZipReader, BlobReader, TextWriter, BlobWriter } = + await import('./vendor/zip.js') + configure({ useWebWorkers: false }) + const reader = new ZipReader(new BlobReader(file)) + const entries = await reader.getEntries() + const map = new Map(entries.map(entry => [entry.filename, entry])) + const load = f => (name, ...args) => + map.has(name) ? f(map.get(name), ...args) : null + const loadText = load(entry => entry.getData(new TextWriter())) + const loadBlob = load((entry, type) => entry.getData(new BlobWriter(type))) + const getSize = name => map.get(name)?.uncompressedSize ?? 0 + return { entries, loadText, loadBlob, getSize } +} + +const getFileEntries = async entry => entry.isFile ? entry + : (await Promise.all(Array.from( + await new Promise((resolve, reject) => entry.createReader() + .readEntries(entries => resolve(entries), error => reject(error))), + getFileEntries))).flat() + +const makeDirectoryLoader = async entry => { + const entries = await getFileEntries(entry) + const files = await Promise.all( + entries.map(entry => new Promise((resolve, reject) => + entry.file(file => resolve([file, entry.fullPath]), + error => reject(error))))) + const map = new Map(files.map(([file, path]) => + [path.replace(entry.fullPath + '/', ''), file])) + const decoder = new TextDecoder() + const decode = x => x ? decoder.decode(x) : null + const getBuffer = name => map.get(name)?.arrayBuffer() ?? null + const loadText = async name => decode(await getBuffer(name)) + const loadBlob = name => map.get(name) + const getSize = name => map.get(name)?.size ?? 0 + return { loadText, loadBlob, getSize } +} + +export class ResponseError extends Error {} +export class NotFoundError extends Error {} +export class UnsupportedTypeError extends Error {} + +const fetchFile = async url => { + const res = await fetch(url) + if (!res.ok) throw new ResponseError( + `${res.status} ${res.statusText}`, { cause: res }) + return new File([await res.blob()], new URL(res.url).pathname) +} + +export const makeBook = async file => { + if (typeof file === 'string') file = await fetchFile(file) + let book + if (file.isDirectory) { + const loader = await makeDirectoryLoader(file) + const { EPUB } = await import('./epub.js') + book = await new EPUB(loader).init() + } + else if (!file.size) throw new NotFoundError('File not found') + else if (await isZip(file)) { + const loader = await makeZipLoader(file) + if (isCBZ(file)) { + const { makeComicBook } = await import('./comic-book.js') + book = makeComicBook(loader, file) + } + else if (isFBZ(file)) { + const { makeFB2 } = await import('./fb2.js') + const { entries } = loader + const entry = entries.find(entry => entry.filename.endsWith('.fb2')) + const blob = await loader.loadBlob((entry ?? entries[0]).filename) + book = await makeFB2(blob) + } + else { + const { EPUB } = await import('./epub.js') + book = await new EPUB(loader).init() + } + } + else if (await isPDF(file)) { + const { makePDF } = await import('./pdf.js') + book = await makePDF(file) + } + else { + const { isMOBI, MOBI } = await import('./mobi.js') + if (await isMOBI(file)) { + const fflate = await import('./vendor/fflate.js') + book = await new MOBI({ unzlib: fflate.unzlibSync }).open(file) + } + else if (isFB2(file)) { + const { makeFB2 } = await import('./fb2.js') + book = await makeFB2(file) + } + } + if (!book) throw new UnsupportedTypeError('File type not supported') + return book +} + +class CursorAutohider { + #timeout + #el + #check + #state + constructor(el, check, state = {}) { + this.#el = el + this.#check = check + this.#state = state + if (this.#state.hidden) this.hide() + this.#el.addEventListener('mousemove', ({ screenX, screenY }) => { + // check if it actually moved + if (screenX === this.#state.x && screenY === this.#state.y) return + this.#state.x = screenX, this.#state.y = screenY + this.show() + if (this.#timeout) clearTimeout(this.#timeout) + if (check()) this.#timeout = setTimeout(this.hide.bind(this), 1000) + }, false) + } + cloneFor(el) { + return new CursorAutohider(el, this.#check, this.#state) + } + hide() { + this.#el.style.cursor = 'none' + this.#state.hidden = true + } + show() { + this.#el.style.removeProperty('cursor') + this.#state.hidden = false + } +} + +class History extends EventTarget { + #arr = [] + #index = -1 + pushState(x) { + const last = this.#arr[this.#index] + if (last === x || last?.fraction && last.fraction === x.fraction) return + this.#arr[++this.#index] = x + this.#arr.length = this.#index + 1 + this.dispatchEvent(new Event('index-change')) + } + replaceState(x) { + const index = this.#index + this.#arr[index] = x + } + back() { + const index = this.#index + if (index <= 0) return + const detail = { state: this.#arr[index - 1] } + this.#index = index - 1 + this.dispatchEvent(new CustomEvent('popstate', { detail })) + this.dispatchEvent(new Event('index-change')) + } + forward() { + const index = this.#index + if (index >= this.#arr.length - 1) return + const detail = { state: this.#arr[index + 1] } + this.#index = index + 1 + this.dispatchEvent(new CustomEvent('popstate', { detail })) + this.dispatchEvent(new Event('index-change')) + } + get canGoBack() { + return this.#index > 0 + } + get canGoForward() { + return this.#index < this.#arr.length - 1 + } + clear() { + this.#arr = [] + this.#index = -1 + } +} + +const languageInfo = lang => { + if (!lang) return {} + try { + const canonical = Intl.getCanonicalLocales(lang)[0] + const locale = new Intl.Locale(canonical) + const isCJK = ['zh', 'ja', 'kr'].includes(locale.language) + const direction = (locale.getTextInfo?.() ?? locale.textInfo)?.direction + return { canonical, locale, isCJK, direction } + } catch (e) { + console.warn(e) + return {} + } +} + +export class View extends HTMLElement { + #root = this.attachShadow({ mode: 'open' }) + #sectionProgress + #tocProgress + #pageProgress + #cfiProgress + #searchResults = new Map() + #cursorAutohider = new CursorAutohider(this, () => + this.hasAttribute('autohide-cursor')) + isFixedLayout = false + lastLocation + history = new History() + constructor() { + super() + this.history.addEventListener('popstate', ({ detail }) => { + const resolved = this.resolveNavigation(detail.state) + this.renderer.goTo(resolved) + }) + } + async open(book) { + if (typeof book === 'string' + || typeof book.arrayBuffer === 'function' + || book.isDirectory) book = await makeBook(book) + this.book = book + this.language = languageInfo(book.metadata?.language) + + if (book.splitTOCHref && book.getTOCFragment) { + const ids = book.sections.map(s => s.id) + this.#sectionProgress = new SectionProgress(book.sections, 1500, 1600) + const splitHref = book.splitTOCHref.bind(book) + const getFragment = book.getTOCFragment.bind(book) + this.#tocProgress = new TOCProgress() + await this.#tocProgress.init({ + toc: book.toc ?? [], ids, splitHref, getFragment }) + this.#pageProgress = new TOCProgress() + await this.#pageProgress.init({ + toc: book.pageList ?? [], ids, splitHref, getFragment }) + } + this.#cfiProgress = new PageProgress(book, this.resolveNavigation.bind(this)) + + this.isFixedLayout = this.book.rendition?.layout === 'pre-paginated' + if (this.isFixedLayout) { + await import('./fixed-layout.js') + this.renderer = document.createElement('foliate-fxl') + } else { + await import('./paginator.js') + this.renderer = document.createElement('foliate-paginator') + } + this.renderer.setAttribute('exportparts', 'head,foot,filter,container') + this.renderer.addEventListener('load', e => this.#onLoad(e.detail)) + this.renderer.addEventListener('relocate', e => this.#onRelocate(e.detail)) + this.renderer.addEventListener('create-overlayer', e => + e.detail.attach(this.#createOverlayer(e.detail))) + this.renderer.open(book) + this.#root.append(this.renderer) + + if (book.sections.some(section => section.mediaOverlay)) { + const activeClass = book.media.activeClass + const playbackActiveClass = book.media.playbackActiveClass + this.mediaOverlay = book.getMediaOverlay() + let lastActive + this.mediaOverlay.addEventListener('highlight', e => { + const resolved = this.resolveNavigation(e.detail.text) + this.renderer.goTo(resolved) + .then(() => { + const { doc } = this.renderer.getContents() + .find(x => x.index = resolved.index) + const el = resolved.anchor(doc) + el.classList.add(activeClass) + if (playbackActiveClass) el.ownerDocument + .documentElement.classList.add(playbackActiveClass) + lastActive = new WeakRef(el) + }) + }) + this.mediaOverlay.addEventListener('unhighlight', () => { + const el = lastActive?.deref() + if (el) { + el.classList.remove(activeClass) + if (playbackActiveClass) el.ownerDocument + .documentElement.classList.remove(playbackActiveClass) + } + }) + } + } + close() { + this.renderer?.destroy() + this.renderer?.remove() + this.#sectionProgress = null + this.#tocProgress = null + this.#pageProgress = null + this.#cfiProgress = null + this.#searchResults = new Map() + this.lastLocation = null + this.history.clear() + this.tts = null + this.mediaOverlay = null + } + goToTextStart() { + return this.goTo(this.book.landmarks + ?.find(m => m.type.includes('bodymatter') || m.type.includes('text')) + ?.href ?? this.book.sections.findIndex(s => s.linear !== 'no')) + } + async init({ lastLocation, showTextStart }) { + const resolved = lastLocation ? this.resolveNavigation(lastLocation) : null + if (resolved) { + await this.renderer.goTo(resolved) + this.history.pushState(lastLocation) + } + else if (showTextStart) await this.goToTextStart() + else { + this.history.pushState(0) + await this.next() + } + } + #emit(name, detail, cancelable) { + return this.dispatchEvent(new CustomEvent(name, { detail, cancelable })) + } + #onRelocate({ reason, range, index, fraction, size }) { + const progress = this.#sectionProgress?.getProgress(index, fraction, size) ?? {} + const tocItem = this.#tocProgress?.getProgress(index, range) + const pageItem = this.#pageProgress?.getProgress(index, range) + const cfi = this.getCFI(index, range) + this.lastLocation = { ...progress, tocItem, pageItem, cfi, range } + if (reason === 'snap' || reason === 'page' || reason === 'scroll') + this.history.replaceState(cfi) + this.#emit('relocate', this.lastLocation) + } + #onLoad({ doc, index }) { + // set language and dir if not already set + doc.documentElement.lang ||= this.language.canonical ?? '' + if (!this.language.isCJK) + doc.documentElement.dir ||= this.language.direction ?? '' + + this.#handleLinks(doc, index) + this.#cursorAutohider.cloneFor(doc.documentElement) + + this.#emit('load', { doc, index }) + } + #handleLinks(doc, index) { + const { book } = this + const section = book.sections[index] + doc.addEventListener('click', e => { + const a = e.target.closest('a[href]') + if (!a) return + e.preventDefault() + const href_ = a.getAttribute('href') + const href = section?.resolveHref?.(href_) ?? href_ + if (book?.isExternal?.(href)) + Promise.resolve(this.#emit('external-link', { a, href }, true)) + .then(x => x ? globalThis.open(href, '_blank') : null) + .catch(e => console.error(e)) + else { + let internalHref = href + if (!book.resolveHref(href)) { + const hashIndex = href_.indexOf('#') + if (hashIndex >= 0) { + const hash = href_.slice(hashIndex) + internalHref = section?.resolveHref?.(hash) ?? href + } + } + Promise.resolve(this.#emit('link', { a, href: internalHref }, true)) + .then(x => x ? this.goTo(internalHref) : null) + .catch(e => console.error(e)) + } + }) + } + async addAnnotation(annotation, remove) { + const { value } = annotation + if (value.startsWith(SEARCH_PREFIX)) { + const cfi = value.replace(SEARCH_PREFIX, '') + const { index, anchor } = await this.resolveNavigation(cfi) + const obj = this.#getOverlayer(index) + if (obj) { + const { overlayer, doc } = obj + if (remove) { + overlayer.remove(value) + return + } + const range = doc ? anchor(doc) : anchor + if (range) overlayer.add(value, range, Overlayer.outline) + } + return + } else if (value.startsWith(NOTE_PREFIX)) { + const cfi = value.replace(NOTE_PREFIX, '') + const { index, anchor } = await this.resolveNavigation(cfi) + const obj = this.#getOverlayer(index) + if (obj) { + const { overlayer, doc } = obj + if (remove) { + overlayer.remove(value) + return + } + const range = doc ? anchor(doc) : anchor + if (range) { + const draw = (func, opts) => overlayer.add(value, range, func, opts) + this.#emit('draw-annotation', { draw, annotation, doc, range }) + } + } + return + } + const { index, anchor } = await this.resolveNavigation(value) + const obj = this.#getOverlayer(index) + if (obj) { + const { overlayer, doc } = obj + overlayer.remove(value) + if (!remove) { + const range = doc ? anchor(doc) : anchor + if (range) { + const draw = (func, opts) => overlayer.add(value, range, func, opts) + this.#emit('draw-annotation', { draw, annotation, doc, range }) + } + } + } + const label = this.#tocProgress?.getProgress(index)?.label ?? '' + return { index, label } + } + deleteAnnotation(annotation) { + return this.addAnnotation(annotation, true) + } + #getOverlayer(index) { + return this.renderer.getContents() + .find(x => x.index === index && x.overlayer) + } + #createOverlayer({ doc, index }) { + const overlayer = new Overlayer(doc) + doc.addEventListener('click', e => { + const [value, range, rect] = overlayer.hitTest(e) + if (value && !value.startsWith(SEARCH_PREFIX)) { + this.#emit('show-annotation', { value, index, range, rect }) + } + }, false) + + let lastHitTestTime = 0 + const THROTTLE_MS = 200 + const isAndroid = /Android/i.test(navigator.userAgent) + + doc.addEventListener('mousemove', (e) => { + if (isAndroid) return + const now = performance.now() + if (now - lastHitTestTime < THROTTLE_MS) return + lastHitTestTime = now + const [value] = overlayer.hitTest(e) + if (value && !value.startsWith(SEARCH_PREFIX)) { + doc.body.style.cursor = 'pointer' + } else { + doc.body.style.cursor = '' + } + }) + + const list = this.#searchResults.get(index) + if (list) for (const item of list) this.addAnnotation(item) + + this.#emit('create-overlay', { index }) + return overlayer + } + async showAnnotation(annotation) { + const { value } = annotation + const resolved = await this.goTo(value) + if (resolved) { + const { index, anchor } = resolved + const { doc } = this.#getOverlayer(index) + const range = anchor(doc) + this.#emit('show-annotation', { value, index, range }) + } + } + getCFI(index, range) { + const baseCFI = this.book.sections[index].cfi ?? CFI.fake.fromIndex(index) + if (!range) return baseCFI + return CFI.joinIndir(baseCFI, CFI.fromRange(range)) + } + resolveCFI(cfi) { + if (this.book.resolveCFI) + return this.book.resolveCFI(cfi) + else { + const parts = CFI.parse(cfi) + const index = CFI.fake.toIndex((parts.parent ?? parts).shift()) + const anchor = doc => CFI.toRange(doc, parts) + return { index, anchor } + } + } + resolveNavigation(target) { + try { + if (typeof target === 'number') return { index: target } + if (typeof target.fraction === 'number') { + const [index, anchor] = this.#sectionProgress.getSection(target.fraction) + return { index, anchor } + } + if (CFI.isCFI.test(target)) return this.resolveCFI(target) + return this.book.resolveHref(target) + } catch (e) { + console.error(e) + console.error(`Could not resolve target ${target}`) + } + } + async goTo(target) { + const resolved = this.resolveNavigation(target) + try { + await this.renderer.goTo(resolved) + this.history.pushState(target) + return resolved + } catch(e) { + console.error(e) + console.error(`Could not go to ${target}`) + } + } + async goToFraction(frac) { + const [index, anchor] = this.#sectionProgress.getSection(frac) + await this.renderer.goTo({ index, anchor }) + this.history.pushState({ fraction: frac }) + } + async select(target) { + try { + const obj = await this.resolveNavigation(target) + await this.renderer.goTo({ ...obj, select: true }) + this.history.pushState(target) + } catch(e) { + console.error(e) + console.error(`Could not go to ${target}`) + } + } + deselect() { + for (const { doc } of this.renderer.getContents()) + doc.defaultView.getSelection().removeAllRanges() + } + getSectionFractions() { + return (this.#sectionProgress?.sectionFractions ?? []) + .map(x => x + Number.EPSILON) + } + getProgressOf(index, range) { + const tocItem = this.#tocProgress?.getProgress(index, range) + const pageItem = this.#pageProgress?.getProgress(index, range) + return { tocItem, pageItem } + } + async getCFIProgress(cfi) { + const progress = await this.#cfiProgress?.getProgress(cfi) + if (!progress || progress.index === -1) return null + return this.#sectionProgress?.getProgress(progress.index, progress.fraction) + } + async getTOCItemOf(target) { + try { + const { index, anchor } = await this.resolveNavigation(target) + const doc = await this.book.sections[index].createDocument() + const frag = anchor(doc) + const isRange = frag instanceof Range + const range = isRange ? frag : doc.createRange() + if (!isRange) range.selectNodeContents(frag) + return this.#tocProgress?.getProgress(index, range) + } catch(e) { + console.error(e) + console.error(`Could not get ${target}`) + } + } + async prev(distance) { + await this.renderer.prev(distance) + } + async next(distance) { + await this.renderer.next(distance) + } + async pan(dx, dy) { + await this.renderer.pan(dx, dy) + } + isOverflowX() { + return this.renderer.isOverflowX + } + isOverflowY() { + return this.renderer.isOverflowY + } + goLeft() { + return this.book.dir === 'rtl' ? this.next() : this.prev() + } + goRight() { + return this.book.dir === 'rtl' ? this.prev() : this.next() + } + async * #searchSection(matcher, query, index) { + const doc = await this.book.sections[index].createDocument() + for (const { range, excerpt } of matcher(doc, query)) + yield { cfi: this.getCFI(index, range), excerpt } + } + async * #searchBook(matcher, query) { + const { sections } = this.book + for (const [index, { createDocument }] of sections.entries()) { + if (!createDocument) continue + const doc = await createDocument() + const subitems = Array.from(matcher(doc, query), ({ range, excerpt }) => + ({ cfi: this.getCFI(index, range), excerpt })) + const progress = (index + 1) / sections.length + yield { progress } + if (subitems.length) yield { index, subitems } + } + } + async * search(opts) { + this.clearSearch() + const { searchMatcher } = await import('./search.js') + const { sections } = this.book + const { query, index, results } = opts + const matcher = searchMatcher(textWalker, + { defaultLocale: this.language, ...opts }) + + const iter = results?.length + ? (async function* () { + for (const result of results) { + if (result.subitems) { + const progress = (result.index + 1) / sections.length + yield { progress } + yield { index: result.index, subitems: result.subitems } + } else { + yield { cfi: result.cfi, excerpt: result.excerpt } + } + } + })() + : index != null + ? this.#searchSection(matcher, query, index) + : this.#searchBook(matcher, query) + + const list = [] + this.#searchResults.set(index, list) + + for await (const result of iter) { + if (result.subitems){ + const list = result.subitems + .map(({ cfi }) => ({ value: SEARCH_PREFIX + cfi })) + this.#searchResults.set(result.index, list) + for (const item of list) this.addAnnotation(item) + yield { + index: result.index, + label: this.#tocProgress?.getProgress(result.index)?.label ?? '', + subitems: result.subitems, + } + } + else { + if (result.cfi) { + const item = { value: SEARCH_PREFIX + result.cfi } + list.push(item) + this.addAnnotation(item) + } + yield result + } + } + yield 'done' + } + clearSearch() { + for (const list of this.#searchResults.values()) + for (const item of list) this.deleteAnnotation(item) + this.#searchResults.clear() + } + async initTTS(granularity = 'word', nodeFilter, highlighter) { + const contents = this.renderer.getContents() + const primaryIndex = this.renderer.primaryIndex + const primary = contents.find(x => x.index === primaryIndex) ?? contents[0] + const doc = primary?.doc + if (!doc) return + if (this.tts && this.tts.doc === doc) return + const { TTS } = await import('./tts.js') + this.tts = new TTS(doc, textWalker, nodeFilter, highlighter || (range => + this.renderer.scrollToAnchor(range, true)), granularity) + } + startMediaOverlay() { + const contents = this.renderer.getContents() + const primaryIndex = this.renderer.primaryIndex + const primary = contents.find(x => x.index === primaryIndex) ?? contents[0] + const { index } = primary ?? {} + return this.mediaOverlay.start(index) + } +} + +customElements.define('foliate-view', View) diff --git a/web/vite.config.ts b/web/vite.config.ts index 0c74de36..d61c1bd8 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -17,6 +17,7 @@ export default defineConfig(({ mode }) => { resolve: { alias: { "@": path.resolve(__dirname, "./src"), + "@pdfjs": path.resolve(__dirname, "./public/vendor/pdfjs"), }, }, server: {

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 HCn^B|5mdQJ literal 0 HcmV?d00001 diff --git a/web/public/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap b/web/public/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ad14662e25e7a4e3bd7f543c126ac24417bc3665 GIT binary patch literal 160 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